LoginSignup
27
11

More than 3 years have passed since last update.

Vim の <Plug> ってなんだ?

Last updated at Posted at 2020-05-04

<Plug> は、「このプラグインの関数は、外部から使ってもいいよ。このプラグインの関数は、~/.vimrc の中で nmap とかを使ってコマンドとして割り当ててもいいよ。」と、言うのを明示するために使うらしいです。

以下の記事からキッカケが掴めました。

例えば...

Step 1.

coc.nvim と言う Vim のプラグインをインストールしていたとします。以下のような設定を ~/.vimrc にいれると、ノーマルモードで gd と打つと <Plug>(coc-definition) に置き換えられます。ちなみに、定義ジャンプしてくれます。

~/.vimrc
nmap <silent> gd <Plug>(coc-definition)

Step 2.

では <Plug>(coc-definition) と言うキーマッピングは、どこで定義されているのでしょうか?検索してみると CocActionAsync('jumpDefinition') と言う関数を呼び出していることがわかります。

nnoremap <Plug>(coc-definition) :<C-u>call CocActionAsync('jumpDefinition')<CR>

Step 3.

まとめると <silent> gd と打つと CocActionAsync('jumpDefinition') が呼び出されています。

<silent> gd

  |
  v

<Plug>(coc-definition)

  |
  v

:<C-u>call CocActionAsync('jumpDefinition')

補足

◯ 公式ドキュメント

公式の説明は、以下の通りになります。これだけだと、正直厳しい...orz

:help <Plug>
                                                         *<Plug>*
特別なキーの名前 "<Plug>" は、内部のマッピングのために使われルことがあります、
"<Plug>" は、如何なるキーの組み合わせとも合致しません。
これはプラグインにおいて便利です |using-<Plug>|
The special key name "<Plug>" can be used for an internal mapping,
which is not to be matched with any key sequence.
This is useful in plugins |using-<Plug>|.

<C-u> ってなんだ?

:<C-u>call CocActionAsync('jumpDefinition')<CR> とありました。 :call CocActionAsync('jumpDefinition')<CR> ではダメなのでしょうか?

Vim のコマンドラインモードにおいてカーソルの位置から先頭まで、削除してくれるそうです。

:help c_CTRL-U
                                                c_CTRL-U
CTRL-U  Remove all characters between the cursor position and
        the beginning of the line.  Previous versions of vim
        deleted all characters on the line.  If that is the
        preferred behavior, add the following to your .vimrc: >
                :cnoremap <C-U> <C-E><C-U>

例えば、範囲を選択している状態でコマンドラインモードに映ると以下のように表示されます。

:'<,'>

<C-u> を打つことでこれを消すことができます。

:

◯ なんで nmap なの?

大抵の場合 ~/.vimrc には noremap が選択されています。なんで <Plug> にキーマッピングする場合は noremap ではなく nmap なのでしょうか?

~/.vimrc
nmap <silent> gd <Plug>(coc-definition)

Reddit の方には idk, I don't know, わからんけど nmap じゃないと動かないと書かれていたのですが...

(idk why noremap doesn't work),

以下の記事に理由が書かれていました。詳細はリンク先をご参照ください。

noremapは「再マップしない」ので、「素のVim」のキーマッピングで <Plug>(say_hello) に対応するものを探してしまう。 が、そんなものは定義されているはずもなく、何も実行されない。

以上になります。ありがとうございました。

27
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
11