Lakukan perhitungan dengan register ekspresi
Anda dapat melakukan perhitungan dalam mode normal dan mode insert.
Mode normal
Dalam mode normal, jika Anda mengetikkan @=
kursor Anda akan pindah ke baris perintah, di mana Anda dapat memasukkan ekspresi apa pun. Ketika Anda menekan enter, hasil dari ekspresi akan dieksekusi sebagai perintah mode normal.
Misalnya, Anda ingin pergi ke kolom tengah dari baris saat ini. Panggilan fungsi col('$')
mengembalikan jumlah kolom dalam baris, sehingga kami dapat melakukan apa dengan mengetik berikut ini:
@=col('$')/2<CR>|
Ketika Anda menekan enter, kursor kembali ke buffer dan vim menunggu operator (seperti |
) seolah-olah Anda baru saja memasukkan nomor. Atau, Anda bisa memasukkan ini:
@=col('$')/2.'|'
... tapi tentu saja itu lebih banyak byte.
Masukkan mode
Anda dapat menggunakan register ekspresi dalam mode sisipkan juga, dengan menekan <Ctrl-r>=
alih-alih @=
. Ini berfungsi sama dalam mode normal, kecuali hasil ekspresi yang Anda masukkan akan dieksekusi dalam mode insert. Misalnya, jika Anda mengetik <Ctrl-r>=col('$')<CR>
, jumlah kolom pada baris saat ini akan dimasukkan pada kursor seolah-olah Anda telah mengetiknya.
Untuk informasi lebih lanjut tentang register ekspresi, ketik :help "=
.
Menggunakan kembali ekspresi
Ekspresi terakhir yang Anda gunakan disimpan dalam register ekspresi "=
,. Mengetik @=<CR>
dalam mode normal atau <Ctrl-r>=<CR>
dalam mode insert akan mengevaluasi ekspresi lagi, memungkinkan Anda untuk menggunakannya seperti makro.
Lakukan perhitungan dalam substitusi
Anda dapat mengevaluasi ekspresi saat melakukan penggantian ekspresi reguler juga. Yang harus Anda lakukan adalah memulai substitusi Anda dengan \=
. Misalnya, Anda ingin memberi nomor pada baris dalam file ini:
foo
bar
baz
Panggilan fungsi line('.')
mengembalikan nomor baris saat ini, sehingga pekerjaan itu mudah. Memasuki ini:
:s/^/\=line('.').' '/g<CR>
... menghasilkan hasil yang diinginkan:
1 foo
2 bar
3 baz
Untuk menggunakan grup yang ditangkap dalam ekspresi seperti itu, Anda dapat menggunakan submatch()
fungsi, di mana misalnya submatch(0)
setara dengan \0
dalam substitusi biasa, submatch(1)
setara dengan \1
, dll. Sayangnya ini memakan banyak penekanan tombol, sayangnya.
Untuk informasi lebih lanjut tentang substitusi ekspresi, ketik :help sub-replace-expression
.