なぜVimでは矢印キーが推奨されないのか
「Vimでは決して矢印キーを使わないでください。」
私はこれをランダムなスピーカーから聞きましたが、なぜ彼に尋ねる機会がありませんでした。また、矢印キーを使わないのなら、どうやってカーソルを挿入モードで動かすことができるでしょうか。
矢印キーを使うのは悪い習慣と考えられています。なぜなら、矢印キーを使うのであれば、おそらくvimの素敵な機能の多くを見逃しているでしょう。
人々が最初にvimを使い始めると、挿入モードのままになりがちですが、これは従来のテキスト編集のようなものです。しかしvimで効果的であるためには、実際にテキストを入力しているときだけ挿入モードになるべきです。カーソルを動かしたい場合は、通常モードにしてください。デフォルトでは通常モードになっているはずです。
通常モードでは、動き回るためのショートカットが何百万もあります。 hjkl
を使用して一度に1つのスペースを移動することも、単語、段落などを移動することもできます。通常モードの場合は、hjkl
の代わりに矢印キーを使用しても意味がありません。
あなたが矢印キーを使っているなら、あなたはvimを「間違って」使っているという態度があります。真実は、vimは本当に急な学習曲線を持っているということです、それであなたが学んでいる間あなたが正気に保っている何でもしなさい。私が最初にvimを使い始めたとき、私はすべてを「間違った」やり方でやっていました、そして、私がもっとvimのコマンドを学んだならば、習慣を壊すことに何の問題もありませんでした。
例として、最初に始めたときに、引用符で囲まれたテキストを変更したいとします。
String mystring = "I want to change this";
挿入モードに入り、矢印キーを使用して文字列の末尾に移動し、文字列が消えるまでバックスペースを押して、新しいテキストを入力します。
もっと良い方法は、カーソルを文字列のどこかに置き(ノーマルモード)、次にを押すことです。 ci"。これはchange
in
"
になります。それは引用符の間のすべてを削除し、私が新しいテキストを入力できるように挿入モードにあなたを入れます。
キー配置
要するに、Vim
はhjkl
キーをナビゲーションインターフェイスとして使用します。これは、これらのキーに矢印が付いていた古い「ADM-3A」端末の残骸だからです。
vim
はvi
から派生しているため、同じhjklキーを使用します。
新しい習慣
矢印キーの文字ベースの置換により、標準の入力設定から手を離さずにテキストをナビゲートできます。これは間違いなく、手を動かして矢印キーを押すよりも効率的で高速です。参照番号2(リソースを参照)で概説したように、これはこの利点の終わりではありません。VIMには、手を動かさずにアクセスできる他のショートカットがたくさんあります。
リソースと挿入モード
あなたの質問の2つの部分に対するいくつかの非常に詳細かつ正確な回答があります。矢印キーの置換に関して、私は迅速かつ要約的な方法で回答しましたが、あなたの質問を挿入、以下にリストされているリソース。
その愚かなマントラは、ホーム行が2番目の背骨のようなものであるタッチタイピストやクールに見えたい非タッチタイピストによってしばしば繰り返されます。タッチタイプ以外の人にとっては、ホームの並びはそれほど特別なものではなく、右手を矢印の方向に少し動かしてもまったく問題ありません。
考慮すべき重要なことは、そのマントラを繰り返す人々が代わりに使うことを提案するものです。
ほとんどの場合、彼らはhjkl
を使うことを主張します。
Viの作者が使っているキーボードが物理的な矢印キーを持っていなかったためにこれらのキーが使われているに過ぎず、矢印キーに対する引数が単なる合理化であるという事実を除外した場合はい、矢印の上でhjkl
を使うことの唯一の利点は、あなたが矢印の間を右から右へ移動するのをスキップすることです。その利点が問題に値するかどうかはあなたの電話です。
しかし、その右手の動きがonlyの使用が非効率的な理由ではありません。テキストの編集に必要な移動のmostは、はるかに広い範囲であるため、1文字ずつおよび1行ずつ移動することを制限するため、非効率的です。
右矢印を13回叩くのは非効率的で退屈です。thatはhjkl
キーを13回打ったほうがいいですか?いいえ、それは同じくらい愚かです。
目標に到達するまで右矢印を押し続けることは退屈なことではありませんが、エラーが発生しやすく、最終的には決定的で不確定なため、13ヒットとほぼ同じくらい非効率的です。thatはl
キーを押したままにした方がいいですか?いいえ。もちろん違います。
ありがたいことに、ほとんどのGUIツールキットには、Ctrl+Right
のように、単語単位で移動したり、EOLに移動したり、次の段落に移動したりできるコンボが用意されています。これらのショートカットは、単一の矢印を使うよりもはるかに速く、よりインテリジェントにナビゲートするのに役立ちます。 l
についても同じことがありますか?いいえ、違います。必要に応じてカウントを使用できますが、モーションごとに文字をカウントしたい人はいますか? hjkl
の助けを借りて14k
をするのは素晴らしいことですが、水平方向の動きはどうですか?大きな動きの場合、relativenumber
は実際には修飾子+矢印よりも悪くなります。そしてどうでしょうか。大きな動きが最も必要なものです。
しかし、私たちは幸運な野蛮人です。私たちのお気に入りの編集者は、矢印とhjkl
:bBeEwW/?*#{}()
などの周りを円で囲む何十ものモーションを持っています。これらのコマンドは、計り知れないほどhjkl
より強力で、Ctrl+Right
や友人に慣れていれば大部分はもっと論理的で直感的です。
<Right><Right><Right><Right><Right><Right><Right><Right><Right>
からhjkl
、さらには9l
に切り替えても意味がありません。
<Right><Right><Right><Right><Right><Right><Right><Right><Right>
から<C-Right>
への切り替えは非常に優れています。そこから、lllllllll
への切り替えは簡単かつ迅速です。あなたの矢を<nop>
する必要はありません!
これらのコマンドがw
よりも便利で強力、そして直感的であるならば、どうしてそんなに多くのブロガーやコメンターが矢印をhjkl
に置き換えることを主張しますか?
私は持っています。いいえ。
結論として、hjkl
は常に2文字または2行移動する必要があるため、ツールベルト内でhjkl
の位置が変わりませんが、フォレストを非表示にするツリーではないことが多いです。人々が矢に向かって説教することには用心してください。彼らがあなたに代わって持っているものはまったく良くないかもしれません。
他の人がカーソルを動かす他の方法が好ましい理由を述べていますが、質問に答えるとはほとんど言われていません、なぜ矢印キーを使うのは悪い考えと考えられますか?
私はその主な理由(そして@Squeezyはややこれをほのめかしています)は、VT100のような端末の時代には、矢印キーがエスケープシーケンスを生成したためです。プログラム。 (矢印キーはASCIIで表現されていないので、矢印キーの入力は何らかの "特別な"方法で伝えられなければなりません。)エスケープシーケンスは通常次のようなものでした。
ESC [ A
あなたの端末の特性、あなたの接続、そしてあなたの カーソルモード によります。あなたのシェルやあなたのプログラムが端末用に正しく設定されていなければ、彼らは矢印キーとしてのエスケープシーケンスを理解しないでしょう。
私が大学時代にVT100端末を介してUltrixにログインしたときに、挿入モードでviを押している間に矢印を押すと、ESC
は「挿入モードから出る」と解釈され、その後の[ A
は通常通りに解釈されました。モードコマンド明らかに、ユーザーが望んでいることや期待していることではありません。
今日では、特にGUI環境では、端末と矢印キーの処理がより堅牢になるようです。しかし、SSHまたはTelnetを介してvimを使用するときにも、同じ問題が発生します。
QWERTYレイアウトを使用しているときはホームキーから、Dvorakまたはその他のレイアウトを使用しているときは文字パッド(?)から指を移動させる必要があるため、矢印キーを使用するのは渋面です。
矢印キーは問題を示します - それはviですでに知られていました - 1200ボーのモデムのように遅い接続で。矢印はESC a
のようなESCシーケンスに変換されます。 ESCとaの間の時間が長くなりすぎると、BELが聞こえる(またはフラッシュが見える)後に追加モードが続きます。これはhjkl
キーと一緒には現れません。
- 矢印キーは、特定の環境ではうまく機能しない場合があります。 hjkl は通常の文字で、あらゆる種類の端末でよく理解されています。
- 挿入モードではカーソルを移動しません( Backspace および短いタイプミスを除く)、の考え方/] vi は挿入モードを入力するだけです。移動は通常モードで行われます
- 可能であれば、 hjkl を適用可能な場所での移動には使用せずに、代わりに指示にのみ使用してください。 vi に移動するには多数のオプションがあります。 http://vim.wikia.com/wiki/Moving_around を参照してください。
2番目の質問に関して:
[I]矢印キーを使わないのなら、インサートモードでどのようにカーソルを動かすことができますか?
マスターであり、それゆえに矢印キーを軽視する人にとっては、「モード」の概念は同様に存在しません。
マスターは、挿入モードではなく、完全な挿入または置換コマンドを使用して新しいテキストを追加します。このコマンドは、次のように、i
、o
またはcw
などのオペコードで始まります。その後にペイロードテキストが続き、ESC
で終わります。コマンドには構文があるので、マシンはコマンドの構文を受け入れるときに状態をたどりますが、マスターのエディタのモデルでは、モードは発生しません。見習いが素朴に「モード」と呼んでいるのは、マスターに未完成のコマンド状態、マスターが回避する最も酷い状況です。
マスターが挿入または置換コマンドの途中でそのテキストをカーソルで示される次の文字位置以外で挿入または削除しなければならないことをマスターが認識するたびに、マスターは挿入コマンドを終了し、数十の効率的なもののうちの1つを解放する。移動コマンド(もっと強力な方法が明らかに当てはまらない場合は、低いhjkl
に頼る)。
また、マスターがコマンドを未完のままにするような方法で気を散らすことはめったにないので、マスターが「念のために」余計なESC
を入力してビープ音を鳴らすことはめったにありません。
(ただし、ネットワークが遅れたり、マシンが行き詰まったりすると、マスターはESC
キーを激しく繰り返します。他の人と同じように)
矢印キーを使わないのなら、インサートモードでカーソルを動かすにはどうすればいいですか?
私が人々に矢印キーの使用を勧めない主な理由は、明示的に である - それはあなたが挿入モードの間に動き回ることを可能にする。
初心者のためのvimの学習に関する最も奇妙な問題の1つは、vimのundoコマンドが最後の action ではなく最後の キーストローク を元に戻すことによって機能することです。私の友人の多くは、挿入モードを終了する理由がないため、ずっと挿入モードを維持します。 「元に戻す方法は?」私は「コマンドモードから文字uを打ってください」と返答します。vimがファイル全体を消去してしまうとイライラします。
「元に戻せないのであれば、Vimは非常に価値のないテキストエディタです。」
方法を習得する前にツールを使用することは困難です。
使い方を学んだ後でなければVimは役に立ちません。 vimの力は、潜在意識の筋肉の記憶を通して、「それをやり直す」「やり直す」「このマクロホットキーを押したときにだけやり直す」ことができるということです。 「そのこと」が「ファイル全体を最初から最後までタイプする」ようになったら、vimはそれほど役に立ちません。
そのため、insert mode
に入っているときにのみテキストを入力してください。矢印キーを避けることは、あなたがより早くより良いVimユーザーになるのを助けるために私達が見つけたただ一つの方法です。
はい、上記の多くの理由から、vi
は元々hjkl
を使用するように書かれていましたが、 "never"はかなり大きな文です。
私はvim
(そして私が使う他のツール)を私の望むように振る舞うように修正する傾向があります。これは私のマシンではうまく機能しますが、組み込み開発者として、私がサポートしているマシンにあるものを常に選択するわけではありません。私は時折hjkl
内にvi
ナビゲーションしかない古いマシンに出会います。習慣を崩してhjkl
に切り替えるまで、1〜2秒間、制御コードがファイルに挿入されてしまいます。
私が思いつくことができる唯一の正当な理由は「Vimでは矢印キーを使わないこと」です。これは、矢印キーを処理できないマシンを使用できるようにするためです。 「決して」と言うのは、かなり薄い理由のようです。
vimに書き込む前に、次のコマンドを書くだけです。 -
- eSC
- :nocpを設定する
これに関する1つの問題は毎回それを書かなければならないかもしれないということです。
これが私の2¢です。
あなたが快適に感じることなら何でもしなさい。別のエディタを使用している場合は、一貫性を保つために矢印キーを使用する方が簡単な場合があります。
一方、vi(とvim)が特別なキーを必要としないのは、おそらく素晴らしいことです。おそらく、古いIBMの端末を端末として機能させるためにハッキングする可能性があります。
もう1つ注意が必要なのは、矢印キーが期待通りに機能しない可能性があることです。私は彼らが働かなかったところでターミナルを使用しました。 Vimでそれらがどのように実装されているのか正確にはわかりませんが、一様ではないと確信しています。私のむらのある記憶は、それらがvimマクロとして実装されたところの1つの実装を思い出すようにさえ思えます。
強化されたテキストエディタを備えたゲームの名前は「急いで動き回る」ようで、無駄な/繰り返しの多い動きを減らしているようです。キーボードの寸法にもよりますが、文字キーから矢印キーに移動すると/時間がなくなり、戻るに戻ります。行。しかし、左手の小指または薬指の切り替えモードでESCキーを押すことができれば、1つの流動的な動きになり、編集セッション中にスピードが向上します。
そして、これがあなたの質問の2番目の部分への鍵です、あなたの左でESCを押してあなたの右でhjklで動くことによって挿入モードから出てください。最終的にはビートをスキップせずにこれを行うことができます。
ここで述べたこと をいくつか試してみるまで 、最も重要なのは "Getです。効率的:ショートカットマッピング "セクション
Kboxでsshデーモンを実行している私のAndroidデバイスに殻を取りながらvimを実行すると、私の快適ゾーンから抜け出すことができました。デバイス上のAnroid端末エミュレータは音量ボタンを使って特別なキーコンボ(ctrl +なんでも)を置き換えるので、私がキーボードで通常使うキーの中にはこの状況では機能しないものがあります。
たとえば、Insertキーはこの環境では機能しないので、I
を使用して挿入モードに切り替えます。私は通常挿入モードをエスケープするために使用するEscキーも機能しないので、代わりにエスケープするためにctrl + [
を使用しています。ホームキーとエンドキーは慣れていないので動作しません。代わりに、私は今まで気にしなかった0
と$
のショートカットに頼って、行の先頭または末尾に到達します。
とにかく、私の状況では通常どおり矢印キーが機能しますが、最小限のキーボードショートカットがあることを知っているのはいいことです。