Vimで改行を削除する


271

Vimの行末にある改行を削除して、次の行を現在の行に追加する方法はありますか?

例えば:

Evaluator<T>():
    _bestPos(){
}

行をコピーして前の行に貼り付けることなく、これをすべて1行にまとめたいと思います。カーソルを各行の最後に置いてキーを押し、次の行をカーソルのある行にジャンプさせることができるようです。

最終結果:

Evaluator<T>(): _bestPos(){ }

これはVimで可能ですか?


vimの挿入モードの行末のDelは、私のために機能していました。ただし、すべてのターミナルにあるわけではありません。
Victor Sergienko、2014

回答:


584

最初の行にいる場合、(大文字)Jを押すと、その行と次の行が結合され、改行が削除されます。これをカウントと組み合わせることもできるので、を押す3Jと3行すべてが結合されます。


29
別の答えで述べたように、gJVimがを使用するときに追加することを選択する可能性のあるスペースの追加は避けますJ
Michael Mior 14

5
V(Visual Line Mode)を使用して参加したいすべての回線を選択してから、JまたはgJ
Sbu

あなたはカーソル位置の使用を維持したい場合:join:join!、それはカーソルの位置を維持するラインに参加し、合流点で任意のスペースを確保していません。次のようにマッピングすることもできます:nnoremap <Leader>j :joing<cr>およびnnoremap <Leader>gj :join!<cr>
SergioAraujo 2017

83

もちろん。Vimは\ n文字を改行として認識します。そのため、単に検索して置換することができます。コマンドモードで次のように入力します。

:%s/\n/

1
おかげで、私はグローバルな検索と置換を望んでいません。
derekerdmann、

16
%を削除することでそれが処理されます。その後、カーソルが置かれている行でのみ発生します。または、:11,15s / \ n /(11〜15行目)または:、+ 7s / \ n /(この行と次の7行)または:-3、s / \ n /などの範囲を指定できます。 (前の3行とこの1行)...アイデアを得ます
Tristan

1
または、V-isualブロックを選択してそれを置き換えることができます。
Victor Sergienko、2014

51

通常モードで上の行にいる間に、Shift+を押しjます。

カウントを追加することもできるので3J、一番上の行でそれらすべての行を結合します。


34

他の回答で述べたように、(大文字)Jとsearch + replace for \nは、通常、改行文字を削除し、行を連結するために使用できます。

ただし、最後の行の末尾の改行文字削除するには、Vimでこれを行う必要があります。

:set noendofline binary
:w

1
問題は、ファイルの中央にある2行を連結することです。この答えは、ファイルの最後にある改行を削除します。これは、私が尋ねたものではありません。
derekerdmann、2016年

3
これでうまくいきました。vimを使用して、1行のファイルの最後にある改行を削除しようとしていました。
Locane

:set noendoflineなしで動作しないのはなぜbinaryですか?
ダーウ

32

J余分な先行スペース(存在する場合)を削除し、行を1つのスペースで結合します。(一部の例外を除いて/[.!?]$/、の後、2つのスペースが挿入される場合があります。前/^\s*)/に、スペースは挿入されません。)

その動作を望まない場合gJは、改行を削除するだけで、スペースを使った賢い処理は一切行いません。


10

以下のすべては、カーソルが最初の行にあると想定しています。

通常のマッピングを使用する:

3Shift+J

Exコマンドの使用:

:,+2j

これはの略語です

:.,.+2 join

次のショートカットでも入力できます。

3:j

さらに短いExコマンド:

:j3

2
それらの間にスペースなし:j!3
SergioAraujo 2017

10
set backspace=indent,eol,start

.vimrcでを使用するbackspaceと、挿入モードdelete\n(改行)を使用できます。

set whichwrap+=<,>,h,l,[,]

X(col 1の場合)を使用して、通常モードで前のLFを削除できます。


2

それはおそらくあなたの設定に依存しますが、私は通常これを行います A<delete>

A行末のどこに追加するか。おそらくnocompatibleモードが必要です:)


3
「私は通常、A <delete>でこれを行います」ええ、それが私がここに来た理由です。より良い方法を見つけるために;)vimの要点は、ホームローから手を動かすことではありません。
Luc

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

最初の行のカーソル

今、ノーマルモードで

shift+v
2j
shift+j

または

V2jJ

:通常のV2jJ


1

改行を削除する行でA(行末に追加、挿入モードにする)を押してから、削除を押します。


悲しいことに、それは私にはうまくいかないようです。それは私が見逃したPuTTY設定かもしれません。
derekerdmann、

2
おそらくviバックスペースオプション::help 'backspace'
glenn jackman

1

他のシェルツールを使用してもかまわない場合は、

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
やり過ぎですよね。
derekerdmann、

いいえ、ちがいます。なぜそのやり過ぎだと思いますか?Vim内で行うのは手動です。毎回手動で手動で実行するか、これらの1つのライナーを実行して簡単に実行するかによって異なります。Vimはエディターです。そして、ファイルを処理できるすべてのツールは、基本的には「エディタ」に変装しています。
ghostdog74 10/10/21

5
vimでファイルを開いて使用する方がさらに簡単ggVGJです。
phpが多すぎる

確かに、データをそのように変更する必要があるたびに、手作業で行うほうが簡単だとわかった場合は。どうぞ。また、大きなファイルでそれを実行してみてください。
ghostdog74

私はたくさんのファイルを処理していません。私は数行のコードを圧縮する作業をしています。
derekerdmann、

1

問題は、表示されない複数の文字0A(\ n)が蓄積される可能性があることです。100行目から最後までクリーンアップしたいとします。

ESCと:を入力する(端末の司令官)

:110,$s/^\n//

vimスクリプトで:

execute '110,$s/^\n//'

説明:110から最後まで、新しい行(空白)で始まる行を検索して削除します

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