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


62

vimでは、ヒットESCしてコマンドモードに戻ると、カーソルが1文字左に移動します。これは私が望んでいることではありません。たまにすぐlにその場所に戻り、おそらくキャラクターを削除するためにヒットします。

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


1
私は今までこれに気づいたことさえありませんでした...そして私はvimを毎日使用しています。理由はわかりませんが、答えを聞くことに興味があります。
ガベ。

5
挿入モードに戻ると、挿入のために「i」の代わりに「a」を押すことができます。その後、エスケープを押す前の位置に戻ります。
ペンギン359

回答:


40

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

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

Esc行動の種類は理にかなっていると思います。多くの場合、行の最後に入力しているので、Esc左にしか行けません。したがって、一般的な動作は最も一般的な動作です。

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


21

視覚的には、gvimではより意味があります。

編集時、カーソルは文字の間にあります:
ここに画像の説明を入力してください

通常モードでは、最後の文字の上にあります:
ここに画像の説明を入力してください

だから、本当にただであることから、文字を戻っていないとの rsことに r


1
素晴らしい絵。正直に言うと、私はキャラクターが言うのキャンプにいるよm...通常モードに戻ったときにハイライト表示されたままにしてください
スティーブン・呂

おっと。画像リンクは現在無効です。
スティーブンルー14

1
画像リンクは現在無効です。
スティーブンルー

1
画像を手動でホストすることは、このサイトのマークダウンエディターでツールを使用するよりも作業が多く、信頼性が低くなります。
スティーブンルー

1
彼らとのすべてが再び大丈夫ですか?それは彼らが入力した「カーソル」であり、あなたのテキストは「j」に言及しています
-poige

15

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

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


15
それは私には意味がありません。どのように繰り返されるの歩行後方の行動を説明しないiと、ESCキー押下を?
ウォーレンヤング

4
挿入モードに入り、何も挿入せずにそのままにしておくことは、公正なテストではありません。何かを挿入しなかった場合、なぜ挿入モードになるのでしょうか。何かを挿入した場合、通常モードに戻ると、挿入した文字が選択されたままになります。非常に直感的です。
カレブ

4
それは「公平」ではなく、説明力です。操作の理論がすべての動作を説明していない場合、それは不完全であるか、viの動作に一貫性がありません。私は、viがあらゆる点で完璧であり、したがって一貫していると信じることを好みます。:)
ウォーレンヤング

9
「後方歩く」動作@Warren iが続くESCの関数であるiとの完全に独立していますESC。具体的には、ivimに文字を挿入するように要求しています。これは、定義上、「aこの文字の後に文字を追加する」ではなく、「現在の文字の前に文字を挿入する」ことを意味します。
クローミー

3
一般に、各変更の後、その変更を終了すると、その変更は完了します。次に行うことは、おそらく別の変更を行うことです。このように、私には、挿入モード(私はそれを入力する方法に関係なく)出るときに、私は一般的に上にあるカーソルを好む次の私は私のために準備ができていますので、文字の次のものを私だけを変更することはなく、準備ができているよりも、変更挿入されました。
カイルストランド14

6

入力Alt+ Lコマンドモードに戻ります。

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

ところで、今書いた文字の上にカーソルを置くことは非常に不便です。たとえば、Escdw挿入したテキストに続く単語は削除しません。


エスケープの前に挿入モードで常にスペースを入力することにより、あなたが参照する不便さを避けることができます。次に、挿入モードを終了するカーソルがスペース上に置かれ、Esc d e前の単語を削除するために入力できます。頭に既にエンコードされている他の動作を変更したと感じたため、デフォルトの動作に戻しました。
mljrg

4

これが私の解決策です。

これについては、wikiaページで提供されるソリューションのより簡潔なバージョンです

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

ユーザーが実際にこの動作を変更する方法を求めていなかったとしても、Wikiページを引用してここでも+1します。
カイルストランド14

多くのプラグインがデフォルトの(やや直感的でない)動作に依存しているほどVimを深く掘り下げると、1つのキャラクターをランダムに食べたり壊したりするものがある場合、これが原因である可能性があります。私は自分でこの自動コマンドを使用しません。しかし、それはうまく機能します。
スティーブンルー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.