web-dev-qa-db-ja.com

Vimで挿入モードに入ることなく、カーソルがある場所に改行を挿入するにはどうすればよいですか?

挿入モードに入ることなく、カーソルがVimにあるときに改行を挿入できますか?次に例を示します([x]はカーソルがxにあることを意味します):

if (some_condition) {[ ]return; }

時々、さらにコードを入力したい場合があります。を押します i 挿入モードに入るには、を押します Enter 改行を挿入してから余分なスペースを削除します。次に、通常モードに入り、右中括弧の前にカーソルを配置してから、同じことを実行して独自の行にします。

私はこれをしばらくやっていますが、それを行うより良い方法は確かにありますか?

75

あなたが与えた例では、あなたは使用することができます rEnter 単一の文字(スペース)をEnterで置き換えます。次に、 fspace. 次のスペースに進み、最後のコマンドを繰り返します。

自動インデント設定に応じて、上記はreturnステートメントを適切にインデントする場合としない場合があります。そうでない場合は、使用します sEnterTabEsc 代わりに、スペースを改行で置き換え、行をインデントし、挿入モードを終了します。 「。」を使用できないように、2番目のスペースを別のコマンドに置き換える必要があります。この場合。

96
Greg Hewgill

挿入モードでnotを押しながら「g」を押すと、カーソルに改行を挿入するマクロを作成する方法は次のとおりです。

Vimから、次を入力します。

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

どこ:

  • [Ctrl + V]は、Ctrlキーを押しながら「v」を押すことを意味します
  • [Enter]はEnterキーを押すことを意味します
  • [Esc]は、Escキーを押すことを意味します

最後のEnterキーを押すまで、vimウィンドウの下部に次が表示されます。

:map g i^M^[

説明:

[Ctrl + V]は「次の文字を引用する」ことを意味します-コマンドに改行とエスケープ文字を埋め込むことができます。

したがって、「g」キーをシーケンスにマッピングしています。

i [Enter] [Escape]

これはカーソルの前に改行を挿入し、挿入モードを終了するためのvimです

調整:

  • 「g」は、使用するコマンドにまだリンクされていない任意の文字に置き換えることができます。
  • コマンドにさらに追加しますe.g。f}i^M^[O-これはf indを}およびi別の改行を挿入し、挿入モードから脱出し、[〜# 〜] o [〜#〜]コードを追加するために空の行をペンします。
  • コマンドを.vimrcまたは.exrcファイルに追加して、永続的にすることができます。先頭のコロンを省略するだけで、コマンドは「map」で始まります

楽しい!

11
Adam Liss

Ctrl + Enterを押してカーソル位置で行を分割する簡単なマッピング:

:nmap <c-cr> i<cr><Esc>

基本的に「挿入」モードに入り、改行を挿入して通常モードに戻ります。

将来使用するために.vimrcファイルに入れてください。

10
Yariv

通常、1行のブロックを3行に拡張する場合は、置換を試してください。開始ブラケットをブラケット/リターンに変更し、終了ブラケットをリターン/ブラケットに変更します。

ブラケットをブラケット/リターンに置き換えるコマンドは次のようになります。

:s/{/{\r/

これを頻繁に使用したいので、次のようにシーケンス全体を未使用のキーストロークにマッピングできます。

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

シーケンスで^ Mが表示されている場合は、[Ctrl-V]と入力し、enterを押します。

サンプル行の任意の場所にカーソルを置いて、マップされたキーを押すと、改行が追加されます。

小切手 :help map-which-keys未使用のキーストロークを選択してマップするためのアドバイス。

4
slothbear

Kを他の何かにマッピングして(好みの別のキーを選択して)マーカー'一時的なマーカーとして大丈夫なのはなぜですか?

:nmap K m'a<CR><Esc>`'

改行を発生させたい文字の上で通常モードでKを押すと、行が分割され、カーソルがあった場所に残ります。

2
mondaugen

autoindent(または他のインデント補助)が有効なときに行を2つに分割すると、Vimはカーソルの右側の空白を自動的に削除します。

これらの設定を使用しない場合は、sの代わりにiを使用して、 s挿入するだけでなく、新しいテキストを空白に置き換えます。 (空白が複数ある場合は、カーソルを左端に置き、代わりにcwを使用します。)

1

これは、Jと反対の動作を期待するものの最も忠実な実装であることがわかりました。

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

カーソルの位置で単純な新しい行を作成し、前の行の末尾の空白があればそれを処理してから、カーソルを正しい位置に戻します。

i<cr><esc> -これは推奨される最も一般的なソリューションの1つです。カーソルの下の空白以外の文字は削除されませんが、末尾の空白も残ります。

^mw -新しい行の先頭に移動して、wの下にマークを作成します

gk -1行上に移動します

:silent! s/\v +$//<cr> -正規表現は行末の空白を置き換えます

:noh<cr> -正規表現がオンになっている可能性があることを強調表示する検索をクリアします

`w -wの下のマークを返します

両方の長所を本質的に兼ね備えています r<esc><cr> そして i<cr><esc>

注:私はこれをバインドしています S 潜在的に便利なキーを上書きしますが、それは次の同義語です cc 分割するほど頻繁に使用しないので、上書きしても大丈夫です。

0
JaredMcAteer

Vimrcでこのキーマッピングを設定します

:map <C-m> i<CR><Esc>h

Vimで使用する場合は、Ctrl + mを押します。

0
Kiddo

入力がある場合:

aaa bbb ccc ddd

出力したい

aaa
bbb
ccc
ddd

次のコマンドを使用できます

f r<ENTER>;.;.
0
Yarden Akin

私見、組み込みマッピングgsは有用なマッピングではありません(vimをスリープ状態にします)。これを分割に使用できます。

nmap gs i<CR><ESC>
0
Hotschke

Vrapper では、挿入モードに入らずに行を分割するgqlを使用できますが、インデントが常に維持されるとは限りません。

0
Janac Meena

基本的に、行を分割するときは、単にキャリッジリターンを挿入するか、スペースを使用している場合はキャリッジリターンに置き換えます。さて、なぜどちらかで解決するのでしょうか? Kのマッピングは次のとおりです。

_"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"
_

三項演算子を使用して、2つのアクションを1つのキーマップに凝縮します。それを分解すると、_<expr>_はキーマップの出力が動的であり、この場合getline('.')[col('.')-1]==' 'という条件に依存することを意味します。最後に、使い慣れた三項演算子_? :_はスペースを改行(_r<CR>_)に置き換えるか、新しいものを挿入します(_i<CR><Esc>_)

これで、Jコマンドへの素敵な姉妹キーマップができました。

0
ctrl

実際、次の複合操作が必要です。

  1. 押す v ビジュアルモードに入る
  2. 分割する行を選択します
  3. 押す :コマンドモードに入る
  4. s/\s/\r/g
  5. 完了
0
Nathan