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


88

挿入モードに入らずにカーソルがVimにあるところに改行を挿入することは可能ですか?次に例を示し[x]ます(カーソルが上にあることを意味しますx)。

if (some_condition) {[ ]return; }

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

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


INSERTモードに入らずに何かを挿入したいですか?
ジェレミーカントレル

26
@ jeremy-cantrellええ、「J」が次の行に参加して、INSERTモードに入らずに空白を挿入するのと同じです。
awendt

回答:


107

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

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


1
これが最も簡単な解決策だと思います。グレッグに感謝します。
マークA.ニコロージ

4
「f [スペース]」は「W」と同等である必要があります(つまり、次のホワイトスペースに移動します)
Nathan

4
「W」は1文字移動しすぎて、次の空白のに次の文字に移動します。
Greg Hewgill

1
を使用して挿入モードに移行したくない場合は>>、と<<を使用してインデントを支援することもできますs
コナー

12

挿入モードでないときに「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 [入力] [エスケープ]

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

微調整:

  • 'g'は、使用するコマンドにまだリンクされていない任意の文字に置き換えることができます。
  • コマンドにさらに追加します。例: f}i^M^[O -これはf IND }私は別の改行をnsert、そして挿入モードから脱出Oペンあなたはより多くのコードを入力するための空行。
  • コマンドを.vimrcまたは.exrcファイルに追加して、永続的にすることができます。最初からコロンを省略するだけなので、コマンドは「map」で始まります

楽しい!


投稿の質問ではなく、件名の不適切な表現の質問に回答しました。彼が知りたいのは、線が途切れた時点であったが、もはや目的を果たさなくなった空白を簡単に取り除く方法です。
アリストテレスパガルツィス2008年

ありがとう。「微調整」セクションを更新して、作成者が要求したこと(私は思う)を達成しました。私がそれをテストしたとき、viは私のために余分なスペースを自動的に削除しました。削除しない場合は、「x」を使用して削除します。そして、なぜviコマンドがモデムの回線ノイズのように見えるのですか?:-)
Adam Liss

11

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

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

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

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


5

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

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

:s/{/{\r/

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

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

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

サンプル行の任意の場所にカーソルを置き、マップされたキーを押すと、キャリッジリターンが追加されます。

:help map-which-keysマップする未使用のキーストロークを選択する際のアドバイスを確認してください。


ところで:g2つのキーストロークで構成される多くのvimマッピングの「名前空間」キーとして使用されるため、マッピングされません(を参照:h g)。したがって、このマッピングは実際には不要です。
hotschke 2015

g'名前空間'キーとしてすでに使用されていることを報告する優れたコマンドはありますか?
ナマケグマ2015

特にありません。私が言った:help gように、デフォルトg+何かのマッピングのリストを見る1つの方法です。zは、[ ]さらに「名前空間」キー:help indexです。たとえば、を参照してください。を呼び出す:verbose map gと、gで始まる現在定義されているすべてのマッピングを表示できます。役立つウェブリソースはviemu.com/vi-vim-cheat-sheet.gifです。viemu.com / vivimcasts.org / blog / 2014/02 / followvimeo.com / 85343734(スライド:speakerdeck.com/nelstrom/follow-my)です。
Hotschke 2015

3

K他の何かへのマッピングに問題がなく(好みの別のキーを選択)、マーカー'を一時的なマーカーとして使用しても問題がないと仮定して、これを実行しないのはなぜですか?

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

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


1

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

あなたがそれらの設定のいずれかを使用したくない場合は、使用sするのではなくiするためにはsがちょうど挿入するのではなく、空白のためのあなたの新しいテキストをubstitute。(複数の空白がある場合は、カーソルを左端に置き、cw代わりに使用してください。)


1

基本的に、行を分割するときは、キャリッジリターンを挿入するか、スペースにいる場合は、キャリッジリターンに置き換えます。さて、なぜどちらか一方に落ち着くのですか?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]==' '、カーソルの下の文字がスペースであるかどうかをvimに尋ねる長い道のりである条件に依存することを意味します。最後に、おなじみの三項演算子? :は、スペースを改行(r<CR>)に置き換えるか、新しいスペースを挿入します(i<CR><Esc>

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


これはかなり滑らかです。意図的にKを使用したことがあるかどうかはわかりませんが、これを削除するか、他の場所に再マッピングする価値があるかもしれません。
dragon788 2016

0

このキーマッピングをvimrcに設定します

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

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


0

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

nmap gs i<CR><ESC>

0

Vrapperあなたは挿入モードに入らずに行を分割しますが、常にインデントを維持しないことがありGQLを使用することができます。


0

実際、次の組み合わせ操作が必要です。

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


0

これは、反対の動作を期待するものの最も忠実な実装であることがわかりました 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あり、分割するほど頻繁には使用しないため、上書きしても問題ありません。



-1

このマッピングは、所有している1行の関数を分割します。行にカーソルを置き、通常モードで「g」を押すだけです。

:map g ^f{malr<CR>`a%hr<CR>`a

これは、開始ブレースの後にスペースがあり、終了ブレースの前にスペースがあることを前提としています。それがあなたのために働くかどうか見てください。

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