Vimで矢印キーが推奨されない理由


125

「Vimで矢印キーを使用しないでください!」

ランダムなスピーカーからこれを聞いたが、なぜ彼に尋ねる機会がなかった。また、矢印キーを使用しない場合、挿入モードでカーソルを移動するにはどうすればよいですか?


6
この質問に対する歴史的な回答は興味深いものです。宗教的なディアトリア人はそれほどそうではありません。
アイザックラビノビッチ

5
良い質問。これは常にvi [m]について私を悩ませます。ドヴォルザークのキーボードユーザーとしては本当にひどいです!
2013年

32
何年も前にviを初めて使用したとき、先輩の同僚から「h、j、k、lキーの使用方法を覚えておいてください。キーは機能しません。viを使用することさえできない場合、完全なd ***ヘッドのように見えます。」
エルグン

1
挿入モードでは、Ctrl-Oを押してから通常モードのコマンドを使用してカーソルを移動でき、挿入モードに戻ります。CTRL-G CTRL-JおよびCTRL-G CTRL-Kも確認します。これにより、挿入を開始した列で、カーソルを次の行と前の行に移動します。
ブノワ

1
私は、長年にわたって多くの悪いvi [m]習慣を開発してきました。より良い習慣を強制するために、非常に遅い接続でそれを使用する必要があると思います。
aidan

回答:


172

矢印キーを使用するのは悪い習慣とみなされます。矢印キーを使用している場合、vimの多くの素敵な機能を利用できない可能性が高いからです。

人々が最初にvimを使い始めたとき、これは従来のテキスト編集に似ているため、挿入モードのままになる傾向があります。ただし、vimで効果を発揮するには、実際にテキストを入力しているときにのみ挿入モードにする必要があります。カーソルを動かしたい場合は、通常モードにする必要があります。デフォルトではほとんど通常モードになっているはずです。

通常モードでは、移動するための数百万のショートカットがあります。を使用hjklして、一度に1つのスペースを移動したり、単語、段落などで移動したりできます。通常モードの場合、矢印キーhjklは遠くにあるため、代わりに矢印キーを使用しても意味がありません。

矢印キーを使用している場合、vim「間違った」を使用しているという態度があります。真実は、vimには非常に急な学習曲線があるため、学習している間は正気を保つために何でもします。私が最初にvimを使い始めたとき、私はすべてを「間違った」方法で行いました。vimのコマンドをもっと学んだら、習慣を壊す問題はありませんでした。

例として、私が最初に始めたとき、引用符でテキストを変更したいと言います:

String mystring = "I want to change this";

挿入モードに入り、矢印キーを使用して文字列の最後に移動し、文字列が消えるまでバックスペースを押して、新しいテキストを入力します。

はるかに良い方法は、文字列内の任意の場所にカーソルを置いて(通常モード)、を押すことci"です。これはchange in "。新しいテキストを入力できるように、引用符の間のすべてを削除し、挿入モードにします。


