Bagaimana cara menggabungkan garis tanpa menghasilkan spasi?


73

JPerintah standar untuk bergabung dengan baris menggantikan karakter baris baru dengan spasi. Ini berguna ketika mengedit 'literatur' tetapi dapat menyusahkan jika saya, katakanlah, mengedit hex dump dengan tangan jika saya lupa untuk menghapus ruang yang berlebihan.

Apakah ada metode cepat & mudah untuk menggabungkan dua garis tanpa menghasilkan spasi di antara keduanya?

Jawaban:


87

The gJKombinasi hal ini; dari :help gJ:

Bergabunglah dengan [hitung] baris, dengan minimal dua baris. Jangan masukkan atau hapus spasi apa pun.

Anda dapat mengubahnya menjadi ulang J, jika Anda ingin menyimpan penekanan tombol:

:nnoremap J gJ

Perhatikan bahwa ini tidak menghapus spasi apa pun, jadi jika baris saat ini berakhir dengan spasi atau baris berikutnya dimulai dengan satu atau lebih spasi, mereka akan dibiarkan apa adanya .

Begitu:

Hello
    world

Menjadi:

Hello    world

Kita bisa menggunakan Jxdalam kasus ini, maka itu akan terjadi Helloworld, tetapi itu tidak akan berhasil dalam semua kasus; dari bantuan:

Bergabunglah dengan garis yang disorot, dengan minimal dua garis. Hapus indentasi dan masukkan hingga dua spasi

[...]

Perintah-perintah ini, kecuali "gJ", menyisipkan satu spasi di tempat dari kecuali ada spasi putih tambahan atau baris berikutnya dimulai dengan a ')'.

Jadi dalam beberapa kasus lebih dari satu ruang atau tidak ada ruang yang dimasukkan. Sejauh yang saya bisa lihat, tidak ada cara mudah untuk mengubah perilaku ini; Saya membuat fungsi untuk dimodifikasi gJagar selalu bergabung tanpa spasi:

" 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>

Lihat juga: :help J,:help 'joinspaces'


Apakah mungkin menggunakan beberapa fungsi "Pertahankan" untuk menjaga posisi kursor saat menggunakan fungsi ini atau bagaimana cara mendapatkan hasil ini?
SergioAraujo

8

Trik lain yang dapat Anda coba adalah menggunakan penggantian. Terkadang ini mungkin berguna.

%s/$\n//g

Skenario: Hapus karakter terakhir dan gabung dengan baris berikutnya:

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

Sebagai contoh,

xxxx=
123

menjadi:

xxxx123

3

Buat makro dan gunakan kembali:

qaJxq

Sekarang putar ulang makro, adengan menggunakan di @amana pun Anda ingin bergabung dengan dua baris tanpa spasi.

@@akan mengulangi makro sebelumnya. Jadi Anda bisa tahan @untuk bergabung dengan beberapa baris.


1
Mengapa mengetik @aketika Anda bisa mengetik Jx? Jumlah penekanan tombol dan penekanan SHIFT yang sama!
Shahbaz

2
@Shahbaz Mungkin karena baris terakhir: "Anda bisa tahan @"
muru

1
@uru, itu benar!
Shahbaz

4
Ini juga membuatnya menjadi perintah berulang, sehingga Anda dapat menggunakan 3@auntuk bergabung dengan 3 baris, sedangkan melakukan 3Jxakan bergabung dengan 3 baris dengan spasi dan kemudian menghapus spasi antara baris kedua dan ketiga, meninggalkan spasi di antara baris lainnya.
Haegin

1

Untuk selalu bergabung dengan satu ruang:

nmap J gJi <ESC>ciW <ESC>

Untuk bergabung tanpa spasi sama sekali (menghilangkan trailing + ruang terdepan):

nmap <C-J> gJi <ESC>diW

1
Selamat datang di situs ini! Pemetaan Anda terlihat sedikit terlalu direkayasa untuk saya, akan sangat membantu jika Anda bisa menambahkan sedikit penjelasan tentang cara kerjanya.
statox

1

Pilih garis yang ingin Anda gabungkan, masukkan perintah Ex dengan mengetikkan titik dua :dalam mode normal. Kemudian ketik perintah ini:

s/$\n\s*//gc

Seluruh perintah harus terlihat juga:

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

Ini sebenarnya adalah versi tweak dari perintah @ insidepower yang menggantikan lekukan spasi serta karakter baris baru.

Penjelasan:

  • '<,'> berarti kami hanya memodifikasi garis yang dipilih dalam mode visual.

  • /$\n\s*adalah pola regex . Kami mencari kecocokan yang diakhiri $dengan karakter garis baru \ndan *setelahnya memiliki jumlah spasi putih yang tidak ditentukan .

  • s/pattern//gcadalah perintah pengganti untuk menemukan setiap pola dan menggantinya dengan karakter kosong pada konfirmasi.

Untuk mengetahui lebih lanjut tentang flag dan metacharacters untuk ekspresi reguler di Vim, lihat bab Referensi Vim ini.


2
Halo, selamat datang di Vi dan Vim ! Anda punya jawaban yang cukup bagus di sana; pujian untuk itu. Satu nitpick saya adalah vim regular expressions = / = python regular expressions, dan kadang-kadang membingungkan pengguna. Mungkin menautkan ke dokumen bantuan untuk Vim regex saja?
D. Ben Knoble

2
Nit kedua: jawaban yang Anda referensi ditulis oleh @ insidepower dan diedit oleh Peter.
D. Ben Knoble
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.