Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

coc.nvim の拡張機能である coc-pairs で改行時にカーソル位置を望む場所にもってくる方法

$
0
0

TL;DR

coc-pairsで改行時にカーソル位置を(大半のエンジニアが)望む位置にもってくるためには、.vimrc等の設定ファイルに以下の記述をした上で、

.vimrc
inoremap <silent><expr><cr> pumvisible() ? coc#_select_confirm():"\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

Vim上で :CocConfigを実行して開く coc-settings.jsonに以下の設定を書けばOKです。

coc-settings.json
{//前略"coc.preferences.formatOnType":true}

↓設定後↓

Dec-31-2019 22-47-06.gif

"coc.preferences.formatOnType": trueに関しては、自分の手元の環境では設定しないでも意図した挙動になりましたが、help や issue を見る限り trueにすることが前提のような気がするので、一応書いておきました)

coc-pairsのいいところ

Vimmerのみなさん、こんばんは。
LSP (Language Server Protocol) の Vim 向けクライアント実装はいくつか種類がありますが、自分は
neoclide/coc.nvim
を使用しています。

キャッチコピーに Make your Vim/Neovim as smart as VSCode.とあることからわかるように、VSCodeのような開発体験を提供してくれます。
VSCodeとVimを併用している僕のようなエンジニアにぴったりなプラグインです。

さて、この coc.nvimは extension という単位で様々な言語のLSPサーバーなどをインストールすることができます。
その extension の中に coc-pairsがあり、これは ()とか {}とか []とかをよしなに補完してくれるというものです。
jiangmiao/auto-pairsのようなプラグイン、といえば分かりやすいかと思います。

coc-pairsは、LSP を活かした実装になっているのか、先行のプラグインよりもスマートな補完をしてくれます。

あまりいい例が思い浮かばなかったのですが、例えば以下のようなコードがあるときを考えます。

スクリーンショット 2019-12-31 22.12.12.png

ここで increment(10)doubleで包んで、以下のようにしたいという状況になったとします。

leta=double(increment(10));

やり方は人それぞれかと思いますが、自分の場合は以下のようにキーを打ちます。

  1. 画像のカーソルの位置から double(と入力
  2. ノーマルモードに戻る
  3. f;で文末に移動
  4. インサートモードに入って )を入力

ここで、カッコ補完プラグインとして jiangmiao/auto-pairsを使用していた場合、手順1で左カッコを入力したときに、右カッコ )が自動で入力されてしまいます。
この右カッコを削除する、という手順が余分に発生することになります。

一方、coc-pairsでは、右カッコの補完がされません。このような感じになります。↓

Dec-31-2019 22-24-44.gif

もちろん、補完が欲しい!と思う場面ではちゃんと補完してくれます。
賢い!👍

coc-pairsの不満

しかし、 coc-pairsに不満が1つありました。
以下のように、hogeという関数を作ろうとしていて、カーソルが |の場所にあるとします。

fnhoge(){|}// <- カーソル

ここで改行をします。するとこうなります。

fnhoge(){|}// <- カーソル

これは嬉しくないです。こうなってほしいですよね(jiangmiao/auto-pairsだと↓のようになってくれます)

fnhoge(){|// <- カーソル}

解決方法

coc-pairsの README になんとなく解決方法っぽいものは書いてあったのですが、
<CR>の体験を良くするためには、 coc#on_enter()のヘルプ見てね」
としか書いていなかったので、issue を確認したところ解決方法が書いてありました。

まず Vim の設定ファイルに以下の記述を追加します。

inoremap <silent><expr><cr> pumvisible() ? coc#_select_confirm():"\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

これにより <CR>を押したときに coc#on_enter()が実行されるようになり、coc.nvimが「<CR>が押されたぞ!」と認識できるようになります。

そして、:CocConfigを実行すると開く coc-settings.jsonに以下を追加します。

coc-settings.json
{//前略"coc.preferences.formatOnType":true}

以上で、改行されたときにいい感じの場所にカーソルをもってきてくれるようになりました。🎉
Dec-31-2019 22-47-06.gif

References


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>