Saya memiliki file teks seperti ini (menggunakan gVim di Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Saya ingin menambahkan nomor ke setiap baris dalam file. Tidak menggunakan :set number
, tetapi untuk menambahkan nomor sebagai teks sebelum setiap baris, sebagai berikut, sehingga nomor tersebut merupakan bagian dari file.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
sumber
sumber
awk
mungkin alat untuk pekerjaan ini. Tapi saya di Windows (menghela napas).cat
ataunl
, yang dapat melakukan garis bilangan, tetapi umumnya tidak tersedia pada Windows (seperti yang ditunjukkan OP dari komentar mereka tentangawk
). Dua solusi teratas adalah Vim murni. Terakhir, semua baris vs satu para hanya masalah pemilihan rentang. Jelas bukan masalah besar.Jawaban:
Dalam mode Vim murni:
Penjelasan:
Lihat
:help \=
dan:help line()
.Menggunakan ekspresi di bagian pengganti sangat kuat dan FWIW titik masuk yang cukup bagus ke vimscript.
sumber
:help sub-replace-expression
Satu hal yang menyenangkan tentang Vim macro adalah mereka dapat berulang (mereka dapat memanggil diri mereka sendiri):
qqq
ggI1.
(jangan lupa spasi!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
Makro kemudian akan terus memohon sendiri hingga mencapai akhir file.
Anda dapat menggunakan trik makro rekursif untuk banyak masalah serupa lainnya, jadi ini baik untuk diperhatikan.
Jika Anda tidak ingin menggunakan makro rekursif karena suatu alasan, Anda bisa menghilangkan langkah 1 dan 8, dan menggunakan hitungan untuk menjalankan makro berkali-kali, misalnya
100@q
akan menjalankan makroq
100 kali.sumber
Saya suka menggunakan perintah global vim untuk menyelesaikan tugas-tugas seperti ini. Ini berlaku untuk menambahkan iterasi ke awal baris atau memodifikasi simbol dalam teks. Ini terlihat lebih rumit daripada solusi lain, tetapi merupakan pola yang cukup fleksibel untuk digunakan saat Anda menggunakannya, dan mudah untuk dimodifikasi tanpa banyak pemikiran.
Pertama, pilih rentang Anda (baris mana yang ingin Anda terapkan ini). Saya biasanya menggunakan tanda (misalnya
ma
pada baris pertama danmb
pada baris kedua, tetapi Anda juga dapat menggunakan nomor baris atau pemilihan visual), kemudian masukkan modifikasi dari perintah berikut (saat ini di-tweak untuk use case Anda)Dekonstruksi
Ini mengatur variabel
i
dengan nilai awal. Biasanya daftar dimulai dengan 1, jadi saya mengatur i ke 1.Bilah memulai perintah baru
Ini mengatur rentang perintah selanjutnya. Saya beralih dari satu tanda
a
ke tanda lainnyab
, yang akan ditetapkan pada baris pertama dan baris terakhir dari daftar Anda.Ini adalah perintah global. Itu mencari file (atau rentang) untuk ekspresi reguler yang diberikan, dan akan mengeksekusi sisa baris perintah pada setiap baris yang cocok. Saya mencocokkan setiap baris dengan mencari "awal baris". Jika Anda memiliki teks suka
dan hanya ingin meletakkan label ini di depan
Item
dan mengabaikan baris lain, lakukang/Item/
ataug/^Item/
sebaliknya (dengan asumsi teks Item literal)Ini mengeksekusi ekspresi reguler untuk mengganti awal baris dengan nilai
i
digabungkan dengan a.
. Secara umum Anda dapat melakukan ini untuk apa saja (ganti labelItem
dengan nomor, misalnya).Meskipun bilah memulai perintah baru, bilah ini mengatur perintah kedua untuk dijalankan di dalam perintah global, alih-alih setelah global selesai. Hasilnya adalah kita bertambah
i
sebelum baris berikutnya diproses oleh g. Di sini ada tempat lain untuk fleksibilitas. Modifikasi i dapat berupa apa saja (selisih 2, sebut fungsi yang menghasilkan elemen berikutnya dari deret Fibonacci, apa pun).sumber
Tambahkan angka ke semua baris
Mungkin untuk menggunakan
:%!nl -ba
atau:%!cat -n
perintah yang akan menambahkan nomor baris ke semua baris.Di Windows, Anda harus menginstal Cygwin / MSYS / SUA.
Tambahkan angka ke baris yang dipilih
Untuk menambahkan angka hanya untuk baris yang dipilih, silakan pilih dalam mode visual ( vdan kursor), kemudian ketika selesai - jalankan perintah:
:%!nl
(abaikan baris kosong) atau:%!cat -n
(baris kosong disertakan).Memformat
Untuk menghapus spasi tambahan, pilih di blok visual ( Ctrl+ v) dan hapus ( x).
Untuk menambahkan beberapa karakter (
.
,:
,)
) setelah nomor, pilih mereka dalam blok visual ( Ctrl+ v), kemudian tambahkan karakter ( A, ketik karakter, kemudian menyelesaikan dengan Esc).sumber
Modifikasi jawaban romainl :
Ini tidak hanya akan menambahkan nomor baris, itu juga akan menggantikan nomor baris yang sudah ada di sana. Tentu, jika Anda memasukkan garis di tengah jalan, itu akan memberi nomor baru semuanya seperti yang diharapkan.
Ini berfungsi dengan mengganti angka apa saja yang diikuti oleh a. dan spasi di awal baris dengan nomor baru. Ini jelas akan pecah jika Anda memiliki garis yang sudah dimulai dengan pola ini, jadi gunakan dengan pemikiran.
Bagian yang ditambahkan:
^
- Mulai dari garis\(
- Mulai subkelompok baru\d\+
- Cocokkan satu digit sekali atau lebih\.
- Cocokkan titik (
.
) dan spasi.
\)
- Akhiri subkelompok\?
- Jadikan grup opsional, sehingga berfungsi seperti sebelumnya jika belum ada nomor pada baris ini.Petunjuk bonus:
Untuk menghapus nomor baris, Anda dapat menggunakan pola yang sama dengan bagian repalce kosong:
sumber
Ini nomor dua baris pertama, dan Anda dapat menekan
@q
ke nomor baris berikutnya (atau ketik ex.18@q
Jika Anda ingin nomor 20 baris total).Penjelasan:
Manfaatnya adalah tidak memerlukan perintah eksternal, yang berguna jika Anda bekerja dengan Vim di Windows, misalnya.
sumber
1. <esc>h
Anda berada di kolom kedua, bukan kolom pertama. Saya akan menggantih
dengan0
, setelah itu saya pikir solusi Anda harus sangat bagus.^
tunggu karakter kedua untuk memungkinkan kombinasi pengetikan seperti^a -> â
. Saya masih setuju ini solusi terbaik, tetapi saya pikir ini harus disebutkan juga.Saya pikir jawaban yang dipilih adalah yang terbaik, tetapi dalam sprit of variety, saya akan menawarkan alternatif menggunakan program eksternal:
Ini akan memfilter seluruh buffer Anda (sebagaimana dilambangkan oleh
%
) melalui program eksternalcat
,, di mana-n
flag mendahului setiap baris input dengan nomor baris.Ini, tentu saja, mengharuskan Anda
cat
menginstal, yang berlaku untuk (mungkin) semua sistem mirip Unix.Lihat
:help :range!
detail selengkapnya tentang pemfilteran melalui program eksternal.sumber
msysgit
dan menambahkannya ke PATH Anda (IIRC ini adalah opsi instal), solusi ini juga harus bekerja pada Windows.cat -n
bukan POSIX, tetapinl
, jadi itu mungkin pilihan yang lebih baik.Solusi sedikit meretas mungkin sebagai berikut (semua yang ditulis antara <dan> harus dimasukkan setelah menekan Ctrl+ v):
Dekonstruksi
menjalankan perintah mode normal pada setiap baris yang ditentukan oleh rentang, dalam hal ini setiap baris
mengalihkan setiap output yang dibuat oleh perintah ex ke buffer tanpa nama.
adalah perintah ex yang menampilkan nomor baris saat ini (sayangnya, baris baru sebelumnya)
berhenti mengarahkan ulang ke buffer yang tidak disebutkan namanya
menyisipkan konten buffer tanpa nama dengan a. dan tab untuk ke depan setiap baris dan keluar dari mode insert.
berjalan satu baris ke atas dan menghapus baris baru yang merupakan hasil dari perintah:. =
sumber