Baru-baru ini saya menyadari bagaimana vim bekerja sangat baik untuk bermain golf, terutama untuk kompleksitas-kolmogorov . Juga, menurut meta vim adalah 'bahasa pemrograman' yang dapat diterima dengan baik setidaknya, untuk cakupan situs ini, yaitu.
Apa tips umum yang Anda miliki untuk bermain golf di Vim? Saya mencari ide yang dapat diterapkan untuk masalah kode-golf dan yang juga setidaknya agak spesifik untuk Vim (mis. "Hapus komentar" bukan jawaban).
Silakan kirim satu tip per jawaban.
Jawaban:
Waspadai varian huruf besar dari perintah umum. Ini sepele dapat menghemat satu keystroke dalam banyak konteks. Sebagai contoh:
Satu lagi adalah menggunakan
G
bukangg
, tetapi hanya jika Anda menggunakan hitungan! Misalnya, tanpa hitungan,gg
pindah ke awal, danG
pindah ke akhir. Namun, dengan hitungan, keduanya bergerak ke baris yang Anda tentukan, jadi5G
lebih pendek dari tapi setara dengan5gg
.Yang lain, adalah untuk digunakan
H
sebagai penggantigg
, tetapi penting untuk dicatat bahwa ini hanya berfungsi jika Anda dapat menjamin bahwa input apa pun tidak akan mengambil lebih dari jumlah baris default (saya percaya ini 24, tetapi mungkin bervariasi).sumber
$
, jadi setidaknyaC
danD
akan menghemat sesuatu).G
dangg
tidak setara. Yang pertama pergi ke ujung buffer dan yang terakhir pergi ke awal.5G
setara dengan5gg
. Saya akan menambahkan beberapa detail tentang hal itu.Kapan saja perintah gagal, itu akan membuat ding noise, yang akan membatalkan makro saat ini. Anda dapat (ab) menggunakan ini untuk membuat bentuk lingkaran kasar. Misalnya, jika Anda ingin mengulangi penekanan tombol
<foobar>
hingga buffer Anda memiliki kurang dari 3 baris di dalamnya. Anda dapat melakukanyang berarti:
Penting untuk dicatat bahwa jika Anda menguji ini dalam sesi vim,
@q
efek samping yang mungkin tidak diinginkan, karena makro diambil dari.vim_profile
. Anda dapat menyiasati ini dengan beberapa cara berbeda. Mungkin solusi terbaik adalah meluncurkan vim denganAnda juga dapat menghapus
.viminfo
.Jika Anda sudah meluncurkan vim, Anda bisa mengetik
di awal nol makro keluar.
Kondisi lain yang bisa Anda ganti dengan 3G adalah
atau
sumber
Ada lebih banyak versi singkat dari perintah ex yang Anda pikirkan. Misalnya, Anda mungkin sudah tahu bahwa
:global
bisa disingkat:g
, tetapi apakah Anda tahu itu:nnoremap
setara dengan:nn
?Sebaiknya jalankan
:h :foo
semua perintah ex yang Anda gunakan dalam jawaban untuk melihat apakah ada versi yang lebih pendek.sumber
adalah selalu setara dengan
yang kebetulan juga setara dengan
cukup mengejutkan. (Secara umum, tanpa bendera, garis miring terakhir dalam
:s
ekspresi tidak pernah diperlukan.)sumber
:%s/x
tidak menghapus setiap kemunculan x, hanya yang pertama pada setiap baris.:&&
untuk mengulangi perintah pengganti dan benderanya.Katakanlah Anda berada dalam mode sisipkan, dan Anda ingin membuat perintah mode normal tunggal. Anda dapat menulis seperti ini:
Jangan lakukan itu. Sebagai gantinya, gunakan
<C-o>
, yang mengeksekusi satu perintah normal lalu segera kembali ke mode penyisipan.sumber
<CR>
setelah<foobar>
mengirim perintah?:
,/
atau?
)Ada tiga operator "perubahan kasus",
Karena ini adalah operator, mereka mengambil gerakan, jadi untuk mengubah karakter saat ini menjadi huruf kecil yang akan Anda gunakan
Di sinilah trik asyik masuk. :) Jika Anda ingin mengubah huruf satu karakter atau baris saat ini, itu satu byte lebih pendek dalam mode visual. Misalnya
gul
setara denganDan
gu_
(_ adalah baris saat ini) setara denganTrik ini tidak berfungsi untuk beralih, karena
v?
memicu pencarian mundur dalam mode visual, (seperti halnyav/
tetapi bergerak ke arah yang berlawanan) sehingga Anda membutuhkannyavg?
. Namun, di sinilah Anda dapat menggunakan~
operator, untuk menyimpan lebih banyak byte! (Terima kasih @ Doorknob untuk menunjukkan ini)Anda dapat melihat trik ini beraksi pada jawaban vim saya di sini , dan pada jawaban V yang setara pada dan posting.
sumber
~
, yang mengubah huruf karakter di bawah kursor dan memindahkan satu ke kanan!Alfabet dalam 10 penekanan tombol
Semua pujian untuk teknik ini diberikan kepada Lynn, yang pertama kali menggunakannya dalam jawaban ini . Saya menulisnya di sini untuk anak cucu.
Gunakan sepuluh penekanan tombol berikut untuk menarik alfabet huruf kecil:
(Di mana
␍
carriage return, yaitu tombol Enter.)Penjelasan
:h<_␍
membuka bagian bantuanv_b_<_example
(contoh pemilihan visual blockwise), yang kebetulan mengandung teksabcdefghijklmnopqrstuvwyxz
.jjY
bergerak ke bawah ke garis itu dan menariknya, laluZZ
menutup jendela bantuan.sumber
Ketahui register Anda
Menyentak atau menghapus teks ke dalam register tertentu (mis.
"aY
) Untuk menggunakannya nanti tidak selalu diperlukan. Vim memiliki beberapa register yang secara otomatis diisi dengan subyek berbagai perintah. Ketik:help registers
untuk melihat semuanya, tapi inilah beberapa catatan khusus:Register tanpa nama:
""
- Teks terakhir yang ditarik atau dihapus.Register bernomor
"0
- Teks terakhir yang ditarik.Register bernomor
"1
-"9
- Teks terakhir yang dihapus kecuali jika kurang dari satu baris. Setiap kali"1
diisi isinya sebelumnya digeser ke"2
dan seterusnya.Register penghapusan kecil:
"-
- Teks terakhir lebih pendek dari satu baris yang telah dihapus.Teks yang dimasukkan terakhir:
".
Secara khusus, register
"-
dan"1
dapat berguna bersama, memungkinkan Anda untuk menghapus beberapa teks dengan misalnyadd
ke dalam"1
register dan menghapus beberapa teks lainnyaD
ke dalam"-
(tentu saja, semantik tidak identik, tetapi seringkali mereka tidak perlu ).Semua register bisa sedikit sulit untuk dilacak, tetapi Anda dapat melihat konten semua register Anda kapan saja dengan mengetik
:registers
.sumber
Ini muncul dalam obrolan sebelumnya, jadi saya pikir saya sebaiknya mempostingnya sebagai tip lengkap.
<C-a>
dan<C-x>
menambah dan mengurangi angka berikutnya di telepon. Ini adalah fitur yang sangat berguna untuk beberapa matematika sederhana, tetapi juga memungkinkan untuk retas kecil yang rapi.Katakanlah Anda harus melompat ke nomor berikutnya. Sebagai contoh, kita perlu berubah
untuk
Cara yang jelas adalah melompat ke 2, lalu lakukan:
Karena ini lebih pendek dari
Ada banyak cara untuk melompat ke 2. Misalnya,
Serta banyak cara lainnya.
Ini semua adalah 2 (atau lebih) penekanan tombol. Namun, karena
<C-a>
dan<C-x>
tidak hanya angka kenaikan / penurunan, tetapi juga melompat ke nomor berikutnya, kita dapat mengambil byte dengansumber
Gerakan golf
Seringkali jika Anda bekerja dengan blok teks (terutama dalam tantangan ascii-art ), Anda harus pindah ke karakter pertama atau terakhir dalam buffer.
G
dangg
cukup bagus, tetapi ada beberapa hal yang mengganggu. Misalnya, untuk mendapatkan karakter terakhir, Anda perluG$
dangg
tidak akan selalu menempatkan Anda di kolom pertama jika ada spasi putih terkemuka. Berikut adalah beberapa gerakan yang lebih baik, meskipun perhatikan bahwa itu hanya berfungsi jika teks Anda tidak memiliki garis kosong di tengahnya:Karakter pertama buffer:
{
lebih baik daripadagg0
. Jika ada baris kosong di tengah teks, Anda juga bisa menggunakango
yang membawa Anda ke karakter pertama di buffer tidak peduli apa.Karakter terakhir buffer:
}
lebih baik daripadaG$
Ini juga berfungsi sebagai argumen untuk operator, tetapi perhatikan bahwa itu adalah gerakan karakter-bijaksana, bukan gerakan garis-bijaksana!
sumber
H
lebih golf darigg
H
tidak dapat diandalkan. Perilaku itu tergantung pada ukuran jendela yang terlihat dan di mana Anda berada di buffer. (Dipetakan kembali dalam V untuk menghindari kebingungan ini)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: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:... 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:Panggilan fungsi
line('.')
mengembalikan nomor baris saat ini, sehingga pekerjaan itu mudah. Memasuki ini:... menghasilkan hasil yang diinginkan:
Untuk menggunakan grup yang ditangkap dalam ekspresi seperti itu, Anda dapat menggunakan
submatch()
fungsi, di mana misalnyasubmatch(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
.sumber
i1 <esc>bqqywjPb<C-a>@qq@q
adalah solusi mode normal murni yaitu 5 byte lebih pendek. Dan jika Anda menggunakan unix, Anda bahkan dapat melakukannya:%!nl
. Meski begitu, kiat-kiatnya tetap bagus!Anda dapat secara langsung memodifikasi teks makro, yang bisa secara signifikan lebih pendek daripada persyaratan berbelit-belit. Sebagai contoh, katakanlah Anda ingin menempelkan sesuatu n kali, di mana n adalah input pengguna. Saya pertama kali mencoba melakukan ini:
Penjelasan:
Ini adalah 18 penekanan tombol, dan cara yang sangat buruk untuk melakukannya. Alih-alih, buka lokasi nomor itu, dan lakukan ini:
Penjelasan:
Ini adalah 9 penekanan tombol, peningkatan besar.
Edit:
Bahkan lebih pendek adalah menjalankan makro untuk nomor Anda, dan kemudian ketik perintah Anda. Sebagai contoh:
Penjelasan:
7 penekanan tombol.
sumber
D
, bukandd
. 2. Jika perintah tidak melibatkan register, Anda dapat membuatnya lebih pendek. Misalnya, jika Anda ingin mengulang karakterx
sebanyak nomor di bawah kursor, alih-alih"qD@qix<esc>
, gunakanD@"ix<esc>
.