スペースを生成せずに行を結合する方法は?


73

J行を結合するための標準コマンドは、改行文字をスペースに置き換えます。「文学」を編集するときに役立ちますが、余分なスペースを削除するのを忘れた場合、たとえば、16進ダンプを手動で編集すると、面倒になることがあります。

2つの線の間にスペースを作成せずに結合するための迅速で簡単な方法はありますか?

回答:


87

gJ組み合わせは、これを行います。から:help gJ

[count]行を少なくとも2行で結合します。スペースを挿入または削除しないでください。

Jキーストロークを保存する場合は、に再バインドできます。

:nnoremap J gJ

これはスペースを削除しないことに注意してください。したがって、現在の行がスペースで終わるか、次の行が1つ以上のスペースで始まる場合、そのまま残ります。

そう:

Hello
    world

になる:

Hello    world

我々は可能性が使用しJx、それはなり、この場合にはHelloworld、それはすべてのケースでは動作しません。ヘルプから:

強調表示された行を、少なくとも2行で結合します。インデントを削除し、最大2つのスペースを挿入します

[...]

"gJ"を除くこれらのコマンドは、末尾に空白がないか、次の行が ')'で始まる場合を除き、1つのスペースを挿入します。

そのため、場合によっては複数のスペースが挿入されるか、スペースが挿入されません。私が見る限り、この動作を変更する簡単な方法はありません。gJ常にスペースなしで結合するように変更する関数を作成しました。

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

参照::help J:help 'joinspaces'


この関数を使用するときにカーソルの位置を保持するために「保存」関数を使用することは可能ですか、またはこの結果を取得するにはどうすればよいですか?
SergioAraujo

8

あなたが試みるかもしれない別のトリックは、置換を使用することです。これが役立つ場合もあります。

%s/$\n//g

シナリオ:最後の文字を削除して、次の行と結合します。

%s/=$\n\(.\)/\1/g

例えば、

xxxx=
123

になる:

xxxx123

3

マクロを作成して再利用します。

qaJxq

ここで、スペースなしで2行を結合する場所をa使用し@aて、マクロを再生します。

@@前のマクロを繰り返します。したがって、@複数の行を結合するだけで構いません。


1
入力@aできるのになぜ入力するのですJxか?同じ回数のキーを押して、SHIFTを押します!
シャーバズ

2
@Shahbaz最終行のせいかもしれません:「@を保持できます」
-muru

1
@muru、それは本当です!
シャーバズ

4
また、繰り返し可能なコマンドになるため3@a、3行を結合するために使用できますが、3Jx3行をスペースで結合し、2行目と3行目のスペースを削除して、他の行の間にスペースを残します。
ヘギン

1

常に単一のスペースで参加するには:

nmap J gJi <ESC>ciW <ESC>

スペースなしで参加するには(末尾のスペースと先頭のスペースを削除します):

nmap <C-J> gJi <ESC>diW

1
このサイトへようこそ!あなたのマッピングは私には少し過剰に設計されているように見えますが、それらがどのように機能するかについてもう少し説明を追加できると便利です。
statox

1

マージする行を選択し、通常モードでコロンを入力してExコマンドを入力し:ます。次に、次のコマンドを入力します。

s/$\n\s*//gc

コマンド全体は同様に見えるはずです:

:'<,'>s/$\n\s*//gc

これは実際の微調整版である@のinsidepowerのコマンドスペースでインデントと同様に改行文字を置き換えます。

説明:

  • '<,'> ビジュアルモードで選択された行のみを変更することを意味します。

  • /$\n\s*ある正規表現パターンが。$改行文字で終了し、その後に\n未確定の空白があるマッチを探しています*

  • s/pattern//gcパターンを検索し、確認時に空の文字で置き換えるための代替コマンドです。

Vimの正規表現のフラグとメタキャラクターについて詳しくは、Vimリファレンスのこの章をご覧ください


2
こんにちはubique、ViとVimへようこそ!かなりよく書かれた答えがあります。そのための称賛。私の唯一の短所は、vim正規表現= / = python正規表現であり、ユーザーにとって混乱する場合があることです。代わりに、Vim regexのヘルプドキュメントへのリンクがありますか?
D.ベンノーブル

2
2番目のニット:あなたが参照する答えは@ insidepowerによって書かれ、ピーターによって編集されました。
D.ベンノーブル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.