web-dev-qa-db-ja.com

挿入モードでのテキストの移動

挿入モード Vimでは、矢印キーを使用する以外に、文字を前後に移動してテキストを走査する方法はありますか?

を押すと h、 j、 k そして l 挿入モードでは、実際の文字はテキストを移動する代わりに画面に印刷されます。

私が今やっている方法は、 Ctrl + [ (Esc)そして、テキストを横断します;しかし、明らかにそれは生産的ではありません。

302
Andreas Grech

あなたはvimを誤用しているように見えますが、それはおそらくvimにあまり詳しくないからでしょう。

正しい方法を押すことです Esc、小さな修正をしたい場所に移動して修正し、戻って編集を続けます。 Vimには通常のキャラクターの前進/後退/アップ/ダウンよりもはるかに多くの動きがあるため、効果的です。それらをもっと学んだ後、これはたまたま生産的になります。

いくつかの使用例は次のとおりです。

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

ただし、still挿入モードを終了せずに小さなテキストトラバーサルを実行する場合は、 rsonアドバイス および使用 Ctrl+O。上記の最初の例を取り上げると、 Ctrl+OFf 前の「f」文字に移動し、挿入モードのままにします。

607
P Shved

モードの挿入で、使用 CtrlO 1つのコマンドだけで通常モードに移動するには:

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

これにより、多くの無駄な通常モードへの切り替えがなくなります。

125
felix

挿入モード

移動

hjkl

Pavel Shvedの内容にかかわらず said -慣れるのがおそらくより望ましい Escaping挿入モード-挿入モード内のクイックナビゲーション用のマッピングセットの例を次に示します。

" 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と入力して開くことができます)。


通常モードの動き

以来 Alt 修飾子キーはデフォルトでは(重要なものに)マッピングされません。同じ方法で、他の(またはすべての)機能を通常モードから挿入モードにプルできます。例えば。:
現在のワードの先頭への移動 Alt+b

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 movementsコマンドラインで利用可能:

" 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>

あるいは、これらのマッピングは、移動bothを挿入モードとコマンドラインモードに一度に追加します。

" 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>


pullingの通常モードコマンドのコマンドラインモードへのマッピングコマンドモードの 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

89
Aaron Thoma

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

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

それは2014年です。最近vimに戻った人として、いくつかの、潜在的に逆説的な視点とヒントを提供できます。

Shift + leftまたはshift + rightを使用して単語をトラバースします

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

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

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

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

ボーナスとして、クリック+ドラッグで視覚モードになります

マウスを有効にすると、クリックとドラッグは視覚モードに切り替わり、ヤンクする領域をマークする効果があります。

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

マウス(ホイール)を使用してスクロールし、クリックしてカーソル(duh)を配置するだけで機能します。詳しくは http://usevim.com/2012/05/16/mouse/ をご覧ください。

など...

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

HTH

23

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

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

ミスを修正する場合は、挿入モードでナビゲートしてもかまいません同じ挿入セッションで変更したテキストの範囲外にナビゲートするべきではありません。

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

Vimは多くの挿入モードナビゲーションキーをサポートします。矢印キー、ホーム、および終了がありますが、他にも多くのショートカットがあります。 :h ins-special-keysを参照してください。

14
everett1992

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

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

ターミナルでMetaキーが機能するように回避できる場合は、emacsモードをさらにモックできます。 normal-modeのナビゲーションははるかに優れていますが、動きが短い場合は挿入モードのままにしておくと役立ちます。

より長いジャンプのために、私は次のデフォルトの翻訳を好む:

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

これはnormal-modeに移行し、Wordに戻ります

4
Alex

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

4

私は信じている Home そして End (そして PageUp/PageDn)挿入モードでも正常に機能しますが、それ以外に、テキストトラバーサル用に定義された他の標準キーはないと思います。

2
Amber

挿入モードで機能するマッピングを作成できます。その方法は、inoremapを使用することです。コマンドの先頭にある「i」に注意してください(キーマップの衝突を避けるにはnoremapが便利です)。当然の結果は、「通常」モードでは「n」です。 vimが「正常」だと考えるものを推測できます;)

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

inoremap jj <Esc>

Jj(2個のjが次々とすばやく入力される)は私の語彙に現れないようです。他のものは快適な場所にリマップします。

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

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

いくつかのキーは既に挿入モードでマップされていることに注意してください(backwards-kill-WordはデフォルトでCw(Control-w)で、あなたはすでにあなたが望むバインディングを持っているかもしれません。 :

inoremap <C-h> <C-w>

しかし、通常モードでは同じ筋肉記憶痙攣が必要になるため、C-hも次のようにマッピングします。

nnoremap <C-h> db

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

1
pfries

頻繁に使用されるいくつかの動きとアクションについて、次のマッピングを定義しました。これにより、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

申し訳ありませんが、vimはそのようには動作しません。

「通常」モードに切り替えて、ナビゲートしてから再び挿入する必要があります。

0
Johan

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

imap h <Left>

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

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