4
@ ott-- ci<そしてci)同様に動作し、キーボードからマウスに手を動かす必要はありません。括弧の先頭に移動してからコンテンツを変更する場合はf(ci(機能します。
マシューフィンレイ

6
「カーソルを文字列の任意の場所に置く」-繰り返しますが、挿入モードでは矢印を使用してそこに到達しますが、通常モード/wantでは「Enter」を押して単語「want」に到達し、次に「do」を実行しますci"
ネイサンロング

8
ちょっとこれはきちんとしています!カーソルを動かすためのなんと高速で強力な方法です。それを改善する唯一の方法は、カーソルを置きたい場所を魔法のように指し、そこにジャンプする方法です。何かを発明できるかもしれません。私たちはそれを「マウス」と呼ぶべきだと思います。
マシュースカウテン

18
@MatthewScouten vimがマウスより簡単だと主張する人はいません。少し練習すれば、はるかに速くなります。マウスを使用することは、ポイントを取得するためにポインティングとうなり声をあげるようなものです。Vimでは、完全な文章で話すことができます。
ディーン

4
習慣を打破することは良い答えです-しかし、強制的に通常の活動から誰かを防ぐことはファシストです。さらに悪いことに、ユーザビリティ(のhjkl):マッピングupし、down互いに垂直に区別できない2つのキーに、それはだ.....左と右のキーからはおろか悲劇的なイデオロギー盲検傲慢のデモンストレーション。
新しいアレクサンドリア14

93

キー配置

要するに、ナビゲーションインターフェイスとしてキーをVim使用するのhjklは、古い「ADM-3A」端末の残骸であり、これらのキーに矢印が付いているためです。

キーボード

以来vim由来しvi、それは同じhjklキーを使用しています。

新しい習慣

矢印キーの文字ベースの置換により、標準の入力設定から手を離さずにテキストナビゲートできます。これは間違いなく、手を動かして矢印キーを押すよりも効率的で高速です。参照番号2(リソースを参照)に概説されているように、これはこの利点の終わりではありません。VIMには、手を動かさずにアクセスできる他の多くのショートカットがあります。

リソースと挿入モード

あなたの質問の2つの部分に対するいくつかの非常に詳細かつ正確な答えがあります:矢印キーの置換に関して、私は迅速かつ要約的な方法で答えましたが、あなたの挿入質問については、以下のリソースをご覧ください。


2
hjklキーは、矢印キーに手を動かすよりもはるかに効率的であることは言うまでもありません。
-sixtyfootersdude

2
これは質問に答えず、hjklが選択される理由を説明するだけです。
マッツマン

3
これは真実で興味深い歴史ですが、OPは挿入モードでカーソルをどのように動かすかを尋ねますhjkl挿入モードでは動作しないので、これは質問に対する答えですか?
LarsH

3
@Kruug、質問の最初の部分は、誰かがvimで矢印キーを使用しないと言った理由です。hjklvimで使用できるという事実は、誰かが矢印キーを使用してはならない理由を教えてくれません。ちょうど私が自転車に乗って仕事をすることができるという事実が、誰かがジョギングを絶対にしない理由を説明しないのと同じです。
LarsH

1
これで、Vimがエスケープを使用して挿入モードを終了する理由がわかりました^^クールな写真です!
エティエンヌ

56

この愚かなマントラは、ホームの列が2本目の背骨のようなタッチタイピストや、かっこよく見せたい非タッチタイピストによって繰り返されることがよくあります。タッチタイピストでない人にとって、ホームの列はそれほど特別ではなく、右手を少し動かして矢印に到達することはまったく問題ではありません。

考慮すべき重要なことは、そのマントラを繰り返す人々が代わりに使用することを提案するものです。

ほとんどの場合、彼らはを使用することを主張しhjklます。

viの作者が使用するキーボードに物理的な矢印キーがないためにこれらのキーのみが使用され、矢印キーに対する引数は単なる合理化であるという事実を除外すると、hjklとにかく矢印よりもわずかに優れています。はい、hjkl矢印を使用することの唯一の利点は、矢印との間の右手の小さな動きをスキップすることです。そのメリットがトラブルの価値があるかどうかはあなたの電話です。

しかし、右手のその動きは、矢印だけを使用するのが非効率的な理由ではありません。テキストを編集するために必要な動きのほとんどははるかに広い範囲を持っていますが、文字ごとや行ごとの移動を制限するため、非効率的です。

右矢印を13回叩くのは非効率的で退屈です。それはそのハンマー方が良いlキー13回?いいえ、それは同様に愚かです。

ターゲットに到達するまで右矢印を押したままにするのは退屈ではありませんが、エラーが発生しやすく、最後に必要な非決定的なスローダウンのため、13ヒットとほぼ同じくらい非効率的です。それがあることをよりよく保つためにl押されたキーを?いいえ。もちろんありません。

ありがたいことに、ほとんどのGUIツールキットには、Ctrl+Right単語単位で移動したり、EOLに移動したり、次の段落に移動したりできるコンボが用意されています。これらのショートカットは、単一の矢印を使用する場合よりもはるかに高速かつインテリジェントにナビゲートするのに役立ちます。と同じhjklですか?いいえ、ありません。必要に応じてカウントを使用できますが、モーションごとにキャラクターをカウントしたいのは誰ですか?14kの助けを借りて行うことrelativenumberは素晴らしいですが、水平方向の動きはどうですか?大きな動きの場合hjkl、実際には修飾キー+矢印よりも劣ります。そして何だと思う?大きな動きは、私たちが最も必要とするものです。

しかし、私たちは幸運な野郎であり、私たちのお気に入りのエディターには、矢印 hjkl:の両方を中心に円を描く多数のモーションがありますbBeEwW/?*#{}()。これらのコマンドはされている計り知れないほど以上の力を与えるhjklと、あなたが使用している場合は、より多くの論理的かつ直感的にほとんどの部分はCtrl+Right、友人。

からまたは<Right><Right><Right><Right><Right><Right><Right><Right><Right>への切り替えは、途方lllllllllもなく9l無意味です。

から<Right><Right><Right><Right><Right><Right><Right><Right><Right>に切り替える<C-Right>方がはるかに優れています。そこから、w簡単にすばやく切り替えることができます。<nop>矢は必要ありません!

これらのコマンドがより便利で、より強力で、より直感的であればhjkl、なぜ多くのブロガーやコメンテーターが矢印を置き換えることを主張するのhjklでしょうか?

私は持っています。いいえ、アイデア。

結論として、hjkl私たちは常に2文字または線分だけ移動する必要があるため、ツールベルトに配置しますが、それらは多くの場合、森を隠す木ではありません。矢印に反して説教する人々に注意してください。彼らがあなたのために用意しているものはまったく良くないかもしれません。


最初は、「hjkl」は役に立たないと言うつもりだったが、キャッチ、ワード/パラグラフ/センテンスの動きは、単一​​文字の動きに関するマントラよりもはるかに有用です。
ザビエルT.

1
ありがとう。先日HNについても同様の議論がありましたが、言葉遣いが悪いために脱線しました。自分の努力に集中することhjkl 役に立たないがhjkl有用である。
ロメインル

5
ここでも同じです。結局、私はあなたの答えが好きでしたが、そのトーンは不必要に不平を言ったり、トローリングしたり、燃え上がったりすると思いました。
UncleZeiv

役に立たないとは言わないでください。速度についての議論は良いものです。また、矢印キーを使わないようにHJKLが他のVIMコマンドと連携する方法も重要です。
Aviator45003 14

@TC討論全体をより興味深いものにする例はありますか?
ロメインル14

18

他の人は、カーソルを動かす他の方法が好まれる理由を説明しましたが、質問に答えるとはほとんど言われていません。矢印キーを使用するのはなぜ悪い考えと考えられますか

主な理由(および@Squeezyが多少暗示される)は、VT100のような端末の時代に、矢印キーが実行中のプログラムによって解釈されるエスケープシーケンス生成したためだと思います。(矢印キーはASCIIで表されないため、矢印キーの入力は何らかの「特別な」方法で伝達される必要があります。)エスケープシーケンスは通常、次のようなものでした

ESC [ A

端末のプロパティ、接続、およびカーソルモードによって異なります。シェルまたはプログラムが端末用に適切に構成されていないと、エスケープシーケンスが矢印キーとして理解されません。

私が大学にいたとき、VT100ターミナルを介してUltrixにログインし、挿入モードでviを押しながら矢印を押すと、ESC「挿入モードから抜け出す」と解釈され、次[ Aは通常モードのコマンドと解釈されました。明らかに、ユーザーが望むものや期待するものではありません!

最近では、特にGUI環境では、端末と矢印キーの処理がより堅牢になっているようです。ただし、SSHまたはTelnetを介してvimを使用する場合も同じ問題が発生します。


14

矢印キーを使用すると、QWERTYレイアウトを使用する場合はホームローから、Dvorakまたはその他のレイアウトを使用する場合は文字パッド(?)から指を移動させるため、眉をひそめます。


4
ワオ。マジ?Vimを設計した人々は、ユーザーが考えているよりもタイピングに時間を費やしていると思うことを意味するので、私はそれを信じたくありません。
レナン

13
手を動かすと思考が暗示されるのはなぜですか?
EBGreen

8
まあ、学校でやらなければならなかったときは、hjklナビゲーションを使用する前にescを押す必要があったので、ホーム行から左手を取り外して小指をEscに移動しました。1つ前のスペースに戻って文字を挿入するには、「Esc:hi」と入力してから、挿入する文字を入力する必要がありました。それはあまり役に立ちません。
フランクトーマス

1
@Renan-「入力」は「テキストの挿入」を意味すると想定しています。私は思考を読んでいたとき、私はどのようにキーボードがあるので、私は、あまりにも、ホーム列の上に私の指を持って移動するのVimで:などのスペルミスを修正するために周りのホッピング、コードを比較するために、他のファイルを開く、移動するための検索
ネイサンロング

2
@Renan-1)節約額を過小評価し、2)些細なことを積み上げます。Vimパワーユーザーが他の開発者の10倍の速度で編集するタッチタイピングを見てきました。十分な速度で、編集は自動的になり、思考やフローを中断しません。この方法で作業するのは楽しいので、私のボートを浮かせますが、あなたが思うよりも生産性が大幅に向上することを望んでいます。例として、Gary Bernhardtのようなコーダーを見てみてください。
ネイサンロング

10

矢印キーには問題があります。これは、viですでに知られていましたが、1200ボーモデムなどの低速接続で発生します。矢印は、などのESCシーケンスに変換されESC aます。ESCとaの時間が長くなりすぎると、BELが聞こえる(またはフラッシュが聞こえる)後、追加モードになります。これはhjklキーとともに表示されません。


ESC [ Aあなたが言っているのは何だと思いますか?
-LarsH

2
ESC [ ADEC VT-100端末(ANSI端末はDEC VT-100の強力な派生物でした)矢印です。IIRC ESC Aは、ADM-3Aの矢印、またはおそらくDEC VT-52の矢印でした。ポイントは同じままESCですが、矢印キーの一部として送信された文字は、ESC手動で入力した文字と簡単に混同されます。
RBerteig

@RBerteig:知っておくと良い。
LarsH

5

2番目の質問について:

[I]矢印キーを使用しない場合、挿入モードでカーソルを移動するにはどうすればよいですか?

マスターであり、したがって矢印キーを軽daする人にとって、「モード」の概念は同様に存在しません。

マスターは、挿入モードではなく、のようなオペコードで始まる、またはペイロードテキストが後に続き、で終わる完全な挿入または置換コマンドを使用して新しいテキストを追加します。コマンドには構文があるため、マシンはコマンドの構文を受け入れる際に状態を走査しますが、エディターのマスターモデルでは、これらはモードを生成しません。実習生が単純に「モード」と呼ぶものは、マスターにとって未完成のコマンド状態であり、マスターが回避する最も忌まわしい状況です。iocwESC

マスターは、挿入または置換コマンドの途中でカーソルが示す次の文字位置以外のテキストを挿入または削除する必要があることに気づいたときはいつでも、挿入コマンドを終了し、効率的な多数の移動コマンド(hjklより強力な方法が明らかに適用できない場合、低レベルに再分類)。

また、マスターがコマンドを未完成のままにするような方法で気が散ることはめったにないので、マスターは、ESC「万が一に備えて」発行された余計な入力により、エディターがビープ音を発することはめったにありません。

(ただし、ネットワークが遅れたり、マシンが動かなくなったりすると、マスターはESC他の全員と同じように猛烈に繰り返しキーを叩きます。)


2
場合は、覚えているviのは、コマンド入力モードで挿入し、その後、公正であることを、我々は他のエディタ内のすべてのこのようなモードを特定し、モーダルそれらを呼び出す必要があります。たとえば、EmacsでCtrl-Xを押すと、たとえば、Ctrl-Sを押してドキュメントを保存できる「モード」になりますが、この「モード」以外では機能しません。
カズ

5
  • 特定の環境では、矢印キーがうまく機能しない場合があります。hjklは通常の文字であり、あらゆる種類の端末でよく理解されています。
  • あなたがでカーソルを移動しない挿入モード(を除くBackspaceキーと短いタイプミスを訂正する)、という考え方viが入力することで挿入モードにのみ何かを入力します。移動は通常モードで行われます
  • 可能な場合は、hjklを使用して適切な場所に移動することは避け、代わりに指示にのみ使用してください。viで移動するための多数のオプションがあります。http//vim.wikia.com/wiki/Moving_aroundを参照してください。

実際には、バックスペースを使用して、挿入モードでカーソルを少なくとも左に移動できます。しかし、自由に動かせないことに同意します。
LarsH

挿入モードでカーソルをまったく動かしたくないということを表現しようとしました。
スクイージー

申し訳ありませんが、挿入モードではカーソルを移動できないと書いていることを誤解しました。実際、私は挿入モードでカーソルを移動したいと思っています。新しいテキストを入力しているときに間違ったキーを押した場合、バックスペースを使用して修正します。しかし、その限られた使用を超えて、私は同意します。
LarsH

3

はい、上記の多くの理由から、vi元々はを使用するようhjklに書かれていましたが、「never」はかなり大きな文です。

私はvim自分が望むように振る舞うように変更します(そして私が使用する他のツール)。これは私のマシンではうまく機能しますが、組み込み開発者として、私がサポートしているマシンにあるものを常に選択できるとは限りません。時折hjklナビゲーションしかできない古いマシンに出くわしviます。習慣を打ち破ってに切り替えるまで、1〜2秒ファイルに制御コードが挿入されますhjkl

「Vimで矢印キーを使用しないでください」と思い付く唯一の正当な理由です。矢印キーを処理できないマシンを使用できるようにするためです。それは「決して」と言うのはかなり薄い理由のように感じます。


3

矢印キーを使用しない場合、挿入モードでカーソルを移動するにはどうすればよいですか?

矢印キーを使用しないようにする主な理由は、挿入モードで移動できるためです。

新規ユーザー向けのvimの学習に関する最も奇妙な問題の1つは、vimの元に戻すコマンドが、最後のキーストロークではなく最後のアクションを元に戻すことによって動作することです。私の友人の多くは、それを離れる理由がないため、ずっと挿入モードにとどまっています。「元に戻すにはどうすればいいですか?」私は「コマンドモードから文字uを押してください」と返信します。vimがファイル全体を消去するとイライラします。

「Vimは、物事を正しく元に戻せない場合、非常に価値のないテキストエディターです。」

方法を学ぶ前にツールを使用することは困難です。

Vimが役立つのは、使用方法を学んだ後だけです。vimの力は、潜在意識の筋肉の記憶を通じて「そのことをもう一度行う」、「そのことを元に戻す」、または「このマクロホットキーを押したときにのみそのことを行う」ことを伝える方法にあります。「そのこと」が「ファイル全体を最初から最後まで入力する」になった場合、vimはまったく役に立ちません。

そのため、にいるときにのみテキストを入力する必要がありますinsert mode。矢印キーを使用しないことは、より優れたvimユーザーになることを支援するための1つの方法にすぎません。


0

kboxでsshデーモンを実行しているAndroidデバイスにシェルでアクセスしながらvimを実行すると、コンフォートゾーンから抜け出すことができました。デバイスのAnroid Terminal Emulatorはボリュームボタンを使用して特別なキーコンボ(ctrl +何でも)を置き換えるため、この状況では通常キーボードで使用するいくつかのキーが機能しません。

たとえば、Insertキーはこの環境では機能しないためI、挿入モードに切り替えるために使用しています。私が通常挿入モードをエスケープするために使用するEscキーも機能しないctrl + [ため、代わりにエスケープするために使用しています。私が慣れているように、HomeキーとEndキーは機能しません。代わりに、私はに頼ってる0$先頭または行の最後に到達する前に、私は気にしませんショートカット。

とにかく、矢印キーは私の状況ではいつものように機能しますが、ミニマリストのキーボードショートカットがあることを知ってうれしいです。


0

vimに書き込む前に次のコマンドを書くだけです。

  1. ESC
  2. :set nocp

これに関する1つの問題は、毎回それを書く必要があるかもしれないということです。


これは、挿入モードで矢印キーを使用する場合に便利です
-0decimal0

0

これが私の2¢です。

快適に感じることなら何でもしてください。異なるエディターを使用する場合、一貫性のために矢印キーを使用する方が簡単な場合があります。

一方、vi(およびvim)には特別なキーは必要ありませんが、おそらくは例外です。おそらく、IBMの古いselectricをハッキングして端末として機能させることができます。

注意すべきもう1つの点は、矢印キーが期待どおりに機能しない可能性があることです。動作しない端末を使用しました。それらがVimでどのように実装されているのか正確にはわかりませんが、均一ではないと確信しています。私のむらのあるメモリは、vimマクロとして実装された1つの実装を思い出すようです。


0

強化されたテキストエディタを備えたゲームの名前は、「急いで動き回り」、無駄な動きや繰り返しの動きを減らしているようです。あり、いくつかのあなたは(キーボードの寸法に応じて)矢印キーに文字キーから移動したときに失われた時間と比べてバックホーム列には。ただし、左手の小指または薬指の切り替えモードでESCキーにアクセスできる場合は、1つの滑らかな動きになり、編集セッション中に速度が向上します。

これが質問の2番目の部分の鍵です。左でESCを押し、右でhjklで移動して挿入モードを終了します。最終的には、ビートをスキップせずにこれを行うことができます。

ここで言及したことのいくつかを試すまで、Vimを使用したことはありませんでしたが、最も重要なのは「効率的な取得:ショートカットマッピング」セクションです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.