Hapus baris baru di Vim

271

Apakah ada cara untuk menghapus baris baru di akhir baris di Vim, sehingga baris berikutnya ditambahkan ke baris saat ini?

Sebagai contoh:

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

Saya ingin meletakkan ini semua dalam satu baris tanpa menyalin garis dan menempelkannya ke yang sebelumnya. Sepertinya saya harus bisa meletakkan kursor ke akhir setiap baris, tekan tombol, dan lompati baris berikutnya ke kursor yang sama.

Hasil akhir:

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

Apakah ini mungkin di Vim?

derekerdmann
sumber
Del pada akhir baris dalam mode penyisipan vim yang digunakan untuk saya. Namun tidak di setiap terminal.
Victor Sergienko

Jawaban:

584

Jika Anda berada di baris pertama, menekan (huruf besar) Jakan bergabung dengan baris itu dan baris berikutnya bersama-sama, menghapus baris baru. Anda juga dapat menggabungkan ini dengan hitungan, jadi menekan 3Jakan menggabungkan ketiga garis menjadi satu.

Xhantar
sumber
29
Seperti tercantum dalam jawaban lain, gJakan menghindari menambahkan ruang yang Vim dapat memilih untuk add ketika menggunakan J.
Michael Mior
5
Anda juga dapat memilih semua jalur yang ingin Anda gabungkan menggunakan V(Mode Jalur Visual) kemudian tekan JataugJ
Sbu
Jika Anda ingin tetap menggunakan posisi kursor :joindan :join!yang akan bergabung dengan garis menjaga posisi kursor dan tidak menyimpan ruang di titik bergabung. Anda juga dapat memetakannya seperti: nnoremap <Leader>j :joing<cr>dan nnoremap <Leader>gj :join!<cr>.
SergioAraujo
83

Pasti. Vim mengenali karakter \ n sebagai baris baru, jadi Anda bisa mencari dan mengganti. Dalam jenis mode perintah:

:%s/\n/
TinkerTank
sumber
1
Terima kasih, tetapi saya tidak ingin pencarian dan penggantian global.
derekerdmann
16
menghapus% menangani itu. Maka itu hanya akan terjadi pada baris kursor aktif. Atau, Anda dapat menentukan rentang seperti: 11,15s / \ n / (baris 11-15) atau:, + 7s / \ n / (baris ini dan tujuh berikutnya) atau: -3, s / \ n / (sebelumnya tiga baris dan yang satu ini) ... Anda mendapatkan ide
Tristan
1
Atau Anda dapat memilih Vblok -isual dan menggantinya.
Victor Sergienko
51

Saat berada di baris atas dalam mode normal, tekan Shift+ j.

Anda juga dapat menghitung awal hitungan, sehingga 3Jpada baris paling atas akan menggabungkan semua garis tersebut bersama-sama.

Buaya
sumber
34

Seperti jawaban lain yang disebutkan, (huruf besar) Jdan cari + ganti untuk \ndapat digunakan secara umum untuk menghapus karakter baris baru dan untuk menyatukan baris.

Tetapi untuk menyingkirkan karakter baris baru di baris terakhir , Anda perlu melakukan ini di Vim:

:set noendofline binary
:w
Néstor Waldyd
sumber
1
Pertanyaannya adalah tentang menggabungkan dua baris di tengah file - jawaban ini menghilangkan baris baru di akhir file, yang bukan yang saya tanyakan.
derekerdmann
3
Ini berhasil untuk saya. Saya mencoba untuk menyingkirkan baris baru di akhir file baris tunggal dengan vim.
Locane
Kenapa :set noendoflinetidak bekerja tanpanya binary?
darw
32

Jmenghapus spasi memimpin tambahan (jika ada), bergabung dengan garis dengan satu spasi. (Dengan beberapa pengecualian: setelah /[.!?]$/, dua spasi dapat dimasukkan; sebelum /^\s*)/, tidak ada spasi yang dimasukkan.)

Jika Anda tidak menginginkan perilaku itu, gJcukup hapus baris baru dan tidak melakukan apa pun yang cerdas dengan spasi sama sekali.

singkat
sumber
10

Semua yang berikut menganggap bahwa kursor Anda ada di baris pertama:

Menggunakan pemetaan normal:

3Shift+J

Menggunakan perintah Ex:

:,+2j

Yang merupakan singkatan dari

:.,.+2 join

Yang juga bisa dimasukkan dengan cara pintas berikut:

3:j

Perintah Ex yang lebih pendek:

:j3
kzh
sumber
2
Tanpa :j!3
jarak di
10
set backspace=indent,eol,start

di Vimrc Anda akan memungkinkan Anda untuk menggunakan backspacedan deletepada \n(newline) dalam mode insert.

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

akan memungkinkan Anda untuk menghapus LF sebelumnya dalam mode normal dengan X(ketika dalam kolom 1).

laktak
sumber
2

Mungkin tergantung pada pengaturan Anda, tetapi saya biasanya melakukan ini dengan A<delete>

Di mana Aditambahkan di akhir baris. Mungkin membutuhkan nocompatiblemode :)

Wolph
sumber
3
"Aku biasanya melakukan ini dengan A <delete>" Ya itu sebabnya aku datang ke sini; untuk menemukan cara yang lebih baik;). Seluruh titik vim tidak memindahkan tangan Anda dari barisan rumah.
Luc
2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

kursor di baris pertama

SEKARANG, dalam MODE NORMAL lakukan

shift+v
2j
shift+j

atau

V2jJ

: V2jJ normal

Ivan Lopes
sumber
1

Saya hanya akan menekan A (tambahkan ke akhir baris, menempatkan Anda ke dalam mode penyisipan) pada baris di mana Anda ingin menghapus baris baru dan kemudian tekan hapus.

David Watson
sumber
Sayangnya, itu sepertinya tidak berhasil untuk saya; mungkin pengaturan Putty yang saya lewatkan.
derekerdmann
2
mungkin opsi backspace vi::help 'backspace'
glenn jackman
1

jika Anda tidak keberatan menggunakan alat shell lainnya,

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
ghostdog74
sumber
7
Itu agak berlebihan, bukan begitu?
derekerdmann
tidak, tidak. mengapa Anda pikir itu berlebihan? Melakukannya di dalam Vim adalah manual. Itu tergantung pada apakah Anda ingin melakukannya secara manual dengan tangan setiap waktu, atau hanya menjalankan liners satu ini untuk menyelesaikannya dalam sekejap. Vim adalah seorang editor. Dan alat apa pun yang dapat memproses file, pada dasarnya adalah "editor" yang menyamar.
ghostdog74
5
Masih lebih mudah untuk hanya membuka file dalam vim dan gunakan ggVGJ.
terlalu banyak php
tentu, jika Anda merasa lebih mudah melakukannya dengan tangan setiap kali Anda membutuhkan data yang diubah dengan cara itu. Lanjutkan. Juga, coba lakukan itu pada file besar.
ghostdog74
Saya tidak memproses banyak file; Saya hanya bekerja dengan kondensasi beberapa baris kode.
derekerdmann
1

Masalahnya adalah bahwa kelipatan karakter 0A (\ n) yang tidak terlihat dapat menumpuk. Andaikan Anda ingin membersihkan dari baris 100 sampai akhir:

Mengetik ESC dan: (komandan terminal)

:110,$s/^\n//

Dalam skrip vim:

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

Penjelasan: dari 110 hingga akhir mencari baris yang dimulai dengan baris baru (kosong) dan menghapusnya

Sergio Abreu
sumber