挿入モードでテキストをトラバースする


321

滞在中挿入モードのVimで、矢印キーを使用するよりも、前方と後方の他のいくつかの文字を移動し、テキストをトラバースする方法はありますか?

Iを押すとhjkおよびl挿入モードにある間、実際の文字ではなく、テキストを移動するの画面に印刷されています。

現時点で私が行っている方法は、Ctrl+ [Esc)に頼ってテキストをトラバースすることです。しかし、明らかにそれは生産的ではありません。


余談ですが、エスケープをより近いキーの組み合わせ(つまりimap jk <Esc>)にマップすると、勢いを崩してキーボードを横切ってキーを押す必要がないので便利です。
tsujin 2017

3
<ESC>)のkj代わりにマップするのが好きjkです。私の仲間の友人であるダイクストラが責任を負います!
Beco博士、2017

7
私が持っているjkkj私はちょうど2本の指での大きなボタンのように、それを押すと、私は通常に戻ってきたために重要ではありませんので、。
Edu Ruiz

回答:


648

あなたはvimを誤用しているように見えますが、それはおそらくそれにあまり慣れていないことが原因です。

正しい方法は、を押しEsc、小さな修正を行いたい場所に移動し、修正して、戻って編集を続けることです。Vimは通常のキャラクターよりも前/後/上/下の動きが多いので効果的です。あなたがそれらの多くを学ぶと、これはたまたま生産性が上がるでしょう。

ここにいくつかのユースケースがあります:

  • 誤って「誤って」入力した。シーケンスEscFfrdAは間違いを修正し、編集していた場所に戻ります。Ff運動は、最初に遭遇「F」の文字にカーソルを後方に移動します。それをCtrl+ DeldEndと比較してください。+ は、通常のエディターではほとんど同じですが、キーストロークが多くなり、キーボードの英数字領域から手を離すことができます。
  • 「誤って入力した」と誤って入力したが、「意図的に入力した」と修正したい。次にEsc2bcw、修正したい単語を消去して挿入モードにし、すぐに再入力できるようにします。編集に戻るAにはEnd、の代わりにを押すだけなので、Endキーに到達するために手を動かす必要はありません。
  • 誤って「マウス」ではなく「マウス」と入力しました。問題ありません-古き良きCtrl+ wは、挿入モードを終了せずに前の単語を削除します。そして、小さな単語を消去する方が、その中のエラーを修正するよりもはるかに高速です。私は慣れているので、このメッセージを入力しているときにブラウザページを閉じていました...!
  • 繰り返し回数はほとんど活用されていません。移動する前に、数値を入力できます。そして動きはこの回数繰り返されます。たとえば15h、カーソルを15文字戻し4j 、カーソルを4行下に移動します。それらを使い始めると、すぐにそれに慣れるでしょう。カーソルから10文字前に間違えた場合は、キーを10回押すのが、カーソルを移動する反復的なアプローチよりもはるかに遅いことがわかります。そのため、代わりにキーをすばやく入力して12h(カーソルを移動するために必要な文字数の概算として)、すぐに2回前に移動しllてエラーをすばやく修正できます。

しかし、あなたがもしまだ、挿入モードを離れることなく、小さなテキスト横断をしたい、フォローrsonアドバイスと使用Ctrl+ O。上記の最初の例では、Ctrl+ OFfを押すと前の「f」文字に移動し、挿入モードのままになります。


33
+1すばらしい回答と、あなたが与えたすべての例に感謝します!
Andreas Grech、

79
またCtrl+o、ノーマルモードで単一のコマンドを発行するために使用できることにも注意してください。これは、特にt / Tおよびf / F移動コマンドと組み合わせた場合に、希望する場所に到達することがあります。
ランディモリス

6
「あなたはvimを誤用しているようですが、それはあなたがそれにあまり馴染みがないかもしれません。」少し降順です。番号?
David Rivers、

17
これは、Vimを適切に使用する方法についての素晴らしい洞察です。ただし、「Esc」を押すのは面倒なので、たとえば「imap jj <esc>」のように、よりアクセスしやすいキーをその関数にマッピングできることを指摘する価値があると思います。
対称的な

25
タイプミスを修正するには、挿入モードを終了しないでください。アトミックで繰り返し可能なアクションを作成できるため、Vimは強力です。タイプミスを挿入して修正すると、2つの別個のアクションが作成されます。タイプミスを修正して挿入モードを終了せずにそれを実行する正しい方法。矢印キーを使用してそこに移動することを意味する場合は問題ありません。Vimには、挿入モードでナビゲートするためのキーバインドがいくつかあります。確認してください:h ins-special-keysctrl-h:バックスペース、ctrl-w:単語を削除、ctrl-u:行の先頭まで削除、alt-b:単語を1つ戻る。
everett1992、2013

