Bayangkan saya memiliki teks berikut:
some random stuff
* asdf
* foo
* bar
some other random stuff
Saya ingin mengganti peluru asterisk dengan angka, seperti:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Bagaimana ini bisa dilakukan dalam vim?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
sumber
sumber
1.
? Jadi:%s/^* /1. /
akan melakukannya. Sepertinya itu kurang berhasil.Jawaban:
Anda dapat mencoba perintah berikut:
Pertama ia menginisialisasi variabel
c
(let c=0
), kemudian mengeksekusi perintah globalg
yang mencari pola^*
(awal garis, diikuti oleh tanda bintang dan spasi).Setiap kali baris yang mengandung pola ini ditemukan, perintah global mengeksekusi perintah:
let c+=1 | s//\=c.'. '
Itu menambah variabel
c
(let c+=1
), lalu (|
) menggantikan (s
) pola pencarian sebelumnya (//
) dengan evaluasi ekspresi (\=
):isi variabel
c
digabungkan (.
) dengan string'. '
Jika Anda tidak ingin mengubah semua baris dari buffer Anda, tetapi hanya paragraf tertentu, Anda bisa melewati rentang ke perintah global. Misalnya, untuk memodifikasi hanya garis yang jumlahnya antara 5 dan 10:
Jika Anda memiliki file yang berisi beberapa daftar serupa yang ingin Anda konversi, misalnya sesuatu seperti ini:
Anda dapat melakukannya dengan perintah berikut:
Itu hanya varian dari perintah sebelumnya, yang me-reset variabel
c
ketika Anda beralih ke daftar lain. Untuk mendeteksi apakah Anda berada di daftar lain, variabeld
digunakan untuk menyimpan nomor baris terakhir tempat substitusi dibuat.Perintah global membandingkan nomor baris saat ini (
line('.')
) dengand+1
. Jika mereka sama, itu berarti kita berada di daftar yang sama seperti sebelumnya jadic
bertambah (c+1
), kalau tidak berarti kita berada di daftar yang berbeda, begituc
juga reset (1
).Di dalam suatu fungsi, perintah
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
dapat ditulis ulang seperti ini:Atau seperti ini:
Untuk menyimpan beberapa penekanan tombol, Anda juga bisa menentukan perintah khusus
:NumberedLists
, yang menerima rentang dengan nilai default adalah1,$
(-range=%
):Kapan
:NumberedLists
akan dieksekusi,<line1>
dan<line2>
akan secara otomatis diganti dengan rentang yang Anda gunakan.Jadi, untuk mengonversi semua daftar di buffer, Anda harus mengetik:
:NumberedLists
Hanya daftar di antara baris 10 dan 20:
:10,20NumberedLists
Hanya pemilihan visual:
:'<,'>NumberedLists
Untuk informasi lebih lanjut, lihat:
sumber
Ini hanya berfungsi dengan versi Vim terbaru (yang memiliki
:h v_g_CTRL-A
):*
) dan menggantinya dengan0
(kursor pada pertama*
):Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... dan hanya itu :)
(Jika Anda ingin memiliki titik setelah setiap nomor, mengubah langkah 1 ke:
Ctrl-v
j
j
s
0
.
Esc
)sumber
Pilih garis secara visual dan jalankan perintah substitusi ini:
Lihat
:help sub-replace-expression
,:help line()
, dan:help '<
.Untuk menghindari harus memilih garis, pencarian mundur dan maju dengan offset dapat digunakan untuk menentukan rentang substitusi seperti ini:
Lihat
:help cmdline-ranges
sumber
Cara lain:
sumber
Anda juga dapat menentukan operator khusus
Anda bisa memetakannya ke urutan kunci
'*
dan'#
. Tanda*
dan#
tidak ada, sehingga Anda tidak akan menimpa fungsionalitas default apa pun. Alasan untuk memilih'
sebagai awalan adalah untuk mendapatkan semacam mnemonik. Anda menambahkan tanda / tanda di depan beberapa baris. Dan biasanya untuk pergi ke tanda Anda menggunakan awalan'
.Ini juga berfungsi dari mode visual.
Perintah Ex baik untuk scripting, tetapi untuk penggunaan interaktif, operator normal mungkin lebih baik, karena Anda dapat menggabungkannya dengan gerakan atau objek teks apa pun.
Misalnya, Anda dapat beralih daftar diawali dengan tanda bintang atau tanda minus di dalam paragraf saat ini dengan menekan
'*ip
. Di sini,'*
adalah operator danip
merupakan objek teks yang berfungsi.Dan lakukan hal yang sama untuk daftar yang diawali dengan angka di 10 baris berikutnya dengan menekan
'#10j
. Di sini,'#
adalah operator lain dan10j
merupakan gerakan yang menutupi garis-garis di mana operator bekerja.Manfaat lain menggunakan operator kustom, adalah Anda dapat mengulangi edisi terakhir Anda dengan perintah dot.
sumber