web-dev-qa-db-ja.com

`ESC`はカーソルをvimに戻すのはなぜですか?

VimでESCを押してコマンドモードに戻ると、カーソルが1文字左に移動します。これは私が望んでいることではありません。時々私はすぐにlを押してその場所に戻り、おそらく文字を削除します。

この動作には理由がありますか?これは私が見逃している使用パターンに便利ですか?

64
Eric Wilson

挿入モードでは、カーソルは文字の間、または最初の文字の前または最後の文字の後にあります。通常モードでは、カーソルは文字の上にあります(改行はこの目的のための文字ではありません)。これはやや珍しいです。ほとんどのエディターは常にカーソルを文字の間に置き、ほとんどのコマンドはカーソルに対して文字after(厳密には言えないがnder)に作用します。これは、おそらくGUIの前に、テキスト端末が常にshowedカーソルを文字(下線またはブロック、おそらく点滅している)にしたことが原因であると考えられます。この抽象化は挿入モードでは失敗します。これは、もう1つの位置(ポストとフェンス)が必要になるためです。

モードを切り替えるには、いわばカーソルを半文字移動する必要があります。 iコマンドは左に移動し、カーソルをその前の文字の前に置きます。 aコマンドは右に移動します。挿入モードを終了する( Esc)可能であればカーソルを左に移動します(行の先頭にある場合は、代わりに右に移動します)。

たぶん Esc 行動は一種の理にかなっています。しばしば、あなたは行の終わりにタイプしている、そしてそこに Esc 左に行くことができます。したがって、一般的な動作が最も一般的な動作です。

カーソルの下の文字を最後の興味深い文字、挿入コマンドをaと考えてください。あなたは繰り返すことができます aEsc 空でない行の先頭から開始した場合は、カーソルを移動せずに、1つ右の位置に移動します。

視覚的には、gvimのほうが理にかなっています。

編集中、カーソルは文字の間にあります:
enter image description here

通常モードでは、最後の文字の上にあります。
enter image description here

したがって、実際には文字を戻しません。betweenrsからonr

21
Martin Ueding

この動作は編集可能です ここで回答したとおり ですが、停止して、何が起こっているのか少し考えてください。挿入モードでは、実際には文字を超えているのではなく、それらの間にあります。何かを挿入すると、カーソルは挿入したものの最後にジャンプするので、次に挿入されるものはその後になります。次に、文字を入力しただけで、それに対して何かをしたいと思ったとします。ヒッティング Esc 挿入した最後の文字の上に選択カーソルを直接置きます。これを行わなかった場合、実際にはかなり扱いにくくなります。

おそらくあなたが考えている状況は、挿入モードで通常のモードのように動き回って切り替えたときです。その場合、カーソルは1文字戻るように見えますが、そのように考えると、挿入モードになっていて、最後に行ったのは挿入ではなかったことを示しています。たぶん、あなたは通常モードでより多くの時間を費やすべきですか?

15
Caleb

タイプ Alt+L コマンドモードに戻ります。

再マッピングやvim設定の変更は必要ありません。ほとんどの端末エミュレータで機能するため Alt+KEY を送信します Esc に続く KEY (xtermでは、Xterm*metaSendsEscape: true行を〜/ .Xdefaultsファイルに挿入します)。この動作により、すぐに機能する他の挿入モードの組み合わせを「作成」することもできます。 Alt+S に Backspace

ちなみに、先ほど書いた文字の上にカーソルを置くのは非常に不便です。例えば、 Escdw 挿入したテキストに続く単語は削除されません。

6
user79932

これが私の解決策です。

wikia page about this で提供されるソリューションのより簡潔なバージョンです。

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
4
Steven Lu