152

滞在中挿入モード、使用CtrlOに行くために、通常モードだけで一つのコマンドのために:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

これはおそらく、あなたがやりたいことをする最も簡単な方法であり、覚えやすいでしょう。

挿入モードでのその他の非常に便利なコントロールキー:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

これらは、通常モードに戻る多くの無駄な切り替えを排除します。


13
ありがとうございました。これは正解と見なされるべきです。実際に役立ちます。
Atcold 2016年

1
私のMacでは、大文字のOではなく小文字のoです。「標準のvim」とは異なりますか?彼らが大文字を言っているように見える場所がたくさんあります(それが単なるだらしのない場合を除いて)。確認できますか?
Floris

わかりました。ただし、興味深い組み合わせを見つけるのは難しいため、これは行を削除します。誤って行を挿入した場合に行うべき非常に過小評価されていること。
patrik

5
@Floris Vimは、ctrlの組み合わせの大文字と小文字を区別しません。そのため、Ctrl + Shift +何かをマッピングすることができません。
Mahmoud Al-Qudsi

92

挿入モード

移動

hjkl

Pavel Shvedの発言にもかかわらず、Esc挿入モードのping に慣れる方がおそらく賢明です-挿入モード内ですばやく移動するためのマッピングのサンプルセットを次に示します。

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

これにより、通常モードと同様に、挿入モードではAlt+ hが1文字左、Alt+ j下などに移動hjklします。

そのコードをvimrcファイルにコピーして、vimを起動するたびに読み込まれるようにする必要があります(:new $myvimrc通常モードで「starting」と入力して開くことができます)。


通常モードの動き

Alt修飾キーはデフォルトでは(重要なものに)マップされていないため、同じ方法で他の(またはすべての)機能を通常モードから挿入モードにプルできます。例:+で
現在の単語の先頭に移動する:Altb

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


Alt挿入モードでの他の使用)

Altノーマルモードの動作を複製するよりもキーを使用する方がよい場合があることに言及する価値があります。たとえば、現在の列から行の終わりまでの部分を隣接する行からコピーするためのマッピングを次に示します。

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(わかりやすくするために、\ 行の継続とインデントを使用しました。コマンドは1行で記述されているかのように解釈されます。)


編集用の組み込みホットキー

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(挿入モードで移動するための注目すべき組み込みホットキーはありません。)

参照: :help insert-index


コマンドラインモード

この一連のマッピングにより、コマンドラインで上部Alt+のhjkl 動きを利用できるようになります。

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

または、これらのマッピングは、挿入モードとコマンドラインモードの両方に動きを一度に追加します

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


通常モードのコマンドをコマンドラインモードプルするためのマッピングコマンドは、挿入モードのマッピングコマンドとは少し異なります(コマンドラインモードには挿入モードのCtrl+ がないためO)。

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


移動と編集のための組み込みのホットキー

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

参照: :help ex-edit-index


@YugalJindle:ありがとう!:)コマンドラインモードの調整に関する情報を追加しました。(アプローチは挿入モードとは少し異なります。)
アーロントーマ

@禅:「ウィンキー」とはどういう意味ですか?回答でWindowsキーを参照していません。あなたは意味するかAlt、キーを?
アーロン・トーマ

シフト-単語全体を移動するには左/右!! どうして私はそれを知りませんでした。ありがとうございました。
Floris

実際にはターミナルモードでは、コマンドの前にaltが自動的にescを送信します........
Fuseteam

26

vimの純粋主義者であれば、この回答を読み飛ばしてください。OTOH、vimが初めてで、何百ものvimチュートリアルやブログにはないいくつかの役立つヒントを探している場合は、次を読んでください... :-)

いくつかの非正統的な(vim)方法

それは2014年であり、最近vim私に戻った人として、逆の可能性があるいくつかの視点とヒントを提供できます。

単語を移動するには、Shift +左またはShift +右を使用します

繰り返しはvimの強力な概念ですが、(個人的には)繰り返しを使用すると、数えたり(行、文字、単語など)強制したり、推測したりするのが不思議です。私の脳は通常、「カーソルがそこに欲しい」のように機能し、「カーソルが_5_words_to_the_left_が欲しい」のようには機能しません。カーソルをすばやく移動し、挿入ポイントをこのように視覚的に観察できるので、編集する必要がある場所に到達するために必要なホップ数を数える必要がなく、編集している内容に心を留めることができます。

マウスモードをオンにし、マウスホイールを使用してクリックする

...大量のテキストをナビゲートします。

