Apa sudut-sudut gelap Vim yang tidak pernah diceritakan ibumu? [Tutup]


799

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.


10
: Jendela Sex Split dan buka file explorer terintegrasi (horizontal split)
user3218088

2
Pertanyaan ini tampaknya cukup konstruktif - dengan melihat jumlah upvotes ..., memilih untuk membuka kembali - mungkin beberapa jawaban yang lebih keren tiba - yang dapat dibesarkan jika berguna - maka memberikan nilai lebih kepada SOF. Memesan jawaban dengan suara Saya telah belajar banyak hal keren hanya dalam 5 menit ... hal yang sangat berharga di sini, mengapa menutup sesuatu yang berharga ini? Bagaimana ini tidak konstruktif?
jhegedus

7
Konyol kalau pertanyaan ini ditutup. Bicara tentang legalisme.
Lepidopterist

2
Saya pikir pertanyaan ini sangat konstruktif tetapi, lebih tepat di Quora.
Diogo Melo

2
Mengapa ada 2 (sampai sekarang) suara untuk menghapus pertanyaan ini? Apa gunanya itu?
Akavall

Jawaban:


782

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.

:w !sudo tee %

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.


116
Boleh dibilang, itu lebih baik daripada menjalankan vim sebagai root! Terpilih!
Arafangion

27
Untuk pemula, apa sebenarnya yang dilakukan tee? Apakah ada yang keberatan menguraikan perintah ini untuk saya?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Anda seharusnya tidak pernah berlari sudo vim. Sebaliknya Anda harus mengekspor EDITORsebagai vim dan jalankan sudoedit.
Gerardo Marset

8
@maximus: vim menggantikan% dengan nama buffer / file saat ini.
migu

617

Sesuatu yang baru saya temukan baru-baru ini yang saya pikir sangat keren:

:earlier 15m

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


6
@skinp: Jika Anda membatalkan dan kemudian membuat perubahan lebih lanjut dari keadaan dibatalkan, Anda kehilangan riwayat mengulang itu. Ini memungkinkan Anda kembali ke keadaan yang tidak lagi berada di tumpukan undo.
ephemient

39
Juga sangat berguna adalah g + dan g- untuk mundur dan maju dalam waktu. Ini jauh lebih kuat daripada tumpukan undo / redo karena Anda tidak kehilangan sejarah ketika Anda melakukan sesuatu setelah membatalkan.
Etienne PIERRE

9
Anda tidak kehilangan riwayat pengulangan jika Anda membuat perubahan setelah membatalkan. Hanya saja tidak mudah diakses. Ada plugin untuk membantu Anda memvisualisasikan ini, seperti Gundo.vim
Ehtesh Choudhury

559
Wow, jadi sekarang saya bisa melakukan :later 8hdan saya selesai untuk hari ini? : P
Igor Popov

7
Perintah Anda mengasumsikan seseorang akan menghabiskan setidaknya 15 menit di vim !
e2-e4

411

:! [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:

:.! ls

Saya sering menggunakan ini untuk hal-hal seperti menambahkan tanggal saat ini ke dalam dokumen yang saya ketikkan:

:.! date

74
Ini sangat mirip dengan: r! Satu-satunya perbedaan sejauh yang saya tahu adalah: r! membuka baris baru,:.! menimpa baris saat ini.
saffsd

6
Alternatif untuk :.!datemenulis "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.
hlovdal

43
:.!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.
Nefrubyr

2
@sundar: Mengapa melewati garis sed, ketika Anda dapat menggunakan built-in ed/ experintah yang sama? Coba jalankan :.s/old/new/g;-)
jabirali

4
Dan perhatikan juga bahwa '!' seperti 'y', 'd', 'c' dll, yaitu Anda dapat melakukan: !!, number !!,! motion (mis! Gshell_command <cr> ganti dari baris saat ini ke akhir file ('G') dengan keluaran dari shell_command).
aqn

