Bagaimana cara membagi garis menjadi beberapa garis secara efisien?


11

Saya telah menerima data yang dicatat dalam file teks yang hanya satu garis panjang dengan setiap nilai dipisahkan oleh spasi. Apakah ada perintah atau set perintah yang akan membagi satu baris menjadi beberapa baris?

Jawaban:


21

Anda bisa mengganti ruang berurutan di baris dengan baris baru menggunakan perintah :s/\s\+/\r/g. \s\+berarti satu atau lebih karakter spasi putih, dan \rmerupakan baris baru, lihat :help :substitutedan :help regexpuntuk detailnya. Jika Anda menjalankan perintah pada baris seperti:

foo bar baz

Anda mendapatkan:

foo
bar
baz

Jika Anda telah hlsearchmengaktifkan dan Anda tidak ingin mengacaukan layar Anda dengan spasi yang disorot di mana-mana, Anda dapat menulis sedikit fungsi seperti berikut untuk menghindarinya:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"Jika Anda tidak ingin mengacaukan layar Anda dengan ruang yang disorot di mana-mana" ini mengasumsikan terlalu banyak tentang pengaturan OP.
romainl

@romainl Lebih baik?
toro2k

1
Ya, lebih baik IMO.
romainl

2
Ya \r, lihat :help s/\r. Itu bisa digantikan oleh pengetikan baris baru literal <c-v><cr>. Dalam konteks ini \nadalah karakter nol, lihat :help s/\n.
toro2k

1
replaces the content of the register- register yang mana?
stillanoob

5

Menggunakan vimsubstitusi mungkin merupakan salah satu cara yang lebih baik untuk menyelesaikan tugas Anda, tetapi Anda dapat menggunakan makro juga. Misalkan kita memiliki data berikut, dengan kursor di suatu tempat di baris 1:

1 a b c d e f
~

Mulai dalam mode normal, memukul qqakan mulai merekam panggilan makro melalui @q. Apa pun yang diketik setelahnya qqakan dapat diulang melalui panggilan yang disebutkan di atas. Tujuan kami adalah merekam perintah normal yang cukup umum untuk memungkinkan pengulangan yang mulus.

Jadi, kita dapat mengetik 0untuk membawa kursor ke awal baris, lalu fspaceuntuk memindahkan kursor ke spasi pertama. Ini memungkinkan kita untuk mengetik renter, menghasilkan:

1 a
2 b c d e f
~

Memukul qsekarang adalah ide yang bagus karena makro kami yang dapat digunakan kembali siap untuk diulang. Agak sewenang-wenang, kami perhatikan bahwa ada 4 ruang tersisa untuk diganti dengan baris baru. Jadi dengan menekan,, 4@qkami mengulangi qmakro 4 kali menghasilkan:

1 a
2 b
3 c
4 d
5 e
6 f
~

Perhatikan bahwa karena cara kami mengatur makro, akan lebih aman untuk mengulangi perintah lebih dari 9000 kali, karena itu hanya akan mempengaruhi baris saat ini, dan karena tidak ada ruang di sebelah kanan entri data terakhir, fspaceakankah 'baik' gagal, mencegah data diganti dengan baris baru.

Jadi untuk mengulang dari awal:

qq0fspacerenterq9001@q

memberikan hasil kami.


1
Saya suka bahwa Anda memiliki 9001kunci di papan ketik untuk mengetik nama pengguna dengan cepat.
Kaya

4

Cara termudah yang saya temukan untuk memisahkan garis dalam Vim adalah perintah mode normal gq(ketikkan kedua huruf dalam suksesi cepat dalam mode normal atau visual).

Dalam mode visual, itu akan membagi apa pun yang dipilih, dalam mode normal, Anda mengikuti gqdengan gerakan.

Misalnya, gqlakan membagi satu baris dengan lebar yang saat ini ditetapkan. Untuk mengatur lebar garis pemisah menjadi berbeda dari pengaturan Anda saat ini, Anda dapat menggunakan :set textwidth=n, di mana njumlah karakter yang Anda inginkan dalam sebuah garis, misalnya, 10dan mengubah kembali ke lebar normal Anda ketika Anda selesai.

Dapatkan informasi ini dari video Youtube oleh Kholidfu yang menunjukkan cara bergabung dan membagi garis dalam mode normal menggunakan gerakan.

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.