最近のほとんどの(すべての)コンピューターには、キーボード(MacBookなど)と密接に統合されたタッチパッドがあります。工業デザイナーは何年もかけてこれらのデザインを最適化し、手をキーボードから離さなければならないという以前の問題はもはや本当の問題ではなくなりました。さて、それはあなたがマウスに慣れていて切り替えたくない場合ですが、vimに不慣れな人(検索でこの投稿を見つける可能性がある人など)にとっては、これはそれほど問題にはなりません。

おまけとして、クリックしてドラッグするとビジュアルモードになります

マウスを有効にした状態で、クリックとドラッグを行うと、ビジュアルモードに切り替わり、ヤンクする領域にマークが付けられます。

スクロールホイールを使用します

マウス(ホイール)を使用してスクロールしたり、クリックしてカーソル(位置)を配置したりできます。詳細については、http://usevim.com/2012/05/16/mouse/を参照してください。

など...

これらは私がvimでナビゲートするより現代的な方法(マウス、スクロールホイールなどを使用)であり、入力の好みに応じて等しく効果的です。

HTH


6
@MilesRoutはい、免責事項がありました。しかし、真剣に考えれば、私の脳と同じように機能するvimユーザーの割合はかなり高いと思います。つまり、私の脳は通常、「カーソルがそこに欲しい」のように機能し、「カーソルが5_words_to_the_leftが欲しい」のようには機能しません。そして、vimの従来の方法は、それらの人々にとってはうまく機能しません。vimが大好きです。a)どこでも利用できること、b)強力な機能があることです。ただし、デフォルトのメカニズムすべてに準拠する必要はないと感じています。
Shyam Habarakada 2014年

4
@MilesRout vimにはこの種の事柄に関して多くの宗教があるので、これについては議論しません。繰り返しカウント方法は私を助けません、そして受け入れられた答えはひどく十分に使われていないものとしてそれを呼びかけます。私はそれが事実である理由を推測することができるだけです。近くの場所に移動するためにw、bなどを使用することはすべて素晴らしいですが、さらに進むと、マウスホイールの方がはるかにうまく機能します。乾杯。
Shyam Habarakada 2014年

4
+1。反対票は理解できません。免責事項があります。気に入ればそれを取り、気に入らなければそれをスキップしてください。
fangmobile.com 2015年

これは非常に役立つ回答です
スラバ

1
最近VIMに移動した人として、私はこの答えの前提が完全に当てはまっていることに気づきました。特定の場所にカーソルを置くために必要な繰り返しの数を瞬時に伝える機能は、付属するものかもしれないし、そうでないかもしれません。経験。現在、@ ShyamHabarakadaのように、私の脳はそのように機能しません。これがどれほど正統ではないかにかかわらず、私は個人的にfn + hjklを非常に小さな動きの矢印キーに再マッピングしました。大きな動きの場合、私は通常、繰り返しの数を概算し、それから微調整します。私にとって、それは私が得ることができるのと同じくらい迅速です。
Jacoscaz 2015年

14

Vimコミュニティの多くの人々は、挿入モードではナビゲートしてはならない、それはVimの方法ではないと主張しています。これは、標準のエディターからVimに移行するときに学んだ誤った感情だと思います。

Vimは、そのツールを使用してアトミックで反復可能なアクションまたは検索を作成するときに最も強力です。

同じ挿入セッションで行った間違いを修正する場合は、挿入モードでナビゲートしても問題ありません変更したテキストの範囲外に移動しないでください。

テキストの入力中に間違いを犯し、それを修正するために挿入モードを脱出すると、意図したアクションを繰り返すことができなくなり.、修正が繰り返されます。

Vimは多くの挿入モードのナビゲーションキーをサポートしています。もちろん、矢印キーのHomeとEndがありますが、他にも多くのショートカットがあります。を参照してください:h ins-special-keys


4

GVimでは、マウスを使用できます。しかし正直なところ、矢印キーを使用することの何が問題になっていますか?彼らがキーボードの上にいるのには理由があります。


9
しかし、その理由はvimユーザーには対応していません。vimの中心的な強みの1つは、時間のかかるコストのかかるキーボードの手作業から手を離さずにあらゆる種類のことを実行できることです。特に、hjklの動き。
アーロン・トーマ

1
@ammoQに同意します。矢印キーの使用に問題はありません。矢印キーを使用すると生産性が向上する場合は、それを使用してください。
Eunwoo Song、

称賛:viを使用するとき、矢印キーよりもhjklをより頻繁に使用しますが、モードの切り替えは潜在意識的な行動になっています。
Erich Kitzmueller、2013

4

