VIM 番号付け動作の不一致

VIM 番号付け動作の不一致

VIM のコマンドには先頭に数字を付けることができますが、一部の操作では番号付け方式が一貫していません。

左、下、上、右 (H、J、K、L) の移動コマンドの前に数字を付けると、カーソルが期待される場所にジャンプします。たとえば、 は1L1 文字右に移動します。

現在の行は または を使用して上または下に移動できます:m+Nが、の逆の効果を得るには を:m-N使用する必要があります。:m-2:m+1

私は Visual Studio 2019 でも VSVim を使用しており、タブを切り替えるためにコマンドgtとコマンドを使用しています。3 つのタブが開いていて、現在最初のタブ (一番左) にいる場合、 を使用すると 3 番目のタブに切り替わります。3 番目のタブ (一番右) にいる場合は、 を使用すると最初のタブに戻り、 を使用すると同じタブに留まります。gT3gt2gT3gT

反対の効果を得るために、なぜ異なる数字を使用する必要があるのでしょうか? これは、変更されなかった設計上の欠陥なのでしょうか?

答え1

そこに矛盾があるというあなたの観察は正確です。

{count}アクションを繰り返すために最もよく使用されますが、常にそうであるとは限りません。絶対数として解釈される場合もあります。たとえば、47G行 47 に移動したり、35|現在の行の列 35 に移動したり、90%ファイルの 90% の行に移動したりする場合などです。

時には、同じコマンドの異なるフレーバーをフラグ付けするために使用されます。たとえば、はCTRL-G現在のバッファで開かれたファイルに関する情報を出力します。1 CTRL-Gはその情報を出力しますが、ファイルへのフルパスを表示します。2 CTRL-G(またはより大きなカウント数) は同じものを出力し、出力にバッファ番号も含めます。(:help CTRL-G詳細については。)

具体的な例を挙げると、

左、下、上、右 ( ) の移動コマンドの前hjklに数字を付けると、カーソルが期待される場所にジャンプします。たとえば、1lは 1 文字右に移動します。

{count}これは、コマンドの繰り返しとしてのの典型的な使用法です。

現在の行は または を使用して上または下に移動できます:m +Nが、の逆の効果を得るには を:m -N使用する必要があります。:m -2:m +1

まず、これは実際には ではなく です{count}{address}これは実際には一貫しています(一見奇妙に思えるかもしれませんが)。:mコマンドは現在の行を移動します。下にアドレスで指定された行。

47行目にいる場合、次の行の下に移動させるには を使用します。現在の行が移動されたので、以前は48だった行は47になり、現在の行は48になります:m 48。元の位置に戻したい場合は、 が必要です。:m 46下にアドレスのある行は、+1単に 48 へのショートカット (47 行目から始まる) であり、-246 の省略形 (現在は 48 行目) です。意味がわかりますか?

もしVimが行を移動することに決めたらその上アドレスがアドレスの前にある場合、などのコマンドの動作は、:m 46現在の行がその上にあるか下にあるかによって異なり、これはあまり良いことではありません。そのため、Vim はこの要素の一貫性がより重要であると判断しました。

タブを切り替えるには、gt コマンドと gT コマンドを使用しています。3 つのタブを開いていて、現在最初のタブ (一番左) にいる場合、3gt を使用すると 3 番目のタブに切り替わります。3 番目のタブ (一番右) にいる場合、2gT を使用すると最初のタブに戻りますが、3gT を使用すると同じタブに留まります。

はい、これは確かに矛盾していますが、それには理由があります。

タブを実装する際に、Vim の作者は、タブを「N」個スキップするよりも、タブ「N」にすばやく切り替える方法の方が重要であると判断しました。後者を実行する必要があることはまれです。そのため、コマンド{count}の絶対タブ番号として を使用することにしましたgt

一方、gTコマンドが実装する必要はあまりありません。同じ動作 (すでにそのためのより簡単なキーストロークがありました) のため、繰り返しの意味は{count}そのまま残されました。そのため、誰かが「N」タブをスキップしたい場合は、そのコマンドが役立つかもしれません...

この方法では、 と の 2 つのコマンドのみを使用して、 の 3 つのコマンド (次のタブ、前のタブ、タブ "N" に移動) を実行できることに注意してください。Vim にはgtすでにgT覚えられないほど多くのコマンドがあるため、コマンドの数が少なくなることは重要です。

関連情報