312

Tidak persis tidak jelas, tetapi ada beberapa perintah "delete in" yang sangat berguna, seperti ..

  • diw untuk menghapus kata saat ini
  • di( untuk menghapus dalam parens saat ini
  • di" untuk menghapus teks di antara tanda kutip

Lainnya dapat ditemukan di :help text-objects


8
bubuhkan "hapus kurung arounb", daB untuk kurung keriting, t untuk tag tipe xml, kombinasi dengan perintah normal seperti yang diharapkan cib / yaB / dit / tong dll
sjh

15
@Masi: yi (va (p hanya menghapus tanda kurung
Don Reba

42
Ini mungkin alasan terbesar bagi saya untuk tinggal bersama Vim. Itu dan perintah "perubahan" yang setara: ciw, ci (, ci ", serta dt <spasi> dan ct <spasi>
thomasrutter

4
@thomasrutter: Mengapa tidak dW / cW alih-alih dt <spasi>?

9
@Masi: Dengan plugin surround: ds (.

237

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 aalih - alih ijika 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 dengan w.

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 viwUupercases kata

~ - mengganti case, jadi viw~akan membalikkan casing seluruh kata

Ctrl + 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 melakukandE 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 bawah syang memotong karakter saat ini dan beralih ke mode insert.

viwy atau viwc . Tarik atau ubah kata saat ini. Tekan wbeberapa kali untuk terus memilih setiap kata berikutnya, gunakan buntuk bergerak mundur

vi { - 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, edapatkan kursor ke akhir arus, dan setiap kata berikutnya.

mirip dengan b/ e, kapital Bdan Epindahkan 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)


15
zt cukup berguna jika Anda menggunakannya di awal suatu fungsi atau definisi kelas.
Nick Lewis

9
vitydan vitcdapat disingkat menjadi yitdan citmasing - masing.
Nathan Fellman

33
Semua hal yang Anda panggil "cut" adalah "perubahan". misal: C berubah hingga akhir baris. Setara Vim dengan "cut" adalah "delete", dilakukan dengan d / D. Perbedaan utama antara perubahan dan penghapusan adalah bahwa menghapus membuat Anda dalam mode normal tetapi perubahan menempatkan Anda ke dalam semacam mode masukkan (meskipun Anda masih dalam perintah perubahan yang berguna karena seluruh perubahan dapat diulangi dengan .).
Laurence Gonsalves

11
Saya pikir ini untuk daftar hal-hal yang tidak banyak orang tahu. kamu sangat umum, saya akan berpikir.
Almo

19
byetidak berfungsi saat Anda menggunakan karakter pertama dari kata tersebut. yiwselalu begitu.
Andrea Francia

204

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.


29
sama, '.akan pergi ke baris yang diedit terakhir, Dan `.akan pergi ke posisi yang diedit terakhir
aehlke

8
Ctrl-O dan Ctrl-I (tab) akan bekerja sama, tetapi tidak sama. Mereka bergerak mundur dan maju dalam "daftar lompatan", yang dapat Anda lihat dengan melakukan: melompat atau: ju Untuk informasi lebih lanjut, lakukan: bantu jumplist
Kimball Robinson

17
Anda dapat membuat daftar perubahan dengan melakukan: perubahan
Kimball Robinson

Hot dang itu bermanfaat. Saya menggunakan <C-o>/ <C-i>untuk ini sepanjang waktu - atau menandai tempat saya.
Wayne Werner

187
:%!xxd

Jadikan vim menjadi hex editor.

:%!xxd -r

Kembali.

Peringatan: Jika Anda tidak mengedit dengan biner (-b), Anda dapat merusak file. - Josh Lee di komentar.


9
Dan bagaimana Anda mengembalikannya kembali?
Christian

40
:! xxd -r // Untuk kembali dari HEX
Naga Kiran

21
Saya benar-benar berpikir itu :%!xxd -runtuk mengembalikannya kembali
Andreas Grech

@ JoshLee: Jika seseorang berhati-hati untuk tidak melintasi baris baru, apakah aman untuk tidak menggunakan opsi -b? Saya bertanya karena kadang-kadang saya ingin membuat perubahan hex, tetapi saya tidak ingin menutup dan membuka kembali file untuk melakukannya.
dotancohen

4
@dotancohen: Jika Anda tidak ingin menutup / membuka kembali file yang dapat Anda lakukan: set binary
Bambu


119

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:

:verbose set cindent?

Ini akan menampilkan sesuatu seperti:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Ini juga berfungsi dengan peta dan sorotan. (Terima kasih joeytwiddle karena menunjukkan ini.) Misalnya:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Tip luar biasa - persis apa yang saya cari hari ini.
Artem Russakovskii

Tip man yang luar biasa! Bagaimana Anda bisa mengetahui hal-hal culun ini?
Rafid

1
:verbosejuga dapat digunakan sebelum nmap latau highlight Normaluntuk mencari tahu di mana lkeymap atau Normalhighlight yang terakhir didefinisikan. Sangat berguna untuk debugging!
joeytwiddle

@ joeytwiddle Terima kasih! Saya menambahkan info itu ke jawabannya.
Laurence Gonsalves

Ketika Anda mulai membuat pemetaan khusus, ini akan sangat sering menyelamatkan pantat Anda, mungkin salah satu yang paling berguna di sini (IMO)!
SidOfc


98

Tidak yakin apakah ini dianggap sebagai sudut-gelap-ish sama sekali, tapi saya baru saja mempelajarinya ...

:g/match/y A

akan menarik (menyalin) semua baris yang berisi "cocok" ke "a/ @aregister. (Kapitalisasi sebagai Amembuat vim menambahkan yankings alih-alih mengganti konten register sebelumnya.) Saya sering menggunakannya saat membuat stylesheet Internet Explorer.


Hitungan, dihitung karena saya belum pernah melihat yang satu ini :)

Bagus Tidak pernah mendengarnya ... Mungkin bermanfaat: P
skinp

5
Anda bisa menggunakan: g! untuk menemukan garis yang tidak cocok dengan pola, contoh: g! / set / normal dd (hapus semua garis yang tidak berisi set)
tsukimi

3
Terkadang lebih baik melakukan apa yang dikatakan tsukimi dan hanya menyaring garis yang tidak sesuai dengan pola Anda. Versi singkat dari perintah itu: :v/PATTERN/dPenjelasan: :vadalah kependekan dari :g!, dan :gperintah 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].
pandubear

Anda juga dapat melakukannya :g/match/normal "Ayy- normalkata kunci memungkinkan Anda mengatakannya untuk menjalankan perintah mode normal (yang mungkin lebih Anda kenal).
Kimball Robinson

93

Ingin melihat: riwayat perintah Anda?

q:

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?)

:set hidden
:map <TAB> :e#<CR>

Lalu tab bolak-balik antara file-file itu.


131
Saya tertabrak q:oleh kecelakaan sepanjang waktu ...
Josh Lee

11
Atau, dari ex editor (:), Anda dapat melakukan CTRL-f untuk memunculkan jendela histori perintah.
Jason Down

6
@jleedev saya juga. Saya hampir membenci perintah ini, hanya karena saya menggunakannya terlalu banyak.
bradlis7

9
q / dan q? dapat digunakan untuk melakukan hal serupa untuk pola pencarian Anda.
bpw1621

5
Menekan <Cf> setelah: atau / (atau kapan saja Anda dalam mode perintah) akan memunculkan menu histori yang sama. Jadi Anda dapat memetakan ulang q: jika Anda sering memukulnya secara tidak sengaja dan masih mengakses mode yang mengagumkan ini.
idbrii

82

Vim akan membuka URL, misalnya

vim http://stackoverflow.com/

Bagus ketika Anda perlu menarik sumber halaman untuk referensi.


2
Bagi saya itu tidak membuka sumbernya; alih-alih ia menggunakan elink untuk membuang halaman yang dirender ke dalam buffer, dan kemudian membukanya.
Ivan Vučica

ada kesalahan ketika dieksekusi perintah ini
Dzung Nguyen

5
Bekerja lebih baik dengan garis miring pada akhirnya. Trik rapi!
Thomas

@Vdt: Akan bermanfaat jika Anda memposting kesalahan Anda. Jika ini yang ini: " error (netrw) tidak ada perintah wget maupun fetch" Anda jelas perlu membuat salah satu alat tersebut tersedia dari variabel lingkungan PATH Anda.
Isaac Nequittepas

Saya menemukan ini sangat berguna ketika orang mengirim tautan ke layanan tempel dan lupa memilih penyorotan sintaks, saya biasanya hanya perlu membuka tautan di vim setelah menambahkan "& mentah".
Dettorer

68

Makro dapat memanggil makro lain, dan juga dapat memanggil dirinya sendiri.

misalnya:

qq0dwj@qq@q

... akan menghapus kata pertama dari setiap baris hingga akhir file.

Ini adalah contoh yang cukup sederhana tetapi menunjukkan fitur vim yang sangat kuat


2
Saya tidak tahu makro bisa mengulang sendiri. Keren. Catatan: qx mulai merekam ke register x (ia menggunakan qq untuk register q). 0 bergerak ke awal baris. dw menghapus kata. j bergerak menuruni garis. @q akan menjalankan makro lagi (mendefinisikan loop). Tapi Anda lupa mengakhiri rekaman dengan "q" akhir, lalu jalankan makro dengan mengetikkan @q.
Kimball Robinson

2
Saya pikir itu disengaja, sebagai makro bersarang dan rekursif.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset

6
Cara lain untuk mencapai hal ini adalah dengan merekam makro dalam register yang melakukan beberapa transformasi ke satu baris, kemudian sorot juga dengan segaris baris dengan V dan ketik :normal! @auntuk menerapkan makro Anda ke setiap baris dalam pilihan Anda.
Nathan Long

Saya menemukan posting ini googling macro VIM rekursif. Saya tidak dapat menemukan cara untuk menghentikan makro selain membunuh proses VIM.
dotancohen

55

Dengan asumsi Anda memiliki dukungan Perl dan / atau Ruby dikompilasi, :rubydodan :perldoakan 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:

:perldo $_ = join ' ', reverse split

Untuk memasukkan string acak 8 karakter (AZ) di akhir setiap baris:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Anda dibatasi untuk bertindak pada satu baris sekaligus dan Anda tidak dapat menambahkan baris baru.


bagaimana jika saya hanya ingin perldo dijalankan pada baris yang ditentukan? atau beberapa baris yang dipilih?
Sujoy

5
Anda bisa memberinya rentang seperti perintah lainnya. Misalnya: 1,5perldo hanya akan beroperasi pada jalur 1-5.
Brian Carper

Bisakah Anda melakukan $ _ + = '\ nNEWLINE !!!' mendapatkan baris baru setelah yang sekarang?
Greg

Sayangnya tidak, itu hanya menambahkan karakter kontrol yang funky ke akhir baris. Anda kemudian dapat menggunakan pencarian / ganti Vim untuk mengubah semua karakter kontrol tersebut menjadi baris baru nyata.
Brian Carper

3
Demikian pula, pydodan py3dobekerja untuk python jika Anda memiliki dukungan yang diperlukan dikompilasi masuk.
Derecho

54

^ 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:

  • tekan ^ Z (untuk meletakkan vi di latar belakang) untuk kembali ke shell asli dan tekan fg untuk kembali ke vim kembali
  • tekan: sh untuk pergi ke sub shell dan tekan ^ D / keluar untuk kembali ke vi kembali

Dengan ^X^Fkencing kesayangan saya adalah bahwa nama file termasuk =tanda - tanda, membuatnya melakukan hal-hal busuk dalam banyak kesempatan (file ini, makefiles dll). Saya gunakan se isfname-==untuk mengakhiri gangguan itu
lihat

3
+1 autocomplete bawaan hanya duduk di sana menunggu untuk ditemukan.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Saya tidak melihat apa yang baik untuk ini (selain terlihat seperti lelucon). Bisakah orang lain mencerahkan saya?
Ryan Edwards

2
buka vim lalu lakukan ": for i in range (1.255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards mengisi / etc / hosts mungkin
Ruslan

26
Ini jawaban yang luar biasa. Bukan sedikit tentang membuat alamat IP, tetapi bit yang menyiratkan bahwa VIM dapat digunakan untuk loop dalam perintah .
dotancohen

4
Tanpa ex-mode:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Ini adalah trik yang bagus untuk membuka kembali file saat ini dengan pengkodean yang berbeda:

:e ++enc=cp1250 %:p

Berguna saat Anda harus bekerja dengan penyandian sebelumnya. Penyandian yang didukung tercantum dalam tabel di bawah encoding-values(lihat help 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 (lihat help ff).


Tidak pernah harus menggunakan hal semacam ini, tapi kami pasti akan menambah trik saya ...

tip yang bagus, terima kasih. Untuk poin bonus, tambahkan daftar penyandian umum yang valid.
Adriano Varoli Piazza

2
Saya telah menggunakan ini hari ini, tetapi saya rasa saya tidak perlu menentukan "%: p"; hanya membuka file dan: e ++ enc = cp1250 sudah cukup. I
Ivan Vučica

akan: mengatur pengkodean = cp1250 memiliki efek yang sama?
laz

1
`: e + b% 'juga berguna untuk membuka kembali dalam mode biner (tidak ada garis hijau dari baris baru)
intuited

47

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:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Dan tekan =% untuk mendapatkan ini secara instan:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Sebagai alternatif, Anda dapat melakukan = a { di dalam blok kode, alih-alih memposisikan diri Anda tepat pada {karakter.


Hm, saya tidak tahu ini tentang indentasi.
Ehtesh Choudhury

Biasanya tidak perlu tepat pada kawat gigi. Saya sering berpikir hanya =}atau vaBaB=karena itu tidak terlalu tergantung. Juga, v}}:!astyle -bjcocok dengan gaya kode saya lebih baik, tetapi saya bisa mendapatkannya kembali ke gaya Anda dengan sederhana%!astyle -aj
sehe

7
gg=Gcukup rapi saat menempelkan sesuatu.
Kyrias


@kyria Oh, saya sudah melakukannya ggVG=.
Braden Best

42
imap jj <esc>

7
bagaimana Anda mengetikkan jj? : P
hasen

6
Seberapa sering Anda mengetik jj? Setidaknya dalam bahasa Inggris?
ojblass

50
Saya remapping capslock untuk esc, karena itu adalah kunci yang tidak berguna. Pemetaan saya adalah OS lebar, sehingga memiliki manfaat tambahan karena tidak perlu khawatir tentang memukulnya secara tidak sengaja. Satu-satunya kelemahan ADALAH LEBIH KERAS UNTUK MENGUNCI DI ORANG. :)
Alex

7
@ Alex: pasti, capslock adalah kematian. "tunggu, wtf? oh, itu ZZ? .... omong kosong."
intuited

5
@ojblass: Tidak yakin berapa banyak orang yang pernah benar kode matlab di Vim, tetapi iidan jjbiasanya digunakan untuk variabel counter, karena idan jdicadangkan untuk bilangan kompleks.
brianmearns

37

Mari kita lihat beberapa editor IDE yang cantik melakukan transposisi kolom.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Penjelasan

\(dan \)bagaimana cara mengingat hal-hal di regex-land. Dan \1, \2dll adalah cara mengambil barang yang diingat.

>>> \(.*\)^I\(.*\)

Ingat semuanya diikuti oleh ^I(tab) diikuti oleh semuanya.

>>> \2^I\1

Ganti hal-hal di atas dengan "hal-hal kedua yang Anda ingat" diikuti oleh "hal-hal pertama yang Anda ingat" - pada dasarnya melakukan transpos.


4
Beralih sepasang kolom yang dipisahkan tab (pemisah sembarang, itu semua regex) satu sama lain.
kekacauan

39
Ini hanya sebuah regex; banyak IDE memiliki regex search-and-replace.
rlbond

7
@ rlbond - Turun ke seberapa bagus mesin regex di IDE. Regex Vim cukup kuat; yang lain .. kadang-kadang tidak begitu.
romandas

3
* Akan serakah, jadi regex ini menganggap Anda hanya memiliki dua kolom. Jika Anda ingin menggunakan nongreedy {-} alih-alih * (lihat: tolong non-serakah untuk informasi lebih lanjut tentang {} multiplier)
Kimball Robinson

4
Ini sebenarnya adalah regex yang cukup sederhana, hanya lolos dari tanda kurung grup yang membuatnya terlihat rumit.
mk12

30

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):

map - :Explore<cr>

Ini mungkin juga berguna bagi seseorang. Saya suka menggulir layar dan memajukan kursor pada saat yang bersamaan:

map <c-j> j<c-e>
map <c-k> k<c-y>

Navigasi tab - Saya suka tab dan saya perlu bergerak dengan mudah di antaranya:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Hanya di Mac OS X: Navigasi mirip-tab:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Anda juga dapat menelusuri file dalam Vim sendiri, menggunakan: Jelajahi
Roman Plášil

Hai Roman, ini persis seperti yang dilakukan pemetaan ini, tetapi tetapkan ke "hot key". :)
KKovacs

27

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:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (atau sudo -e) mengedit file istimewa tetapi menjalankan editor Anda sebagai pengguna normal Anda.
RJHunter

12
yeah ... Aku juga akan membencimu;) kamu hanya perlu shell root SANGAT Jarang, kecuali kamu sudah terbiasa menjalankan terlalu banyak perintah sebagai root yang artinya semua izinmu kacau.
Kita Semua Monica

5
Mengapa sysadmin Anda bahkan memberi Anda root? : D
d33tah

26

Seringkali, saya suka mengubah direktori saat ini saat mengedit - jadi saya harus menentukan jalur yang lebih sedikit.

cd %:h

Apa fungsinya? Dan apakah itu bekerja dengan autchdir?
Leonard

2
Saya kira itu akan menggantikan autochdir sementara (sampai Anda beralih buffer lagi). Pada dasarnya, ini mengubah direktori ke direktori root dari file saat ini. Ini memberi saya sedikit lebih banyak kontrol manual daripada autochdir.
rampion

1
: set autochdir // ini juga melayani fungsi yang sama dan itu mengubah direktori sekarang dengan yang file dalam buffer
Naga Kiran

25

Saya sering menggunakan banyak jendela ketika saya mengerjakan suatu proyek dan terkadang saya perlu mengubah ukurannya. Inilah yang saya gunakan:

map + <C-W>+
map - <C-W>-

Pemetaan ini memungkinkan untuk menambah dan mengurangi ukuran jendela saat ini. Ini cukup sederhana tetapi cepat.


16
Ada juga Ctrl-W =, yang membuat lebar jendela sama.
Bill Lynch

2
Jangan lupa Anda dapat menambahkan angka untuk melakukan suatu tindakan beberapa kali dalam Vim. Jadi untuk memperluas ketinggian jendela saat ini sebanyak 8 baris: 8 <CW> +
joeytwiddle

23

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:

mksession session.vim

Anda dapat membuka sesi Anda menggunakan:

vim -S session.vim

5
Anda juga bisa :so session.vimdi dalam vim.
TankorSmash

22
:r! <command>

menempelkan output dari perintah eksternal ke buffer.

Lakukan beberapa matematika dan dapatkan hasilnya langsung dalam teks:

:r! echo $((3 + 5 + 8))

Dapatkan daftar file untuk dikompilasi saat menulis Makefile:

:r! ls *.c

Jangan mencari fakta yang Anda baca di wikipedia, minta langsung disisipkan ke dalam dokumen yang Anda tulis:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 dalam mode insert akan membiarkan Anda memasukkan nilai ekspresi (3 + 5 + 8) dalam teks dengan penekanan tombol yang lebih sedikit.
Sudhanshu

Bagaimana saya bisa mendapatkan hasil / keluaran ke buffer berbeda dari yang sekarang?
dcn


21

Peta F5 untuk dengan cepat ROT13 buffer Anda:

map <F5> ggg?G``

Anda dapat menggunakannya sebagai kunci bos :).


14
Saya tidak tahu apa yang Anda tulis ... Tapi tentu saja, bos saya akan lebih penasaran ketika dia melihat saya menulis ROT13 campur aduk :)
sehe

atau untuk menipu teman Anda: nmap i ggg?G`` . Atau jahat: nmap i ggg?G``i!
romeovs

1
@romeovs 2nd adalah infinite loop, gunakan nnoremap
Amit Gold

19

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.


Saya menambahkan # untuk mengomentari blok kode di ruby. Bagaimana saya membatalkannya.
Neeraj Singh

3
Anda dapat menekan ctrl + v lagi, tandai // 's dan tekan x untuk "uncomment"
nos

6
Saya menggunakan NERDCommenter untuk ini.
ZyX

1
Kode yang dikomentari mungkin adalah salah satu jenis komentar terburuk yang mungkin Anda masukkan ke dalam kode Anda. Ada kegunaan yang lebih baik untuk menyisipkan blok luar biasa.
Braden Best

1
@Pie karena kode yang dikomentari adalah kode mati . Kode mati tidak memiliki tujuan yang bermanfaat dan membuat kekacauan. Anda pikir Anda menyimpan kode yang mungkin ingin Anda bawa lagi nanti, tetapi selalu ada cara yang lebih baik. Anda dapat menggunakan riwayat batalkan, Anda dapat menipu file, atau Anda dapat menggunakan git, yang memiliki fungsi ini bawaan ( 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.
Braden Best

17

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

:set paste

sebelum menempelkan data Anda. Ini akan menjaga agar tidak berantakan.

Perhatikan bahwa Anda harus mengeluarkan :set nopasteuntuk 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

:color blue

Saya perhatikan bahwa itu tidak berfungsi pada semua versi vim yang saya gunakan tetapi itu paling banyak.


10
"Distorsi" terjadi karena Anda memiliki beberapa bentuk lekukan otomatis yang diaktifkan. Menggunakan set pasteatau menentukan kunci untuk pastetoggleopsi adalah cara yang umum untuk mengatasi hal ini, tetapi efek yang sama dapat dicapai set mouse=aketika Vim tahu bahwa banjir teks yang dilihatnya adalah pasta yang dipicu oleh mouse.
jamessan

1
Jika Anda telah menginstal gvim, Anda dapat sering (walaupun itu tergantung pada pilihan apa yang distro Anda buat dengan distro Anda) menggunakan papan klip X langsung dari vim melalui register *. Misalnya "*pmenempelkan dari xlipboard. (Ini berfungsi dari terminal vim, juga, hanya saja Anda mungkin memerlukan paket gvim jika terpisah)
kyrias

2
@kyrias sebagai catatan, *adalah PRIMARYregister ("klik tengah"). The clipboard adalah+
Braden Terbaik
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.