挿入モードでのナビゲーションを少し改善するには、いくつかのキーをマップしてみませんか?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

端末でメタキーを機能させることができれば、emacsモードのモックをさらに強化できます。通常モードでのナビゲーションははるかに優れていますが、動きが短い場合は挿入モードを維持するのに役立ちます。

ジャンプが長い場合は、次のデフォルトの翻訳をお勧めします。

<Meta-b>    maps to     <Esc><C-left>

これは通常モードに移行し、一言戻る


2

私は信じているHomeEnd(およびPageUp/ PageDn)も挿入モードでの間は常時動作しますが、それはさておき、私は、テキスト・トラバーサルのために定義された任意の他の標準的なキーがあるとは思いません。


しかし、おそらく文字キーだけを使用してテキストをトラバースする方法はありませんか?
Andreas Grech、

5
確かにありますが、特定の文字を入力したくない場合は;)
ホッブ

@hobbs ctrl + hjklはどうですか?それは理にかなっているはずです
user405205​​4

1

すみませんが、vimはそのようには機能しません。

「通常」モードに切り替え、ナビゲートしてから、もう一度挿入してください。


1

挿入モードで機能するマッピングを作成できます。これを行う方法は、inoremapを使用することです。コマンドの先頭の「i」に注意してください(noremapはキーマップの衝突を回避するのに役立ちます)。当然、「通常」モードの場合は「n」です。vimが「普通」だと思っていることを推測できます;)

ただし、「通常」モードを使用してテキスト内を移動したい場合は、Vimはこの種の点で非常に優れており、そのすべての力は通常モードから利用できます。Vimには、通常モードから挿入モード(i、I、a、A、o、Oなど)に簡単に切り替える方法がすでに用意されています。トリックは、通常モードに簡単に入るようにすることです。これを行う方法は、エスケープをより便利なキーに再マッピングすることです。ただし、通常のタイピングと競合しないものが必要です。私が使う:

inoremap jj <Esc>

jj(2つのjが次々にすばやく入力される)は私の語彙に表示されないようです。他の人はそれが快適な場所にリマップします。

私が行うもう1つの重要な変更は、CAPSLOCKをほとんど使用しないため、キーボードのCAPSLOCKキーとCONTROLキーを切り替えることです(ホストコンピューターのキーボード構成を使用)。(これはEmacsユーザーに共通です。欠点は、「固定されていない」キーボードを見つけたときです!Aaarggh!)

CAPSLOCKを再マップすると、次の挿入モードの再マップを快適に使用できます。

一部のキーは既に挿入モードでマッピングされている(backwards-kill-wordはデフォルトでCw(Control-w))ことに注意してください。必要なバインディングがすでにある可能性があります。とは言え、Chの方が.vimrcにあるので、 :

inoremap <C-h> <C-w>

しかし、おそらく通常のモードで同じ筋肉メモリ痙攣が必要なので、Chも次のようにマッピングします。

nnoremap <C-h> db

(d)elete(b)ackwardsは同じキーコードで同じことを達成します。この種のクイック編集は、タイプミスの実践に役立つと思います。ただし、テキスト内を移動したり、前の単語を削除したりする以上のことは、通常モードに固執してください。(もちろんリマップを使用して)モードを変更する習慣に入ると、挿入モードを再マップするよりもはるかに効率的です。


エスケープのための素晴らしいリマップ-文字変換されたアラビア語以外のほとんどすべてで機能すると思います!
jjt

0

imap挿入モードの任意のキーをカーソルキーの1つにマップするために使用できます。そのようです:

imap h <Left>

これで、hは通常モードと同じように機能し、カーソルを移動します。(この方法でhをマッピングすることは明らかに悪い選択です)

とは言っても、VIMを使用してテキスト内を移動する標準的な方法は「生産的でない」とは思いません。通常モードでテキストをトラバースする非常に強力な方法はたくさんあります(wとb、または/と?、またはfとFなどを使用します)。


1
vimでテキストを移動する標準的な方法は生産的ではないとは言いませんでした。私が言ったのは、挿入モードを終了して数文字前に戻ってから、もう一度挿入するために戻る必要があるのは少し「面倒」でした。しかし、もう一度言いますが、これはおそらく私がまだvimに慣れていないためです:)
Andreas Grech

これは私が探していたソリューションです。私はimap <Ch> <Left>を使用します(文字が削除されることはわかっていますが、バックスペースがあります)。
user405205​​4

0

頻繁に使用されるいくつかの動きとアクションについて、以下のマッピングを定義しました。これにより、CTRL + Oの組み合わせに比べてキーストロークが節約され、頻繁に必要になるため、長期的に見れば見返りが得られます。

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