Saya telah bekerja di Vim selama delapan tahun dan terus-menerus menemukan sesuatu yang baru. Itu dianggap sebagai kebajikan Vim. Bagi saya, ini adalah kurangnya keterbukaan: banyak fungsi tersembunyi tersembunyi terlalu dalam.
Mereka berbicara tentang keindahan pengeditan modal dan objek teks, tetapi bagi saya sepertinya esensi Vim bukanlah itu. Vim adalah selimut tambal sulam dari subsistem yang tersumbat dengan alat tambahan. Hanya dalam mode pengeditan normal lebih dari seratus pintasan keyboard! Kerapatan toolkit ini sebagian besar menjelaskan mengapa Vim sangat berguna. Jika "tampilkan semua tag untuk kata kunci" hanya
g]
, maka perintah ini akan lebih sering digunakan.
Dalam sistem dengan kurangnya keterbukaan, seseorang harus mengandalkan kepemimpinan. Tetapi bagi Vim tidak banyak dari mereka. Ada artikel untuk pemula, seperti
ciw
(jangan bingung dengan CIA,
manual CIA untuk Vim ) dan sejenisnya. Dan ada artikel para ahli yang terbenam dalam subsistem. Tapi tidak ada yang benar-benar berbicara tentang trik khusus yang membuat Anda berseru: sial, seperti yang saya butuhkan selama enam tahun terakhir!
Artikel ini adalah tentang beberapa trik kecil yang saya gunakan di Vim. Tak satu pun dari mereka dibongkar dalam semua detail, jadi jika ada yang tertarik, saya sarankan menggali informasi tambahan. Mereka juga tidak berhubungan satu sama lain. Tapi ini normal. Secara umum, ada lebih dari cukup untuk benar-benar membantu hampir semua orang.
Struktur artikel
Sangat kasar, pengguna Vim terbagi dalam dua kategori.
Puritan menghargai ukuran kecil dan di mana-mana. Sebagai aturan, mereka meminimalkan konfigurasi jika Anda harus bekerja pada komputer yang tidak dikenal (misalnya, melalui ssh). Ekstensor, di sisi lain, mengisi Vim dengan plugins, fungsi, dan pemetaan homegrown dalam upaya yang sia-sia untuk berpura-pura menggunakan Emacs. Jika Anda mengambil vimrc dari mereka, maka orang-orang akan tetap benar-benar tak berdaya.
Seperti yang mungkin Anda tebak, saya jauh lebih dekat ke ekspander daripada puritan. Saya membagi trik menjadi dua bagian tergantung pada apakah perubahan diperlukan di dasar Vim.
Puritan
Untuk perintah modal, tampilan bantuan standar digunakan, yaitu,
<cr>
berarti menekan tombol Enter. Saat Anda membutuhkan bantuan
:h
untuk baris tertentu, misalnya
:h E676
, baris akan berada dalam tanda kurung.
Berbagai perintah dalam mode normal
": dan @:
":
adalah register yang memegang perintah terakhir dieksekusi. Anda dapat mengetik
":p
untuk mencetaknya ke buffer.
@:
mengulangi perintah terakhir.
"=
Daftar untuk "ekspresi." Di sini Anda dapat memasukkan ekspresi vimL dan menyisipkannya, gunakan dengan ctrl-R, dll. Jadi, misalnya, cap waktu lokal dimasukkan dengan mengetikkan
"=strftime("%c")<cr>p
.
ma, 'A
m{letter}
menempatkan tanda pada posisi kursor. Kemudian
'{letter}
akan menuju ke baris ini. Untuk huruf kecil, ini berfungsi pada buffer, sehingga cocok untuk navigasi. Ini berfungsi secara global untuk huruf besar: bahkan jika Anda berada di file lain,
'A
akan pergi ke file berlabel
Anda dapat melihat semua tag Anda dengan perintah
:marks:
ctrl-A dan ctrl-X
Menambah dan mengurangi angka berikutnya dalam barisan di lokasi kursor atau di sebelah kanannya. Karena langsung menuju ke nomor, kombinasi dapat digunakan dari mana saja.
10c-A
jauh lebih sederhana daripada
wwwwwciw20
.
q:
Membuka sejarah tim sebelumnya. Anda dapat menggunakannya dengan teks Vim apa pun, tetapi perubahannya tidak disimpan. Namun, Anda dapat menjalankan perintah yang dimodifikasi menggunakan
<CR>
. Ini memungkinkan Anda untuk dengan cepat mengubah dan memulai kembali perintah atau mencari yang lama untuk digunakan kembali.
q /, q?
Sama seperti
q:
kecuali pencarian.
ctrl-I, ctrl-O
Pindah ke lokasi berikutnya atau sebelumnya di jumplist. Berguna untuk pemeriksaan cepat dan kemudian mundur. Sangat bagus untuk membaca file bantuan.
Makro
Lihat
posting ini untuk wawasan lebih dalam tentang penggunaan makro.
Mode visual
gv
Memilih item visual sebelumnya.
v_o
Pergi ke sisi lain dari blok visual. Berguna jika Anda memulai satu baris terlalu rendah atau sesuatu seperti itu. Dalam mode blok, ia pergi ke sudut diagonal yang berlawanan, dan menggunakan
v_O
untuk beralih ke
v_O
horizontal yang berlawanan.
g ctrl-A / ctrl-X
Dalam mode visual, ctrl-A hanya menambah angka pertama pada setiap baris. Di sisi lain,
g ctrl-A
akan bertambah satu baris dengan setiap baris. Ini jauh lebih mudah untuk dijelaskan dalam tabel:
Operator: v, V, cv (: h o_v)
Anda mungkin tahu bahwa dalam mode visual Anda dapat memilih karakter (v), garis (V) dan blok (ctrl-V). Tetapi ketiga kombinasi ini dapat digunakan sebagai operator gerak untuk fragmen yang sesuai. Misalnya, Anda memiliki teks berikut:
abc
abc
abc
Jika Anda meletakkan kursor di atas
b
dan menekan
d2j
, itu akan menghapus ketiga baris, karena
j
memindahkan baris demi baris. Jika
d<cV>2j
ditekan sebagai gantinya, gerakan menjadi blok demi blok dan hanya kolom tengah dengan tiga huruf
b
yang dihapus.
Satu use case adalah delete in search. Normal
d/
memindahkan karakter demi karakter. Oleh karena itu, saya menggunakan
dV/
untuk gerakan baris demi baris dengan penghapusan. Ada cara lain untuk melakukan ini:
/ regex / {n}
Gerakan n garis di bawah pasangan, atau sebanyak baris jika nilainya negatif. Sebagai efek samping, gerakan terjadi garis demi garis. Jadi, jika Anda ingin menghapus baris pertama yang berkaitan dengan
regex
, Anda dapat memasukkan
d/regex//0
.
Mantan tim
Anda memasukkan ex-command dalam mode perintah, misalnya, perintah
:s
. Selain penggantian, ada banyak perintah berguna lainnya. Semua contoh ini memerlukan rentang, seperti
%
.
: g / regex / ex
Menjalankan perintah hanya pada baris yang cocok dengan ekspresi reguler. Misalnya, Anda dapat memasukkan
g/regex/d
untuk menghapus semua baris yang cocok dengan regex. Perintah
v
mirip dengan
g
, tetapi bekerja pada semua baris yang
tidak cocok dengan ekspresi reguler.
Trik menjadi lebih kuat dengan norma dan beberapa yang lain.
: norm {Vim}
Bertindak seolah-olah Anda menjalankan {Vim} di setiap baris rentang. Sebagai contoh,
g/regex/norm f dw
akan menghapus kata pertama setelah spasi pertama di setiap baris yang berhubungan dengan ekspresi reguler regex. Ini seringkali jauh lebih sederhana daripada makro.
norm
mematuhi semua perbandingan Anda. Sebagai contoh, jika Anda menetapkan
jk
ke
<esc>
dalam mode insert, maka
norm I jk$diw
akan menambahkan spasi ke awal baris,
tinggalkan mode insert , lalu hapus kata terakhir di baris tersebut. Saya sangat suka fungsi ini, tetapi jika Anda memilih untuk tidak menggunakan pemetaan, maka Anda dapat menerapkan
norm!
.
: co.
Menyalin rentang ke garis saat ini. Anda juga dapat menentukan nilai arbitrer alih-alih suatu periode, misalnya,
+3
atau
'a. mv
'a. mv
untuk pindah.
: y {reg}
Menyalin rentang ke register
{reg}
. Jika
{reg}
dikapitalisasi, ditambahkan ke kas yang ada. yaitu tim seperti itu
let @a = '' | %g/regex/y A
akan menyalin ke semua baris yang sesuai dengan
regex
di seluruh file. Ini membantu untuk mengekstrak teks yang rusak dari file dan menyalinnya ke clipboard sistem (menggunakan
let @+ = @a
).
: windo {ex}
Menjalankan perintah di semua jendela. Sebagai contoh
:windo $
semua jendela ke bawah. Ada
bufdo
,
tabdo
,
tabdo
dan lainnya.
Bekerja sangat baik dengan
g
dan
s
. Untuk mengganti semua kombinasi
AA
dengan
BB
dengan pratinjau penggantian, Anda dapat memasukkan
vimgrep AA
dengan memuat semua pertandingan dalam perbaikan cepat dan kemudian
cdo s/AA/BB/cge
untuk mencari / mengganti semua pertandingan.
Vim untuk Extender
Tercantum di sini adalah trik yang memerlukan penyimpanan dalam pengaturan atau mengubah sesi Vim. Hipotetis, mereka dapat digunakan dalam mode "puritan", hanya dengan memasukkan perintah, tetapi beberapa melibatkan perubahan yang cukup serius yang bertentangan dengan semangat purisme.
Ini hanya yang paling tidak biasa. Banyak orang menugaskan
H
pada tutup
^
, sehingga hal-hal seperti itu tidak layak disebutkan. Juga, tidak masuk akal untuk berbicara tentang
vim-sensible
sense atau
vim-surround
, tetapi hanya tentang plugin yang lebih eksotis.
Jika Anda terus-menerus mengkonfigurasi vimrc Anda, silakan sendiri dan tambahkan perintah terpisah untuk ini:
command! Vimrc :vs $MYVIMRC
Pengaturan
Saya memiliki semua pengaturan, binding kunci dan fungsi yang disimpan dalam satu file vimrc. Membagi menjadi beberapa file membuat pencarian menjadi sulit.
Sebagian besar pengaturan sebenarnya bukan "trik". Cara terbaik untuk melihat
vim-masuk akal : hampir semua pengaturan dari sana akan sesuai dengan vimrc Anda.
atur lazyredraw
Jangan menggambar ulang layar di tengah makro (untuk meningkatkan kinerja).
atur smartcase / ignorecase
Dengan dua pengaturan ini, pencarian tanpa huruf kapital menjadi tidak peka huruf besar kecil, dan pencarian dengan huruf besar sensitif huruf besar-kecil.
atur undofile
Menyimpan tindakan, bahkan jika Anda menutup dan membuka Vim, sehingga tindakan undo selalu tersedia. Sangat berguna dalam kombinasi dengan plugin undotree.
atur kolom lipat = {n}
Kolom sisi dengan blok yang diciutkan. Semakin besar
n
, semakin banyak blok yang diciutkan ditampilkan di kolom, dan sisanya ditunjukkan.
set suffixesadd = {str}
gf
biasanya berarti "pergi ke file di bawah kursor", tetapi membutuhkan ekstensi file di baris.
suffixesadd
menambahkan ekstensi yang ditentukan. Jika
suffixesadd=.md
, maka perintah
gf
pada baris 'foo' akan mencari file
foo
dan
foo.md
set inccommand = nosplit
Hanya untuk Neovim.
incommand
menunjukkan waktu nyata perubahan apa yang akan dilakukan tim. Hanya
s
yang saat ini didukung, tetapi bahkan ini sangat berguna. Jika Anda memasukkan
:s/regex
, semua kecocokan disorot. Jika Anda kemudian menambahkan
/change
, itu akan menampilkan semua penggantian. Bekerja dengan semua properti regex, termasuk backlink dan grup.
atur statusline (: h statusline)
Menentukan apa yang akan ditampilkan di panel di bagian bawah setiap jendela. Di sini pemformatan jauh lebih rumit dan rumit daripada di pengaturan lain, jadi Anda harus menghabiskan waktu untuk menjelaskannya. Ada beberapa trik sederhana. Pertama, lihat bilah status Vim default:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Di sini lebih mudah untuk mengganti
%P
(persentase file di atas kursor). Format bilah status adalah nilai setelah tanda persen di kawat gigi. Oleh karena itu, untuk file Penurunan harga, Anda dapat menulis ini:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %{wordcount()[\"words\"]}
Dan ganti persentase file dengan jumlah kata dalam dokumen.
Atau pasang
tabline
. Jika Anda tidak menggunakan tab, maka baris ini dapat dibuat "garis status global". Sebagai contoh
set tabline=%{strftime('%c')}
akan selalu menampilkan tanggal di atas.
Ikatan Kunci
Saya punya
banyak ikatan.
Banyak tombol praktis di Vim secara bodoh ditugaskan secara default. Misalnya, menyimpan keystroke
s
identik dengan
cl
(saving one keystroke), dan
U
sama dengan
u
, kecuali untuk tulisan undo sebagai perubahan baru, yang secara fungsional tidak berguna.
Q
identik dengan
gQ
dan bagaimanapun jebakan yang luar biasa.
Z
hanya digunakan untuk
ZZ
dan
ZQ
. Astaga, bahkan manual Vim merekomendasikan penugasan kembali
_
dan kunci untuk beberapa fungsi, karena "Anda mungkin tidak pernah menggunakannya." Saya lebih suka tidak menyimpan satu klik, tetapi untuk menambahkan fungsi yang sama sekali baru ke keyboard. Inilah beberapa ikatan saya:
nnoremap Q @@
Tanpa memperlambat transisi ke mode ex, ulangi makro terakhir.
nnoremap s "_d
Itu membuat kunci
s
(dengan pengaturan yang sesuai untuk
ss
dan
S
) berfungsi seperti d, hanya tanpa menyimpan teks yang dihapus dalam register. Berguna agar tidak menyumbat register.
nnoremap <cj> <cw> j
Buka jendela di bawah ini. Penugasan yang sesuai untuk
h
,
k
,
l
. Bekerja dengan windows jauh lebih mudah.
nnoremap <leader> e: exe getline (line ('.')) <cr>
Jalankan baris saat ini seolah-olah itu adalah perintah. Dalam eksperimen, seringkali lebih nyaman daripada
q:
Argumen khusus (: argumen peta h)
Perintah
map <buffer> lhs rhs
mengaktifkan pemetaan kunci untuk buffer ini saja. Ini benar-benar bekerja dengan nyaman dengan perintah otomatis sebagai kombinasi tombol sementara atau ketika mendefinisikan tugas melalui suatu fungsi. Tugas penyangga diutamakan daripada tugas global, yaitu, Anda dapat mengabaikan perintah umum yang lebih berguna dalam situasi tertentu.
map <expr> {lhs} {expr}
memeriksa
{expr}
dan menggunakan nilai kembali sebagai pemetaan ulang kunci. Satu use case sederhana adalah mengikat berdasarkan kondisi. Saya punya ini:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Yang membuat
j
dan
k
bergerak sepanjang garis
sampai angka ditemukan, dan setelah itu kunci dibatalkan. Oleh karena itu, saya dapat menavigasi paragraf panjang prosa tanpa melanggar kombinasi seperti
10j
.
Argumen
<silent>
membantu jika ada binding yang menjalankan perintah ex.
inoremaps
Berkat
inoremap
binding berfungsi dalam mode insert. Di sana mereka mulai bekerja, jadi
inoremap ;a aaaa
akan memperkenalkan 'aaaa' bukan '; a'. Jika Anda ingin melakukan sesuatu dalam mode normal, gunakan
<cO>
. Misalnya, kalau sudah
inoremap ;1 <co>ma
maka
;1
mengatur
'a
.
Saya suka menentukan untuk menggunakan titik koma sebagai kunci untuk penugasan kembali, karena dalam teks normal hampir selalu ada spasi atau baris baru setelah titik koma.
autocmd
Perintah otomatis sangat bagus untuk konfigurasi. Biasanya Anda mengonfigurasinya seperti ini:
augroup {name} autocmd! " Prevents duplicate autocommands au {events} {file regex} {command} augroup END
Kemudian, jika salah satu peristiwa {events} terjadi di file {file regex}, perintah {command} akan menyala. Acara terdaftar
:h event
. Misalnya, jika Anda menulis
augroup every autocmd! au InsertEnter * set norelativenumber au InsertLeave * set relativenumber augroup END
maka vim akan menonaktifkan relativenumber hanya untuk mode penyisipan.
Perintah
au {event} <buffer> {ex}
berlaku perintah otomatis untuk buffer saat ini. Terkadang saya menggunakan ini untuk menambahkan event handler jangka pendek ke file tertentu.
BufNewFile, BufRead
BufnewFile
dimulai ketika file baru dibuat,
BufRead
- ketika buffer pertama kali dibuka. Mereka biasanya digunakan untuk menambahkan parameter dan memetakan kembali ke tipe file tertentu. Saya punya satu seperti:
augroup md autocmd! au BufNewFile,BufRead *.md syntax keyword todo TODO au BufNewFile,BufRead *.md inoremap <buffer> ;` ```<cr><cr>```<Up><Up> augroup END
Hanya dalam file Penurunan harga adalah garis TODO disorot, dan karakter
;`
dalam mode insert menambahkan notasi kode.
Tim otomatis memungkinkan Anda melakukan hal-hal yang jauh lebih rumit. Sebagai contoh,
au
untuk
BufWriteCmd
mengesampingkan penghematan standar, memungkinkan Anda untuk mengimplementasikan logika khusus. Ini melampaui "trik" dan masuk ke ranah "sihir gelap".
Plugin
Kebanyakan orang tahu tentang plugin populer seperti
vim-surround
dan
NERDtree
. Berikut adalah daftar dari beberapa yang sedikit diketahui yang menurut saya sangat berguna.
Di sebagian besar editor teks, tindakan undo terjadi secara linear. Jika Anda membuat perubahan ke A, batalkan, lalu buat perubahan ke B, maka A hilang selamanya. Namun, Vim menyimpan seluruh pohon tindakan yang dibatalkan. Perintah
u
memutar kembali tindakan di cabang pohon saat ini, dan
g
pergi ke versi
kronologis sebelumnya. Anda dapat melihat daftar tindakan yang dibatalkan dengan perintah
:undolist
.
Tetapi format ini tidak begitu jelas. Adalah jauh lebih baik untuk melihat pohon yang sebenarnya. Inilah yang
Undotree
lakukan: memaparkan representasi ASCII yang baik dari pohon tindakan yang dibatalkan dengan navigasi yang mudah.
Plugin ini menyediakan perintah untuk bertukar argumen, sehingga Anda dapat mengganti
(a, f(b, c))
dengan
(f(b, c), a)
dalam beberapa penekanan tombol. Saya secara teratur harus melakukan penyuntingan, jadi ini adalah peningkatan besar dalam kualitas hidup.
Menghubungkan API tingkat lebih tinggi ke terminal tertanam neo / vim. Sebagai contoh
:T {text}
mengirim {text} ke konsol. Baik untuk menciptakan lingkungan yang interaktif.
"TODO {{{
Banyak topik tidak tercakup dalam artikel ini karena terlalu teknis atau perlu dijelaskan secara rinci, seperti penulisan fungsi atau sistem sintaksis. Dan saya tidak tahu banyak. Saya ingin mempelajari topik-topik berikut secara lebih rinci:
Pratinjau, Perbaikan Cepat, dan Daftar jendela
Terkadang saya menggunakan alat dengan windows ini, tetapi saya tidak tahu bagaimana cara memanipulasi mereka. Saya ingin menambahkan kesalahan perbaikan cepat ke
plugin TLA + saya. Saya juga menyukai gagasan untuk meletakkan informasi pendukung dan perintah panggilan balik di jendela pratinjau. Ini membuka beberapa kemungkinan yang sulit untuk direproduksi dalam IDE.
API Neovim
Neovim menawarkan API canggih untuk mengintegrasikan Vim dengan program eksternal. Skrip Python Anda dapat mengirim perintah ke instance Neovim, dan Anda dapat mengontrol editor melalui server, misalnya. Saya melihat beberapa demo konseptual keren di mana pelengkapan otomatis terjadi berdasarkan informasi di browser. Sepertinya sangat keren!
Objek teks
Tidak pernah dibuat seperti itu.
Jadi, ini adalah gambaran singkat dari beberapa fungsi implisit Vim. Semoga Anda menemukan sesuatu yang bermanfaat!