Ada banyak pertanyaan di mana orang berbicara tentang trik umum, terutama " Vim + tips dan trik ".
Namun, saya tidak merujuk pada cara pintas yang biasa digunakan yang menurut seseorang keren untuk Vim. Saya berbicara tentang pengguna Unix yang berpengalaman (baik itu pengembang, administrator, keduanya, dll.), Yang berpikir mereka tahu sesuatu yang 99% dari kita tidak pernah dengar atau impikan. Sesuatu yang tidak hanya membuat pekerjaan mereka lebih mudah, tetapi juga KEREN dan retas . Lagipula, Vim berada di OS paling sudut gelap di dunia, sehingga Vim harus memiliki seluk-beluk yang hanya diketahui oleh sedikit orang dan ingin dibagikan kepada kami.
Jawaban:
Mungkin bukan salah satu yang tidak diketahui oleh 99% pengguna Vim, tetapi ini adalah sesuatu yang saya gunakan setiap hari dan bahwa setiap pengguna Linux + Vim harus tahu.
Perintah dasar, namun sangat berguna.
Saya sering lupa sudo sebelum mengedit file yang saya tidak punya izin menulis. Ketika saya datang untuk menyimpan file itu dan mendapatkan kesalahan izin, saya hanya mengeluarkan perintah vim untuk menyimpan file tanpa perlu menyimpannya ke file temp dan kemudian menyalinnya kembali.
Anda jelas harus berada di sistem dengan sudo terpasang dan memiliki hak sudo.
sumber
sudo vim
. Sebaliknya Anda harus mengeksporEDITOR
sebagai vim dan jalankansudoedit
.Sesuatu yang baru saya temukan baru-baru ini yang saya pikir sangat keren:
Mengembalikan dokumen menjadi seperti 15 menit yang lalu. Dapat mengambil berbagai argumen untuk jumlah waktu yang ingin Anda putar kembali, dan bergantung pada undolevels. Dapat dibalik dengan perintah yang berlawanan
:later
sumber
:later 8h
dan saya selesai untuk hari ini? : P:! [command]
mengeksekusi perintah eksternal saat Anda berada di Vim.Tetapi tambahkan sebuah titik setelah titik dua,,
:.! [command]
dan itu akan membuang output dari perintah ke jendela Anda saat ini. Itu: . !
Sebagai contoh:
Saya sering menggunakan ini untuk hal-hal seperti menambahkan tanggal saat ini ke dalam dokumen yang saya ketikkan:
sumber
:.!date
menulis "tanggal" pada baris dan kemudian jalankan!$sh
(atau memiliki perintah diikuti oleh baris kosong dan jalankan!jsh
). Ini akan menyalurkan garis ke shell "sh" dan menggantinya dengan output dari perintah.:.!
sebenarnya adalah kasus khusus:{range}!
, yang memfilter rentang garis (garis saat ini ketika rentang.
) melalui perintah dan menggantikan garis-garis tersebut dengan output. Saya menemukan:%!
berguna untuk memfilter seluruh buffer.sed
, ketika Anda dapat menggunakan built-ined
/ex
perintah yang sama? Coba jalankan:.s/old/new/g
;-)Tidak persis tidak jelas, tetapi ada beberapa perintah "delete in" yang sangat berguna, seperti ..
diw
untuk menghapus kata saat inidi(
untuk menghapus dalam parens saat inidi"
untuk menghapus teks di antara tanda kutipLainnya dapat ditemukan di
:help text-objects
sumber
de Hapus segala sesuatu sampai akhir kata dengan menekan. atas keinginan hatimu.
ci (xyz [Esc] - Ini adalah yang aneh. Di sini, 'i' tidak berarti mode penyisipan, melainkan berarti di dalam tanda kurung. Jadi urutan ini memotong teks di dalam tanda kurung tempat Anda berdiri dan menggantinya dengan "xyz". Ia juga berfungsi di dalam kurung kotak dan angka - cukup lakukan ci [atau ci {sesuai. Secara alami, Anda dapat melakukan di (jika Anda hanya ingin menghapus semua teks tanpa mengetik apa pun. Anda juga dapat melakukan
a
alih - alihi
jika Anda ingin menghapus tanda kurung juga dan bukan hanya teks di dalamnya.ci " - memotong teks dalam tanda kutip saat ini
ciw - memotong kata saat ini. Ini berfungsi seperti yang sebelumnya kecuali yang
(
diganti denganw
.C - potong sisa baris dan beralih ke mode insert.
ZZ - simpan dan tutup file saat ini (JAUH lebih cepat dari Ctrl-F4 untuk menutup tab saat ini!)
ddp - pindahkan baris saat ini ke bawah
xp - memindahkan karakter saat ini satu posisi ke kanan
U - huruf besar, sehingga
viwU
upercases kata~ - mengganti case, jadi
viw~
akan membalikkan casing seluruh kataCtrl + u / Ctrl + d gulir halaman setengah layar ke atas atau ke bawah. Ini tampaknya lebih bermanfaat daripada paging layar penuh biasa karena membuatnya lebih mudah untuk melihat bagaimana kedua layar berhubungan. Bagi mereka yang masih ingin menggulir seluruh layar sekaligus ada Ctrl + f untuk Maju dan Ctrl + b untuk Mundur. Ctrl + Y dan Ctrl + E gulir ke bawah atau ke atas satu baris sekaligus.
Perintah gila tapi sangat berguna adalah zz - itu menggulir layar untuk membuat garis ini muncul di tengah. Ini bagus untuk menempatkan potongan kode yang sedang Anda kerjakan di tengah perhatian Anda. Perintah saudara - zt dan zb - jadikan baris ini bagian atas atau bawah pada sreen yang tidak begitu berguna.
% menemukan dan melompat ke tanda kurung yang cocok.
de - menghapus dari kursor ke akhir kata (Anda juga dapat melakukan
dE
untuk menghapus sampai ruang berikutnya)bde - hapus kata saat ini, dari pembatas kiri ke kanan
df [spasi] - hapus hingga dan termasuk spasi berikutnya
dt. - hapus sampai titik berikutnya
dd - hapus seluruh baris ini
kamu (atau kamu) - menarik teks dari sini ke akhir kata
ce - memotong sampai akhir kata
sampai jumpa - menyalin kata saat ini (membuat saya bertanya-tanya apa yang "hai" lakukan!)
yy - menyalin baris saat ini
cc - memotong garis saat ini, Anda juga bisa melakukannya
S
. Ada juga batas bawahs
yang memotong karakter saat ini dan beralih ke mode insert.viwy atau viwc . Tarik atau ubah kata saat ini. Tekan
w
beberapa kali untuk terus memilih setiap kata berikutnya, gunakanb
untuk bergerak mundurvi { - pilih semua teks dalam tanda kurung. va {- pilih semua teks termasuk {} s
vi (p - sorot semua yang ada di dalam () dan ganti dengan teks yang ditempel
b dan e memindahkan kursor kata demi kata, sama seperti yang biasa dilakukan Ctrl + Panah . Definisi kata sedikit berbeda, karena beberapa delmiter berturut-turut diperlakukan sebagai satu kata. Jika Anda memulai di tengah kata, menekan b akan selalu membawa Anda ke awal kata saat ini, dan setiap b berturut-turut akan melompat ke awal kata berikutnya. Demikian pula, dan mudah diingat,
e
dapatkan kursor ke akhir arus, dan setiap kata berikutnya.mirip dengan
b
/e
, kapitalB
danE
pindahkan kursor kata per kata menggunakan hanya spasi putih sebagai pembatas.modal D (tarik napas dalam-dalam) Menghapus sisa garis di sebelah kanan kursor, sama dengan Shift + End / Del di editor normal (perhatikan 2 penekanan tombol - Shift + D - alih-alih 3)
sumber
vity
danvitc
dapat disingkat menjadiyit
dancit
masing - masing..
).bye
tidak berfungsi saat Anda menggunakan karakter pertama dari kata tersebut.yiw
selalu begitu.Salah satu yang jarang saya temukan di sebagian besar tutorial Vim, tetapi sangat LUAR BIASA (setidaknya bagi saya), adalah
g; and g,
untuk bergerak (maju, mundur) melalui daftar perubahan.
Biarkan saya menunjukkan bagaimana saya menggunakannya. Kadang-kadang saya perlu menyalin dan menempelkan sepotong kode atau string, katakan kode warna hex dalam file CSS, jadi saya mencari, melompat (tidak peduli di mana pertandingan itu), menyalinnya dan kemudian melompat kembali (g;) ke tempat Saya sedang mengedit kode untuk akhirnya menempelkannya. Tidak perlu membuat tanda. Lebih sederhana.
Hanya 2 sen saya.
sumber
'.
akan pergi ke baris yang diedit terakhir, Dan`.
akan pergi ke posisi yang diedit terakhir<C-o>
/<C-i>
untuk ini sepanjang waktu - atau menandai tempat saya.Jadikan vim menjadi hex editor.
Kembali.
Peringatan: Jika Anda tidak mengedit dengan biner (-b), Anda dapat merusak file. - Josh Lee di komentar.
sumber
:%!xxd -r
untuk mengembalikannya kembaliMemilih kembali pemilihan visual terakhir.
sumber
Terkadang pengaturan di .vimrc Anda akan ditimpa oleh plugin atau perintah otomatis. Untuk men-debug ini trik yang berguna adalah dengan menggunakan perintah: verbose bersama dengan: set. Misalnya, untuk mencari tahu dari mana cindent diset / tidak disetel:
Ini akan menampilkan sesuatu seperti:
Ini juga berfungsi dengan peta dan sorotan. (Terima kasih joeytwiddle karena menunjukkan ini.) Misalnya:
sumber
:verbose
juga dapat digunakan sebelumnmap l
atauhighlight Normal
untuk mencari tahu di manal
keymap atauNormal
highlight yang terakhir didefinisikan. Sangat berguna untuk debugging!:%TOhtml
Membuat rendering html dari file saat ini.
sumber
Tidak yakin apakah ini dianggap sebagai sudut-gelap-ish sama sekali, tapi saya baru saja mempelajarinya ...
akan menarik (menyalin) semua baris yang berisi "cocok" ke
"a
/@a
register. (Kapitalisasi sebagaiA
membuat vim menambahkan yankings alih-alih mengganti konten register sebelumnya.) Saya sering menggunakannya saat membuat stylesheet Internet Explorer.sumber
:v/PATTERN/d
Penjelasan::v
adalah kependekan dari:g!
, dan:g
perintah tersebut menerapkan perintah ex apa saja pada baris.:y[ank]
bekerja dan demikian juga:normal
, tetapi di sini hal yang paling wajar untuk dilakukan adalah adil:d[elete]
.:g/match/normal "Ayy
-normal
kata kunci memungkinkan Anda mengatakannya untuk menjalankan perintah mode normal (yang mungkin lebih Anda kenal).Ingin melihat: riwayat perintah Anda?
Kemudian telusuri, edit, dan akhirnya untuk menjalankan perintah.
Pernah membuat perubahan serupa ke dua file dan beralih bolak-balik di antara mereka? (Katakan, sumber dan file header?)
Lalu tab bolak-balik antara file-file itu.
sumber
q:
oleh kecelakaan sepanjang waktu ...Vim akan membuka URL, misalnya
Bagus ketika Anda perlu menarik sumber halaman untuk referensi.
sumber
Makro dapat memanggil makro lain, dan juga dapat memanggil dirinya sendiri.
misalnya:
... akan menghapus kata pertama dari setiap baris hingga akhir file.
Ini adalah contoh yang cukup sederhana tetapi menunjukkan fitur vim yang sangat kuat
sumber
qqqqqifuu<Esc>h@qq@q
:normal! @a
untuk menerapkan makro Anda ke setiap baris dalam pilihan Anda.Dengan asumsi Anda memiliki dukungan Perl dan / atau Ruby dikompilasi,
:rubydo
dan:perldo
akan menjalankan Ruby atau Perl satu-liner pada setiap baris dalam suatu rentang (default ke seluruh buffer), dengan$_
terikat ke teks dari baris saat ini (minus baris baru). Memanipulasi$_
akan mengubah teks dari baris itu.Anda dapat menggunakan ini untuk melakukan hal-hal tertentu yang mudah dilakukan dalam bahasa scripting tetapi tidak begitu jelas menggunakan Vim builtins. Misalnya untuk membalik urutan kata dalam satu baris:
Untuk memasukkan string acak 8 karakter (AZ) di akhir setiap baris:
Anda dibatasi untuk bertindak pada satu baris sekaligus dan Anda tidak dapat menambahkan baris baru.
sumber
pydo
danpy3do
bekerja untuk python jika Anda memiliki dukungan yang diperlukan dikompilasi masuk.^ O dan ^ I
Pergi ke posisi yang lebih lama / lebih baru. Saat Anda menelusuri file (dengan mencari, memindahkan perintah, dll.) Ingat "lompatan" ini, sehingga Anda dapat mengulang lompatan ini ke belakang (^ O - O untuk yang lama) dan maju (^ I - tepat di sebelah saya di keyboard ). Saya merasa sangat berguna ketika menulis kode dan melakukan banyak pencarian.
gi
Pergi ke posisi di mana mode Sisipkan dihentikan terakhir. Saya menemukan diri saya sering mengedit dan kemudian mencari sesuatu. Untuk kembali ke tempat penyuntingan tekan gi.
gf
letakkan kursor pada nama file (misalnya sertakan file header), tekan gf dan file dibuka
gF
mirip dengan gf tetapi mengenali format "[nama file]: [nomor baris]". Menekan gF akan membuka [nama file] dan mengatur kursor ke [nomor baris].
^ P dan ^ N
Otomatis lengkapi teks saat mengedit (^ P - pertandingan sebelumnya dan ^ N pertandingan berikutnya)
^ X ^ L
Saat mengedit selesai ke baris yang sama (berguna untuk pemrograman). Anda menulis kode dan kemudian Anda ingat bahwa Anda memiliki kode yang sama di suatu tempat dalam file. Cukup tekan ^ X ^ L dan garis penuh selesai
^ X ^ F
Nama file lengkap. Anda menulis "/ etc / pass" Hmm. Anda lupa nama file. Cukup tekan ^ X ^ F dan nama file selesai
^ Z atau: sh
Pindahkan sementara ke shell. Jika Anda membutuhkan bashing cepat:
sumber
^X^F
kencing kesayangan saya adalah bahwa nama file termasuk=
tanda - tanda, membuatnya melakukan hal-hal busuk dalam banyak kesempatan (file ini, makefiles dll). Saya gunakanse isfname-==
untuk mengakhiri gangguan itusumber
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
Ini adalah trik yang bagus untuk membuka kembali file saat ini dengan pengkodean yang berbeda:
Berguna saat Anda harus bekerja dengan penyandian sebelumnya. Penyandian yang didukung tercantum dalam tabel di bawah
encoding-values
(lihathelp
encoding-values
). Hal serupa juga berfungsi untuk++ff
, sehingga Anda dapat membuka kembali file dengan jalur Windows / Unix berakhir jika Anda melakukan kesalahan untuk pertama kalinya (lihathelp
ff
).sumber
Mengetik == akan memperbaiki lekukan garis saat ini berdasarkan pada baris di atas.
Sebenarnya, Anda dapat melakukan satu = tanda diikuti oleh perintah gerakan apa pun. = {gerakan}
Misalnya, Anda dapat menggunakan gerakan% yang bergerak di antara kawat gigi yang cocok. Posisikan kursor pada {dalam kode berikut:
Dan tekan =% untuk mendapatkan ini secara instan:
Sebagai alternatif, Anda dapat melakukan = a { di dalam blok kode, alih-alih memposisikan diri Anda tepat pada {karakter.
sumber
=}
atauvaBaB=
karena itu tidak terlalu tergantung. Juga,v}}:!astyle -bj
cocok dengan gaya kode saya lebih baik, tetapi saya bisa mendapatkannya kembali ke gaya Anda dengan sederhana%!astyle -aj
gg=G
cukup rapi saat menempelkan sesuatu.ggVG=
.sumber
ii
danjj
biasanya digunakan untuk variabel counter, karenai
danj
dicadangkan untuk bilangan kompleks.Mari kita lihat beberapa editor IDE yang cantik melakukan transposisi kolom.
Penjelasan
\(
dan\)
bagaimana cara mengingat hal-hal di regex-land. Dan\1
,\2
dll adalah cara mengambil barang yang diingat.Ingat semuanya diikuti oleh
^I
(tab) diikuti oleh semuanya.Ganti hal-hal di atas dengan "hal-hal kedua yang Anda ingat" diikuti oleh "hal-hal pertama yang Anda ingat" - pada dasarnya melakukan transpos.
sumber
sumber
Bukan rahasia yang kelam, tapi saya suka menempatkan pemetaan berikut ke dalam file .vimrc saya, jadi saya bisa menekan "-" (minus) kapan saja untuk membuka file explorer untuk menampilkan file yang berdekatan dengan yang baru saja saya edit . Di file explorer, saya bisa menekan "-" yang lain untuk naik satu direktori, memberikan penelusuran tanpa keliru dari struktur direktori yang kompleks (seperti yang digunakan oleh kerangka kerja MVC saat ini):
Ini mungkin juga berguna bagi seseorang. Saya suka menggulir layar dan memajukan kursor pada saat yang bersamaan:
Navigasi tab - Saya suka tab dan saya perlu bergerak dengan mudah di antaranya:
Hanya di Mac OS X: Navigasi mirip-tab:
sumber
Saya suka menggunakan 'sudo bash', dan sysadmin saya membenci ini. Dia mengunci 'sudo' sehingga hanya bisa digunakan dengan beberapa perintah (ls, chmod, chown, vi, dll), tapi saya bisa menggunakan vim untuk mendapatkan shell root:
sumber
Seringkali, saya suka mengubah direktori saat ini saat mengedit - jadi saya harus menentukan jalur yang lebih sedikit.
sumber
Saya sering menggunakan banyak jendela ketika saya mengerjakan suatu proyek dan terkadang saya perlu mengubah ukurannya. Inilah yang saya gunakan:
Pemetaan ini memungkinkan untuk menambah dan mengurangi ukuran jendela saat ini. Ini cukup sederhana tetapi cepat.
sumber
Bukan fitur yang tidak jelas, tetapi sangat berguna dan menghemat waktu.
Jika Anda ingin menyimpan sesi buffer terbuka, tab, spidol, dan pengaturan lainnya, Anda dapat mengeluarkan hal-hal berikut:
Anda dapat membuka sesi Anda menggunakan:
sumber
:so session.vim
di dalam vim.menempelkan output dari perintah eksternal ke buffer.
Lakukan beberapa matematika dan dapatkan hasilnya langsung dalam teks:
Dapatkan daftar file untuk dikompilasi saat menulis Makefile:
Jangan mencari fakta yang Anda baca di wikipedia, minta langsung disisipkan ke dalam dokumen yang Anda tulis:
sumber
Peta F5 untuk dengan cepat ROT13 buffer Anda:
Anda dapat menggunakannya sebagai kunci bos :).
sumber
nmap i ggg?G``
. Atau jahat:nmap i ggg?G``i
!Saya baru saja menemukan ini hari ini melalui NSFAQ :
Blok komentar kode.
Masuk ke mode Visual Blockwise dengan menekan CTRL-V.
Tandai blok yang ingin Anda komentari.
Tekan I (huruf kapital I) dan masukkan string komentar Anda di awal baris. (// untuk C ++)
Tekan ESC dan semua baris yang dipilih akan // di sebelah depan baris.
sumber
git checkout
). Adapun penggunaan yang lebih baik untuk memasukkan blok, tidak ada set-in-stone. Anda cukup menggunakannya kapan saja Anda memiliki banyak baris di mana Anda ingin memasukkan urutan karakter yang sama di tempat yang sama.Saya menggunakan vim untuk mengedit teks apa pun yang saya lakukan, jadi saya sering kali menggunakan salin dan tempel. Masalahnya adalah vim secara default akan sering mendistorsi teks yang diimpor melalui tempel. Cara untuk menghentikan ini adalah dengan menggunakan
sebelum menempelkan data Anda. Ini akan menjaga agar tidak berantakan.
Perhatikan bahwa Anda harus mengeluarkan
:set nopaste
untuk memulihkan indentasi otomatis. Cara-cara alternatif untuk menempelkan teks pra-format adalah register clipboard (*
dan+
), dan:r!cat
(Anda harus mengakhiri fragmen yang ditempel dengan ^ D).Terkadang juga membantu untuk mengaktifkan skema warna kontras tinggi. Ini bisa dilakukan dengan
Saya perhatikan bahwa itu tidak berfungsi pada semua versi vim yang saya gunakan tetapi itu paling banyak.
sumber
set paste
atau menentukan kunci untukpastetoggle
opsi adalah cara yang umum untuk mengatasi hal ini, tetapi efek yang sama dapat dicapaiset mouse=a
ketika Vim tahu bahwa banjir teks yang dilihatnya adalah pasta yang dipicu oleh mouse."*p
menempelkan dari xlipboard. (Ini berfungsi dari terminal vim, juga, hanya saja Anda mungkin memerlukan paket gvim jika terpisah)*
adalahPRIMARY
register ("klik tengah"). The clipboard adalah+