Setidaknya satu trik Vim yang tidak Anda ketahui

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:

dipilihctrl-Ag ctrl-A2 g ctrl-A
  a 0
 b 0
 c
 d 0 
  a 1
 b 1
 c
 d 1 
  a 1
 b 2
 c
 d 3 
  a 2
 b 4
 c
 d 6 

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.

Undotree


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.

vim.swap


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.

Neoterm


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!

Source: https://habr.com/ru/post/id454742/


All Articles