質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

2回答

1843閲覧

<Plug>括弧で囲む理由が知りたい

norio13

総合スコア53

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

1グッド

0クリップ

投稿2016/12/02 04:07

環境

  • Debian jessie
  • vim 8.0.118

Googleでサンプルコードを検索すると、ほとんどが<Plug>(Sample)のように括弧で囲っていました。
sample1.vimのように括弧で囲わない書き方をすると、<space>aを押してから約1秒後に1と出力されます。
括弧で囲わない場合は実行されるまで時間がかかりました。
括弧で囲む理由が知りたいのですがヘルプのどこを確認したらいいのでしょうか?

遅くなるサンプル
vim -Nu NONE -S sample1.vim

vim

1" sample1.vim 2nnoremap <Plug>Sample :<C-u>echo 1<CR> 3nnoremap <Plug>Sample2 :<C-u>echo 2<CR> 4nmap <space>a <Plug>Sample 5nmap <space>b <Plug>Sample2

遅くないサンプル
vim -Nu NONE -S sample2.vim

vim

1" sample2.vim 2nnoremap <Plug>(Sample) :<C-u>echo 1<CR> 3nnoremap <Plug>(Sample2) :<C-u>echo 2<CR> 4nmap <space>a <Plug>(Sample) 5nmap <space>b <Plug>(Sample2)
thinca👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まず <Plug>Sample が遅くなるのは入力 <Plug>Sample に前方一致するキーマッピングが二つ、すなわち

  • <Plug>Sample
  • <Plug>Sample2

が存在するためユーザーが続けて 2 を入力するかどうかオプション 'timeoutlen の時間だけ待っているためです。括弧で囲んだ場合には <Plug>(Sample) に前方一致するものは(おそらく)ないために問題を回避できます。例えば

nnoremap <Plug>(Sample)2 :<C-u>echo 2<CR>

と定義すると同じ問題が発生するのが確認できるでしょう。


括弧で囲むのは必須ではありませんが、このような問題があるために良い習慣として認識されているみたいです。上の問題のほかにもユーザーが <Plug>Sample を実行した後に次の行へ移る (j) キーマッピングを vimrc で定義したい場合、

nmap <Space>c <Plug>Samplej

だとどこまでがプラグインによるキーマッピングなのかが分かりにくいですが、

nmap <Space>c <Plug>(Sample)j

だと <Plug>(Sample) が一つの塊であることが一目瞭然ですね。私は確か Vim: Key mappingを極める - while (“im automaton”); を読んで参考にした気がします。

投稿2016/12/02 04:46

machakann

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norio13

2016/12/02 08:32

理解がよりいっそう深まりました。 ありがとうございます。
guest

0

ベストアンサー

質問内容にあるような結果になる理由については、詳しくは :help map-typing 周辺に書かれています。

簡単に説明すると、キーマッピング <Plug>Sample<Plug>Sample2 が存在する場合、<Plug>Sample まで入力された場合、Vim はどちらのキーマッピングを展開するべきか、このタイミングでは判断できません。次の文字が入力されて、それが 2 かそうでないかによって、初めてキーマッピングが展開できます。また、入力が一定時間なかった場合もタイムアウトが発生し、前者であると確定してキーマッピングが展開されます。

本題の <Plug> に続くキーマッピングを () で囲む理由ですが、1 つは上記の問題を明確に回避するためです。

また、別の理由として見やすさがあります。
例えば標準の n を拡張する <Plug>improve-n があったとして、ユーザーはこの n のあとに zz を加えたいとします。この時、<Plug>improve-nzz<Plug>(improve-n)zz では、後者のほうが圧倒的に見やすいかと思います。

() である理由([]{} ではない理由)は特になく、習慣的なものと言えます。

投稿2016/12/02 04:38

thinca

総合スコア1864

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norio13

2016/12/02 08:30

括弧の必要性が分かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問