Bagaimana cara bergabung dengan setiap baris kedua di Vim?

28

Saya ingin bergabung banyak (~ 1000) baris, tetapi hanya setiap aneh dengan yang berikutnya. Dengan tangan aku bisa melakukannya

Jj

500 kali dan sudah selesai. Namun, bagaimana saya bisa menjalankan dua pernyataan ini 500 kali dalam satu perintah tunggal? Mengetik

500Jj

akan bergabung dengan 500 baris berikutnya dan kemudian bergerak ke bawah satu baris.

Contoh:

Saya sudah:

a
b
c
d
e
f
g
h

Saya ingin:

a b
c d
e f
g h

Sunting: Saya mencoba pemetaan:

:map X Jj
500X

tetapi tampaknya saya harus membaca dokumen pemetaan lagi. Tidak bekerja

Boldewyn
sumber

Jawaban:

30

saya akan melakukan ini:

  1. mulai merekam makro 'q': qqJjq

  2. ulangi makro 'q' 500 kali: 500@q

(sebenarnya ini bukan makro yang disebut 'q', itu adalah register bernama bernama 'q'. Alih-alih secara interaktif mengisi register itu seperti pada 1., Anda juga bisa melakukan :let @q = "Jj"dan kemudian melakukan 2.)

akira
sumber
Keren, terima kasih sudah mengingat macronya padaku!
Boldewyn
:% normal J sangat cepat dan mudah (lihat solusi teratas ke-2 di bawah) ... dibandingkan dengan solusi makro ini yang menjalankannya di lebih dari 50.000 baris
ihightower
@ihightower itu sebabnya saya membenarkan jawaban itu juga. 6 tahun yang lalu :)
akira
@ makro makro Anda baru saja menyelamatkan hari saya karena saya hanya membutuhkan solusi makro ini hari ini untuk tujuan yang berbeda.
ihightower
24

Untuk melakukan ini pada setiap baris file:

:%normal J

atau, lebih pendek:

:%norm J

Untuk melakukan ini hanya pada sebagian file, pilih baris dengan Vatau dapatkan rentang dengan cara lain:

:'<,'>global/^/normal J

atau, lebih pendek:

:'<,'>g/^/norm J
Kevin Panko
sumber
Kevin dia sedang mencari untuk menjalankan dua perintah pada setiap file, bukan hanya satu.
JNK
1
penggunaan :gjawaban OP perlu.
Luc Hermitte
2
Ini memang akan bergabung dengan setiap baris kedua. Cobalah!
Kevin Panko
Terima kasih untuk globaltriknya. Namun dalam kasus saya, merekam makro lebih mudah dan lebih cepat.
Boldewyn
2
Hanya tebakan - itu mengeksekusi perintah pada setiap baris secara berurutan, dan setelah melakukan baris pertama, baris kedua sekarang hilang (telah bergabung dengan baris pertama), sehingga dipaksa untuk pindah ke baris ketiga.
Kevin Panko
9

Bagaimana dengan ini:

:g/$/j  

atau

:g/$/j!  

dan kelompokkan setiap tiga baris

:g/$/j3 
Miro
sumber
1
Ini adalah solusi Miro SANGAT bagus. Ini bahkan lebih baik karena Anda dapat menggunakan ini dalam standar vi juga, walaupun anehnya, ketika Anda menggunakan nomor trailing di SVR4.0 vi (seperti pada Solaris) daripada j3 membuat 3 kolom itu membuat 4. (jadi Anda perlu menggunakan j2 di sana untuk mengelompokkan setiap 3 baris)
JohnGH
0

Kami juga dapat bermain dengan:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
sumber
-1

Saya bukan pengguna Vim, tetapi memeriksa dokumen online sepertinya

500(Jj) 

mungkin bekerja karena mem-parsing hal-hal di dalam tanda kurung sebagai satu unit.

JNK
sumber
Hm, terima kasih sudah mencoba, tetapi dalam versi saya Vim mengabaikan tanda kurung. Bisakah Anda memberi tahu saya tautan tempat Anda menemukan sintaks ini?
Boldewyn
1
vimdoc.sourceforge.net/htmldoc/syntax.html - Maaf itu tidak membantu!
JNK
Sebenarnya periksa tautan ini: vim.org/scripts/script.php?script_id=2136 lihat apakah itu sesuai keinginan Anda.
JNK