カウントで始まるマッピングをn回繰り返します


7

次のマッピングを作成しました。

:map <F8> 3w

を押す2<F8>と6単語移動すると思いましたが(2*3w)23単語移動しました。(これはvimエディターのヘルプセクションで言及されています)

23の代わりに6移動するようにマップする方法は?また、この機能が意図的にマッピング用にこのように機能するように作成されているかどうかをお知らせください。

(他のすべての場合において、それは次のように、23の2×3の代わりに広告のような簡単である2d3wと同じで6dw、同様d6w

回答:


5

別の解決策は、v:countこのような変数を使用することです:

nnoremap <F8> :<C-u>execute "normal! " . v:count1 * 3 . "w"<CR>

参照:h v:count:変数には、最後の通常モードコマンドに指定されたカウントが含まれているため、マッピング前にカウントを取得するために使用できます。

ここでマッピングはv:count1whichを使用してv:countいますが、カウントが指定されていない場合はデフォルトでゼロに設定されます。

マッピングは、通常のコマンドを実行したマッピングの前に与えられた3回のカウントに置き換えられています。normal! XwX

<C-U>入力するときに含まれます行の範囲除去することが必要とされる:数の後に。


もちろんもちろん、観察した動作は完全に正常です。マッピングにより、Vimの前に何かを入力F8した3wときのように、乗算を実行することを理解できないため、Vimが理解します。あなたが彼らにそれについて説明しないと、プログラムはあなたの意図を理解できないことに注意してください。


8

これには式レジスターを使用できます。

 :nnoremap <F8>  @='3w'<CR>

これは、式レジスタを使用して、番号を前に付けることができる繰り返し可能なマッピングを作成します。

 2<F8> will move 6 words

vimでのマッピングは、押されたキー/キーのシーケンスの意味を置き換えます。だからあなたがするとき

:map <F8> 3w

そして

2<F8>
23w

Vimは変換されます<F8>3w、あなたが何であるかを実行します23w

反対に、式レジスタを使用すると、最終的に次のようになります。

 2<F8>
 2@='3w'<CR>

つまり、「2回、式レジスタの内容を実行する」ということです。

それが意図的に行われたかどうかについての私の推測は、マッピングの意味を考えると、それは実行すべき論理的な方法であるということです。


これが意図的に行われたかどうかをお知らせください。
SibiCoder 2016年

回答を更新しました。
nobe4


ノーマルモードマッピングは範囲で機能するため、非常に堅牢ではありません。ファイルの最終行でマッピングをカウントに指定すると、エラーメッセージが表示されますE16: Invalid range
jdhao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.