Apa jalan pintas Anda yang paling produktif dengan Vim?

1126

Saya telah mendengar banyak tentang Vim , baik pro maupun kontra. Sepertinya Anda harus (sebagai pengembang) lebih cepat dengan Vim daripada dengan editor lainnya. Saya menggunakan Vim untuk melakukan beberapa hal dasar dan saya 10 kali lebih baik kurang produktif dengan Vim.

Hanya dua hal yang harus Anda perhatikan ketika Anda berbicara tentang kecepatan (Anda mungkin tidak cukup peduli tentang mereka, tetapi Anda harus) adalah:

  1. Menggunakan tangan kiri dan kanan sebagai alternatif adalah cara tercepat untuk menggunakan keyboard.
  2. Jangan pernah menyentuh mouse adalah cara kedua untuk menjadi secepat mungkin. Butuh waktu lama bagi Anda untuk menggerakkan tangan, meraih mouse, memindahkannya, dan membawanya kembali ke keyboard (dan Anda sering harus melihat keyboard untuk memastikan Anda mengembalikan tangan dengan benar ke tempat yang tepat)

Berikut adalah dua contoh yang menunjukkan mengapa saya jauh kurang produktif dengan Vim.

Salin / Potong & tempel. Saya selalu melakukannya. Dengan semua editor kontemporer Anda menekan Shift dengan tangan kiri, dan Anda menggerakkan kursor dengan tangan kanan Anda untuk memilih teks. Kemudian Ctrl+ Csalinan, Anda memindahkan kursor dan Ctrl+ Vpasta.

Dengan Vim itu mengerikan:

  • yy untuk menyalin satu baris (Anda hampir tidak pernah menginginkan seluruh baris!)
  • [number xx]yyuntuk menyalin xxbaris ke buffer. Tetapi Anda tidak pernah tahu persis apakah Anda memilih apa yang Anda inginkan. Saya sering harus melakukan [number xx]ddkemudian uke undo!

Contoh lain? Cari & ganti.

  • Di PSPad : Ctrl+ flalu ketikkan apa yang ingin Anda cari, lalu tekan Enter.
  • Di Vim:, /lalu ketik apa yang ingin Anda cari, maka jika ada beberapa karakter khusus yang diletakkan \sebelum setiap karakter khusus, lalu tekan Enter.

Dan semuanya dengan Vim seperti itu: sepertinya saya tidak tahu bagaimana menanganinya dengan benar.

NB: Saya sudah membaca lembar contekan Vim :)

Pertanyaanku adalah:

Bagaimana cara Anda menggunakan Vim yang membuat Anda lebih produktif daripada dengan editor kontemporer?

Olivier Pons
sumber
"Menggunakan tangan kiri atau kanan sebagai alternatif adalah cara tercepat untuk menggunakan keyboard." Bukan untukku, anehnya. Ketika saya bisa mengetikkan kata dengan satu tangan, saya menemukan bahwa saya jauh lebih cepat.
Ben Mordecai

Jawaban:

2860

Masalah Anda dengan Vim adalah Anda tidak grok vi .

Anda menyebutkan memotong dengan yydan mengeluh bahwa Anda hampir tidak pernah ingin memotong garis keseluruhan. Sebenarnya programmer, mengedit kode sumber, sangat sering ingin bekerja pada seluruh baris, rentang garis dan blok kode. Namun, yyhanya satu dari banyak cara untuk menarik teks ke dalam buffer salinan anonim (atau "daftar" seperti namanya in vi ).

"Zen" dari vi adalah Anda berbicara bahasa. Inisialnya yadalah kata kerja. Pernyataan yyini adalah sinonim untuk y_. Ini ydigandakan untuk membuatnya lebih mudah untuk mengetik, karena ini adalah operasi yang umum.

Ini juga dapat dinyatakan sebagai dd P(hapus baris saat ini dan tempel salinan kembali ke tempatnya; meninggalkan salinan dalam register anonim sebagai efek samping). The ydan d"kata kerja" mengambil gerakan apa pun sebagai "subjek" mereka. Dengan demikian yWadalah "menarik dari sini (kursor) ke akhir kata saat ini / berikutnya (besar)" dan y'a"menarik dari sini ke baris yang mengandung tanda bernama ' a '."

Jika Anda hanya memahami gerakan kursor dasar ke atas, bawah, kiri, dan kanan maka vi tidak akan lebih produktif daripada salinan "notepad" untuk Anda. (Oke, Anda masih akan memiliki penyorotan sintaks dan kemampuan untuk menangani file yang lebih besar dari piddling ~ 45KB atau lebih; ​​tetapi bekerja dengan saya di sini).

vi memiliki 26 "tanda" dan 26 "register." Tanda ditetapkan ke lokasi kursor apa pun menggunakan mperintah. Setiap tanda ditandai dengan satu huruf kecil. Jadi masetel tanda ' a ' ke lokasi saat ini, dan mzsetel tanda ' z '. Anda dapat pindah ke baris yang berisi tanda menggunakan perintah '(kutipan tunggal). Dengan demikian 'apindah ke awal baris yang berisi tanda ' a '. Anda dapat pindah ke lokasi yang tepat dari sembarang tanda menggunakan perintah `(backquote). Dengan demikian `zakan pindah langsung ke lokasi yang tepat dari tanda ' z '.

Karena ini adalah "gerakan" mereka juga dapat digunakan sebagai subjek untuk "pernyataan" lainnya.

Jadi, salah satu cara untuk memotong teks pilihan sewenang-wenang adalah dengan menjatuhkan tanda (saya biasanya menggunakan ' a ' sebagai tanda "pertama" saya, ' z ' sebagai tanda berikutnya, ' b ' sebagai yang lain, dan ' e ' sebagai satu lagi (saya tidak ingat pernah secara interaktif menggunakan lebih dari empat tanda dalam 15 tahun penggunaan vi ; orang menciptakan konvensi sendiri tentang bagaimana tanda dan register digunakan oleh makro yang tidak mengganggu konteks interaktif seseorang). ke ujung teks yang kita inginkan; kita dapat mulai dari kedua sisi, itu tidak masalah. Kemudian kita dapat menggunakan d`auntuk memotong atau y`amenyalin. Dengan demikian seluruh proses memiliki 5 penekanan tombol overhead (enam jika kita mulai di "masukkan "mode dan diperlukan untukEscmode perintah keluar). Setelah kami dipotong atau disalin kemudian paste di salinan adalah keystroke tunggal: p.

Saya mengatakan bahwa ini adalah salah satu cara untuk memotong atau menyalin teks. Namun, itu hanya satu dari banyak. Seringkali kita dapat secara lebih ringkas menggambarkan rentang teks tanpa menggerakkan kursor kita dan menjatuhkan tanda. Sebagai contoh jika saya dalam paragraf teks saya dapat menggunakan {dan }memindahkan masing-masing ke awal atau akhir paragraf. Jadi, untuk memindahkan paragraf teks saya memotongnya menggunakan { d}(3 penekanan tombol). (Jika saya sudah berada pada baris pertama atau terakhir paragraf saya kemudian dapat menggunakan d}atau d{masing - masing.

Gagasan "paragraf" default ke sesuatu yang biasanya masuk akal secara intuitif. Jadi sering berfungsi untuk kode dan prosa.

Seringkali kita mengetahui beberapa pola (ekspresi reguler) yang menandai satu ujung atau yang lain dari teks yang kami minati. Mencari maju atau mundur adalah gerakan di vi . Dengan demikian mereka juga dapat digunakan sebagai "subjek" dalam "pernyataan" kami. Jadi saya dapat menggunakan d/foountuk memotong dari baris saat ini ke baris berikutnya yang berisi string "foo" dan y?baruntuk menyalin dari baris saat ini ke baris terbaru (sebelumnya) yang berisi "bar." Jika saya tidak ingin seluruh baris saya masih bisa menggunakan gerakan pencarian (sebagai pernyataan mereka sendiri), lepaskan tanda saya dan gunakan `xperintah seperti yang dijelaskan sebelumnya.

Selain "kata kerja" dan "subjek" vi juga memiliki "objek" (dalam arti gramatikal dari istilah tersebut). Sejauh ini saya hanya menggambarkan penggunaan register anonim. Namun, saya dapat menggunakan salah satu dari 26 register "bernama" dengan mengawali referensi "objek" dengan "(pengubah kutipan ganda). Jadi jika saya menggunakan "addsaya memotong baris saat ini ke register ' a ' dan jika saya gunakan "by/foomaka saya menarik salinan teks dari sini ke baris berikutnya yang berisi "foo" ke dalam register ' b '. Untuk menempel dari register, saya cukup awali paste dengan urutan pengubah yang sama: "apmenempel salinan ' a ' register '"bPmenempelkan salinan dari ' b ' ke sebelum baris saat ini.

Gagasan "awalan" ini juga menambahkan analogi dari kata sifat "kata sifat" dan "kata keterangan 'ke bahasa" manipulasi teks "kita. Sebagian besar perintah (kata kerja) dan gerakan (kata kerja atau objek, tergantung pada konteksnya) juga dapat mengambil awalan angka. 3Jberarti "bergabung dengan tiga baris berikutnya" dan d5}berarti "hapus dari baris saat ini sampai akhir paragraf kelima turun dari sini."

Ini semua tingkat menengah vi . Tak satu pun dari itu adalah Vim spesifik dan ada trik jauh lebih maju di vi jika Anda siap untuk belajar mereka. Jika Anda hanya menguasai konsep-konsep perantara ini, maka Anda mungkin akan menemukan bahwa Anda jarang perlu menulis makro karena bahasa manipulasi teks cukup ringkas dan ekspresif untuk melakukan banyak hal dengan cukup mudah menggunakan bahasa "asli" editor.


Contoh trik lebih lanjut:

Ada sejumlah :perintah, terutama :% s/foo/bar/gteknik substitusi global. (Itu tidak maju tetapi :perintah lain bisa). Seluruh :rangkaian perintah secara historis diwarisi oleh inkarnasi sebelumnya vi sebagai ed (editor baris) dan kemudian utilitas ex (editor baris diperluas). Bahkan vi dinamai demikian karena antarmuka visual untuk ex .

:perintah biasanya beroperasi di atas baris teks. ed dan ex ditulis di era ketika layar terminal tidak umum dan banyak terminal adalah perangkat "teletype" (TTY). Jadi itu biasa untuk bekerja dari salinan teks yang dicetak, menggunakan perintah melalui antarmuka yang sangat singkat (kecepatan koneksi umum adalah 110 baud, atau, kira-kira, 11 karakter per detik - yang lebih lambat daripada pengetik cepat; kelambatan umum terjadi pada sesi interaktif multi-pengguna; juga sering ada motivasi untuk menghemat kertas).

Jadi sintaksis sebagian besar :perintah termasuk alamat atau rentang alamat (nomor baris) diikuti oleh perintah. Secara alami seseorang dapat menggunakan nomor baris literal: :127,215 s/foo/baruntuk mengubah kemunculan pertama "foo" menjadi "bar" pada setiap baris antara 127 dan 215. Seseorang juga dapat menggunakan beberapa singkatan seperti .atau $untuk baris saat ini dan terakhir masing-masing. Kita juga bisa menggunakan awalan relatif +dan -merujuk ke offset setelah atau sebelum garis curent, masing-masing. Jadi: :.,$jartinya "dari baris saat ini ke baris terakhir, gabungkan semuanya menjadi satu baris". :%identik dengan :1,$(semua baris).

The :... gdan :... vperintah menanggung sebagian penjelasan mereka sangat kuat. :... gadalah awalan untuk "secara global" menerapkan perintah berikutnya untuk semua baris yang cocok dengan pola (ekspresi reguler) sambil :... vmenerapkan perintah tersebut untuk semua baris yang TIDAK cocok dengan pola yang diberikan ("v" dari "conVerse"). Seperti halnya perintah ex lainnya, ini dapat diawali dengan mengatasi / mencari referensi. Dengan demikian :.,+21g/foo/dberarti "hapus semua baris yang berisi string" foo "dari yang sekarang hingga 21 baris berikutnya" sementara itu :.,$v/bar/dberarti "dari sini ke akhir file, hapus semua baris yang TIDAK mengandung string" bar. "

Sungguh menarik bahwa umum perintah Unix grep sebenarnya terinspirasi oleh ini mantan perintah (dan dinamai cara di mana itu didokumentasikan). The ex perintah :g/re/p(grep) adalah cara mereka didokumentasikan bagaimana "global" "mencetak" garis yang berisi "ekspresi reguler" (re). Ketika ed dan ex digunakan, :pperintah adalah salah satu yang pertama yang dipelajari dan sering kali yang pertama digunakan saat mengedit file apa pun. Begitulah cara Anda mencetak konten saat ini (biasanya hanya satu halaman penuh pada saat menggunakan :.,+25patau semacamnya).

Perhatikan bahwa :% g/.../datau (pembalikan / pembalikan: :% v/.../dadalah pola penggunaan yang paling umum. Namun ada beberapa experintah lain yang perlu diingat:

Kita dapat menggunakan muntuk memindahkan garis, dan juntuk bergabung dengan garis. Misalnya jika Anda memiliki daftar dan ingin memisahkan semua barang yang cocok (atau sebaliknya TIDAK cocok dengan beberapa pola) tanpa menghapusnya, maka Anda dapat menggunakan sesuatu seperti: :% g/foo/m$... dan semua "foo" baris akan dipindahkan ke akhir file. (Perhatikan tip lain tentang menggunakan ujung file Anda sebagai ruang awal). Ini akan mempertahankan urutan relatif semua baris "foo" sambil mengekstraknya dari daftar lainnya. (Ini setara dengan melakukan sesuatu seperti: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(salin file ke ekornya sendiri, filter ekor melalui grep, dan hapus semua hal dari kepala).

Untuk bergabung dengan garis biasanya saya dapat menemukan pola untuk semua garis yang perlu digabungkan dengan pendahulunya (semua garis yang dimulai dengan "^" daripada "^ *" dalam beberapa daftar peluru, misalnya). Untuk itu saya akan menggunakan: :% g/^ /-1j(untuk setiap baris yang cocok, naik satu baris dan bergabung dengan mereka). (BTW: untuk daftar peluru mencoba untuk mencari jalur peluru dan bergabung ke depan tidak bekerja untuk beberapa alasan ... itu dapat bergabung dengan salah satu baris peluru ke yang lain, dan itu tidak akan bergabung dengan garis peluru untuk semua dari kelanjutannya; itu hanya akan bekerja berpasangan pada pertandingan).

Hampir tidak perlu disebutkan, Anda dapat menggunakan teman lama kami s(pengganti) dengan perintah gdan v(global / converse-global). Biasanya Anda tidak perlu melakukannya. Namun, pertimbangkan beberapa kasus di mana Anda ingin melakukan penggantian hanya pada garis yang cocok dengan beberapa pola lainnya. Seringkali Anda dapat menggunakan pola yang rumit dengan menangkap dan menggunakan kembali referensi untuk mempertahankan bagian dari garis yang Anda TIDAK ingin ubah. Namun, seringkali akan lebih mudah untuk memisahkan kecocokan dari substitusi: :% g/foo/s/bar/zzz/g- untuk setiap baris yang berisi "foo" gantikan semua "bar" dengan "zzz." (Sesuatu seperti:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/ghanya akan bekerja untuk kasus-kasus contoh "bar" yang DIHARAPKAN oleh "foo" pada baris yang sama; itu sudah cukup canggung, dan harus dihancurkan lebih lanjut untuk menangkap semua kasus di mana "bar" didahului "foo")

Intinya adalah bahwa ada lebih dari sekedar p, sdan dgaris-garis di exset perintah.

:Alamat - alamat itu juga bisa merujuk pada tanda. Dengan demikian Anda dapat menggunakan::'a,'bg/foo/j untuk bergabung dengan baris apa pun yang berisi string foo ke baris berikutnya, jika berada di antara garis antara tanda ' a ' dan ' b '. (Ya, semua excontoh perintah sebelumnya dapat dibatasi untuk himpunan bagian dari baris file dengan awalan dengan jenis ekspresi pengalamatan ini).

Itu sangat tidak jelas (Saya hanya menggunakan sesuatu seperti itu beberapa kali dalam 15 tahun terakhir). Namun, saya akan dengan bebas mengakui bahwa saya sering melakukan hal-hal secara iteratif dan interaktif yang mungkin bisa dilakukan lebih efisien jika saya meluangkan waktu untuk memikirkan mantra yang benar.

Lain sangat berguna vi atauPerintah ex adalah :rmembaca isi dari file lain. Dengan demikian: :r foomenyisipkan konten file bernama "foo" di baris saat ini.

Lebih kuat adalah :r!perintahnya. Ini membaca hasil dari suatu perintah. Ini sama dengan menangguhkan sesi vi , menjalankan perintah, mengarahkan outputnya ke file sementara, melanjutkan kembali sesi vi Anda , dan membaca konten dari temp. mengajukan.

Yang lebih kuat lagi adalah perintah !(bang) dan :... !( ex bang). Ini juga menjalankan perintah eksternal dan membaca hasilnya ke dalam teks saat ini. Namun, mereka juga memfilter pilihan teks kita melalui perintah! Ini kita bisa mengurutkan semua baris dalam file kita menggunakan 1G!Gsort( Gadalah perintah vi "goto"; ini default untuk pergi ke baris terakhir file, tetapi dapat diawali dengan nomor baris, seperti 1, baris pertama). Ini setara dengan varian ex:1,$!sort . Penulis sering menggunakan !dengan Unix fmt atau utilitas lipat untuk mereformasi atau "pembungkus kata" pilihan teks. Makro yang sangat umum adalah{!}fmt(memformat ulang paragraf saat ini). Pemrogram terkadang menggunakannya untuk menjalankan kode mereka, atau hanya sebagian, melalui indent atau alat pemformatan ulang kode lainnya.

Menggunakan :r!dan !perintah berarti utilitas atau filter eksternal apa pun dapat diperlakukan sebagai ekstensi editor kami. Saya kadang-kadang menggunakan ini dengan skrip yang menarik data dari database, atau dengan perintah wget atau lynx yang menarik data dari situs web, atau ssh perintah yang menarik data dari sistem jarak jauh.

Perintah ex berguna lainnya adalah :so(kependekan dari :source). Ini membaca isi file sebagai serangkaian perintah. Ketika Anda mulai vi secara normal, secara implisit, melakukan file :sourcepada ~/.exinitrc(dan Vim biasanya melakukan ini ~/.vimrc, cukup alami). Kegunaannya adalah Anda dapat mengubah profil editor dengan cepat hanya dengan mencari di set makro, singkatan, dan pengaturan editor yang baru. Jika Anda licik, Anda bahkan dapat menggunakan ini sebagai trik untuk menyimpan urutan perintah pengeditan ex untuk diterapkan ke file sesuai permintaan.

Misalnya saya punya file tujuh baris (36 karakter) yang menjalankan file wc , dan menyisipkan komentar gaya-C di bagian atas file yang berisi data jumlah kata itu. Saya bisa menerapkan "makro" itu ke file dengan menggunakan perintah seperti:vim +'so mymacro.ex' ./mytarget

( +Opsi baris perintah ke vi dan Vim biasanya digunakan untuk memulai sesi pengeditan pada nomor baris yang diberikan. Namun, sedikit fakta yang diketahui bahwa seseorang dapat mengikuti +dengan perintah / ekspresi ex yang valid , seperti perintah "sumber" seperti Saya sudah selesai di sini, sebagai contoh sederhana saya memiliki skrip yang memanggil: vi +'/foo/d|wq!' ~/.ssh/known_hostsuntuk menghapus entri dari file host SSH saya yang dikenal non-interaktif saat saya kembali menggambar satu set server)

Biasanya jauh lebih mudah untuk menulis "macro" seperti itu menggunakan Perl, AWK, sed (yang, pada kenyataannya, seperti grep utilitas yang terinspirasi oleh perintah ed ).

The @perintah mungkin yang paling jelas vi perintah. Dalam sesekali mengajar kursus administrasi sistem canggih selama hampir satu dekade, saya bertemu sangat sedikit orang yang pernah menggunakannya. @mengeksekusi isi register seolah-olah itu adalah perintah vi atau ex .
Contoh: Saya sering menggunakan: :r!locate ...untuk menemukan beberapa file di sistem saya dan membaca namanya ke dalam dokumen saya. Dari sana saya menghapus setiap klik yang tidak diinginkan, hanya menyisakan path lengkap ke file yang saya minati. Daripada dengan susah payah Tabmenelusuri setiap komponen path (atau lebih buruk lagi, jika saya terjebak pada mesin tanpa dukungan penyelesaian Tab) dalam salinan vi ) Saya hanya menggunakan:

  1. 0i:r(untuk mengubah baris saat ini menjadi perintah yang valid : r ),
  2. "cdd (untuk menghapus baris ke dalam register "c") dan
  3. @c jalankan perintah itu.

Itu hanya 10 penekanan tombol (dan ungkapan "cdd @citu secara efektif adalah makro jari untuk saya, jadi saya bisa mengetiknya hampir secepat kata enam huruf biasa).


Pikiran yang serius

Saya hanya mencakar ke permukaan kekuatan vi dan tidak satupun dari apa yang saya jelaskan di sini bahkan merupakan bagian dari "perbaikan" yang namanya vim ! Semua yang saya jelaskan di sini harus bekerja pada salinan lama vi dari 20 atau 30 tahun yang lalu.

Ada orang yang menggunakan kekuatan vi jauh lebih besar daripada yang pernah saya lakukan.

Jim Dennis
sumber
440
Monyet kode suci, .. itu satu jawaban yang mendalam. Apa yang hebat adalah bahwa Anda mungkin menulis dalam vim sekitar 10 kali penekanan tombol.
EightyOne Unite
48
@Wahnfieden - grok persis seperti yang saya maksud: en.wikipedia.org/wiki/Grok (Tampaknya bahkan di OED --- yang paling dekat dengan kita anglophones dengan leksikon kanonik). Untuk "grok" editor adalah menemukan diri Anda menggunakan perintahnya dengan lancar ... seolah-olah itu adalah bahasa alami Anda.
Jim Dennis
22
wow, jawaban yang ditulis dengan sangat baik! saya sangat setuju, walaupun saya sering menggunakan @perintah (dalam kombinasi dengan q: record macro)
knittl
63
Jawaban luar biasa yang benar-benar menghasilkan pertanyaan yang sangat mengerikan. Saya akan menjawab pertanyaan ini, yang biasanya saya turunkan, hanya agar jawaban ini menjadi lebih mudah ditemukan. (Dan aku seorang lelaki Emacs! Tapi dengan cara ini aku akan punya tempat untuk menunjuk orang-orang baru yang menginginkan penjelasan yang baik tentang apa yang menyenangkan pengguna vi tentang vi. Kemudian aku akan memberi tahu mereka tentang Emacs dan mereka dapat memutuskan.)
Brandon Rhodes
8
Bisakah Anda membuat situs web dan meletakkan tutorial ini di sana, sehingga tidak bisa dimakamkan di sini di stackoverflow. Saya belum membaca pengantar yang lebih baik untuk vi maka ini.
Marko
504

Anda berbicara tentang memilih dan menyalin teks, saya pikir Anda harus melihat ke Vim Visual Mode .

Dalam mode visual, Anda dapat memilih teks menggunakan perintah Vim, kemudian Anda dapat melakukan apa pun yang Anda inginkan dengan seleksi.

Pertimbangkan skenario umum berikut:

Anda harus memilih kurung yang cocok berikutnya.

Anda bisa melakukannya:

  • v% jika kursor berada di tanda kurung mulai / berakhir
  • vib jika kursor ada di dalam blok kurung

Anda ingin memilih teks di antara kutipan:

  • vi " untuk kutipan ganda
  • vi ' untuk kutipan tunggal

Anda ingin memilih blok penjepit keriting (sangat umum pada bahasa gaya-C):

  • viB
  • vi{

Anda ingin memilih seluruh file:

  • ggVG

Pemilihan blok visual adalah fitur lain yang sangat berguna, memungkinkan Anda untuk memilih area teks persegi panjang, Anda hanya perlu menekan Ctrl- Vuntuk memulainya, dan kemudian pilih blok teks yang Anda inginkan dan melakukan semua jenis operasi seperti mencabut, menghapus, rekatkan, edit, dll. Sangat menyenangkan untuk mengedit teks yang berorientasi kolom .

CMS
sumber
2
Setiap editor memiliki sesuatu seperti ini, tidak spesifik untuk vim.
finnw
22
Ya, tapi itu adalah keluhan spesifik dari poster itu. Mode visual adalah metode terbaik pemilihan teks dan manipulasi langsung Vim. Dan karena metode traversal buffer vim luar biasa, saya menemukan pemilihan teks dalam vim cukup menyenangkan.
senjata
9
Saya pikir layak juga menyebutkan Ctrl-V untuk memilih blok - yaitu persegi panjang teks sewenang-wenang. Ketika Anda membutuhkannya, itu adalah penyelamat.
Hamish Downer
6
@viksit: Saya menggunakan Camtasia, tetapi ada banyak alternatif: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS
3
Juga, jika Anda punya pilihan visual dan ingin menyesuaikannya, oakan melompat ke ujung lainnya. Jadi, Anda dapat memindahkan awal dan akhir seleksi sebanyak yang Anda suka.
Nathan Long
207

Beberapa kiat produktivitas:

Gerakan cerdas

  • * dan # cari kata di bawah kursor maju / mundur.
  • w ke kata selanjutnya
  • W ke kata yang dipisahkan spasi berikutnya
  • b/ eke awal / akhir dari kata saat ini. ( B/ hanya Euntuk ruang terpisah)
  • gg/ Glompat ke awal / akhir file.
  • % lompat ke yang cocok {..} atau (..), dll.
  • { / } lompat ke paragraf berikutnya.
  • '. melompat kembali ke baris yang terakhir diedit.
  • g; melompat kembali ke posisi terakhir yang diedit.

Perintah pengeditan cepat

  • I masukkan di awal.
  • A tambahkan untuk mengakhiri.
  • o / O buka baris baru setelah / sebelum saat ini.
  • v/ V/Ctrl+V mode visual (untuk memilih teks!)
  • Shift+R ganti teks
  • C ubah bagian garis yang tersisa.

Menggabungkan perintah

Sebagian besar perintah menerima jumlah dan arah, misalnya:

  • cW = ubah sampai akhir kata
  • 3cW = ubah 3 kata
  • BcW = untuk memulai kata penuh, ubah kata penuh
  • ciW = ubah kata hati.
  • ci" = ubah inner antara ".."
  • ci( = ubah teks antara (..)
  • ci< = ubah teks antara <..> (kebutuhan set matchpairs+=<:> di vimrc)
  • 4dd = hapus 4 baris
  • 3x = hapus 3 karakter.
  • 3s = gantikan 3 karakter.

Perintah programmer yang berguna

  • rganti satu karakter (mis. ganti karakter rdsaat ini dengan d).
  • ~ mengubah huruf.
  • J bergabung dengan dua baris
  • Ctrl + A / Ctrl + X menambah / mengurangi angka.
  • . ulangi perintah terakhir (makro sederhana)
  • == perbaiki indentasi saluran
  • > blok indent (dalam mode visual)
  • < blok tidak inden (dalam mode visual)

Rekaman makro

  • Tekan q[ key ]untuk mulai merekam.
  • Lalu tekan quntuk berhenti merekam.
  • Makro dapat dimainkan dengan @[ key ].

Dengan menggunakan perintah dan gerakan yang sangat spesifik, VIM dapat memutar ulang tindakan yang tepat untuk baris berikutnya. (misalnya A untuk append-to-end, b/ euntuk memindahkan kursor ke awal atau akhir kata masing-masing)

Contoh pengaturan yang dibangun dengan baik

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Pengaturan dapat disimpan di ~/.vimrc, atau di seluruh sistem /etc/vimrc.localdan kemudian dengan membaca dari /etc/vimrcfile menggunakan:

source /etc/vimrc.local

(Anda harus mengganti #karakter komentar dengan" agar berfungsi di VIM, saya ingin memberikan highlight sintaks yang tepat di sini).

Perintah yang saya daftarkan di sini cukup mendasar, dan yang utama saya gunakan sejauh ini. Mereka sudah membuat saya lebih produktif, tanpa harus tahu semua hal mewah.

vdboor
sumber
4
Lebih baik daripada '.ini g;, yang melompat kembali melalui Internet changelist. Pergi ke posisi yang diedit terakhir, alih-alih baris yang diedit terakhir
naught101
98

The Control+ RMekanisme ini sangat berguna :-) Dalam kedua modus insert atau modus perintah (yaitu pada :baris ketika perintah mengetik), lanjutkan dengan register nomor atau nama:

  • a- zregister bernama
  • " register tanpa nama, yang berisi teks dari penghapusan atau penarikan terakhir
  • % nama file saat ini
  • # nama file alternatif
  • * isi clipboard (X11: pemilihan utama)
  • + isi clipboard
  • / pola pencarian terakhir
  • : baris perintah terakhir
  • . teks yang dimasukkan terakhir
  • - penghapusan kecil terakhir (kurang dari satu baris)
  • =5*5 masukkan 25 ke dalam teks (kalkulator mini)

Lihat :help i_CTRL-Rdan :help c_CTRL-Runtuk lebih jelasnya, dan snoop di sekitarnya untuk kebaikan CTRL-R lainnya.

kev
sumber
10
FYI, ini merujuk ke Ctrl + R dalam mode insert . Dalam mode normal, Ctrl + R adalah redo.
vdboor
2
+1 untuk nama file saat ini / alternatif. Control-Ajuga berfungsi dalam mode penyisipan untuk teks yang disisipkan terakhir, dan Control-@untuk menyisipkan teks yang disisipkan terakhir dan segera beralih ke mode normal.
Aryeh Leib Taurog
91

Plugin Vim

Ada banyak jawaban bagus di sini, dan satu yang menakjubkan tentang zen of vi. Satu hal yang saya tidak lihat disebutkan adalah bahwa vim sangat dapat dikembangkan melalui plugin. Ada skrip dan plugin untuk membuatnya melakukan segala macam hal gila yang penulis asli tidak pernah pertimbangkan. Berikut adalah beberapa contoh plugin vim yang sangat berguna:

rails.vim

Rails.vim adalah plugin yang ditulis oleh tpope. Ini alat yang luar biasa bagi orang yang melakukan pengembangan rel. Itu melakukan hal-hal sensitif konteks ajaib yang memungkinkan Anda untuk dengan mudah beralih dari metode di controller ke tampilan terkait, ke model, dan ke unit test untuk model itu. Ini telah menyelamatkan puluhan jika tidak ratusan jam sebagai pengembang rel.

gist.vim

Plugin ini memungkinkan Anda untuk memilih wilayah teks dalam mode visual dan mengetik perintah cepat untuk mengirimnya gist.github.com . Ini memungkinkan akses pastebin yang mudah, yang sangat berguna jika Anda berkolaborasi dengan seseorang melalui IRC atau IM.

space.vim

Plugin ini menyediakan fungsionalitas khusus untuk bilah spasi. Itu mengubah bilah spasi menjadi sesuatu yang analog dengan periode, tetapi alih-alih mengulangi tindakan itu mengulangi gerakan. Ini bisa sangat berguna untuk bergerak cepat melalui file dengan cara yang Anda tetapkan saat itu juga.

surround.vim

Plugin ini memberi Anda kemampuan untuk bekerja dengan teks yang dibatasi dalam beberapa cara. Ini memberi Anda objek yang menunjukkan hal-hal di dalam parens, hal-hal di dalam tanda kutip, dll. Ini bisa berguna untuk memanipulasi teks yang dibatasi.

supertab.vim

Script ini membawa fungsionalitas penyelesaian tab mewah ke vim. Hal-hal pelengkapan otomatis sudah ada di inti vim, tetapi ini membawanya ke tab cepat daripada beberapa pintasan multikey yang berbeda. Sangat berguna, dan sangat menyenangkan untuk digunakan. Meskipun ini bukan intellisense VS, ini adalah langkah yang bagus dan membawa banyak fungsi yang ingin Anda harapkan dari alat penyelesaian tab.

syntastic.vim

Alat ini membawa perintah pemeriksaan sintaksis eksternal ke vim. Saya belum menggunakannya secara pribadi, tetapi saya sudah mendengar banyak hal hebat tentangnya dan konsepnya sulit dikalahkan. Memeriksa sintaksis tanpa harus melakukannya secara manual adalah penghemat waktu yang hebat dan dapat membantu Anda menangkap bug sintaksis saat Anda memperkenalkannya daripada ketika Anda akhirnya berhenti untuk menguji.

buron.vim

Akses langsung ke git dari dalam vim. Sekali lagi, saya belum pernah menggunakan plugin ini, tetapi saya dapat melihat utilitasnya. Sayangnya saya berada dalam budaya di mana svn dianggap "baru", jadi saya mungkin tidak akan melihat git di tempat kerja selama beberapa waktu.

nerdtree.vim

Peramban pohon untuk vim. Saya mulai menggunakan ini baru-baru ini, dan itu sangat berguna. Ini memungkinkan Anda meletakkan treeview dalam pemisahan vertikal dan membuka file dengan mudah. Ini bagus untuk proyek dengan banyak file sumber yang sering Anda lompati.

FuzzyFinderTextmate.vim

Ini adalah plugin yang tidak dirawat, tetapi masih sangat berguna. Ini memberikan kemampuan untuk membuka file menggunakan sintaks deskriptif "fuzzy". Ini berarti bahwa dalam pohon file yang jarang, Anda hanya perlu mengetikkan karakter yang cukup untuk memisahkan file yang Anda minati dari sisa cruft.

Kesimpulan

Ada banyak alat luar biasa yang tersedia untuk vim. Saya yakin saya hanya menggores permukaan di sini, dan ada baiknya mencari alat yang berlaku untuk domain Anda. Kombinasi toolset vi kuat tradisional, peningkatan vim di atasnya, dan plugin yang memperpanjang vim lebih jauh, itu salah satu cara paling ampuh untuk mengedit teks yang pernah dikandung. Vim dengan mudah sekuat emacs, eclipse, visual studio, dan textmate.

Terima kasih

Terima kasih kepada duwanis untuk konfigurasi vim- nya dari mana saya telah belajar banyak dan meminjam sebagian besar plugin yang tercantum di sini.

Benson
sumber
Navigasi tes-ke-ajaib di rails.vim adalah salah satu hal yang lebih umum yang saya harap Vim memiliki TextMate yang benar-benar cocok untuk semua bahasa: jika saya bekerja di Person.scala dan saya melakukan Cmd + T, biasanya hal pertama dalam daftar adalah PersonTest.scala.
Tom Morris
5
Saya pikir inilah saatnya FuzzyFinderTextmate mulai diganti dengan github.com/wincent/Command-T
Gavin Gilmour
2
+1 untuk Syntastic. Itu, dikombinasikan dengan JSLint, telah membuat Javascript saya jauh lebih rentan kesalahan. Lihat superuser.com/questions/247012/… tentang cara mengatur JSLint agar bekerja dengan Syntastic.
Nathan Long
1
@Benson Daftar hebat! Saya akan melemparkan snipMate juga. Otomatisasi sangat membantu untuk hal-hal pengkodean umum if <tab> instan jika diblokir, dll.
AlG
2
Saya pikir nerdcommenter juga merupakan plugin yang bagus: di sini . Seperti namanya, itu untuk mengomentari kode Anda.
Stephan
53

. Ulangi perintah pengubahan teks terakhir

Saya menghemat banyak waktu dengan yang satu ini.

Mode visual telah disebutkan sebelumnya, tetapi blok mode visual telah menghemat banyak waktu saya ketika mengedit kolom ukuran tetap dalam file teks. (diakses dengan Ctrl-V).

Cooper6581
sumber
3
Selain itu, jika Anda menggunakan perintah ringkas (mis. A untuk menambahkan-di-akhir) untuk mengedit teks, vim dapat mengulangi tindakan yang sama persis untuk baris berikutnya Anda menekan .tombol di.
vdboor
48

gi

Pergi ke lokasi yang terakhir diedit (sangat berguna jika Anda melakukan pencarian dan daripada ingin kembali mengedit)

^ P dan ^ N

Isi teks sebelumnya (^ P) atau berikutnya (^ N).

^ O dan ^ I

Pergi ke lokasi sebelumnya ( ^O- "O"untuk yang lama) atau ke yang berikutnya ( ^I- "I"hanya dekat dengan "O"). Saat Anda melakukan pencarian, mengedit file, dll., Anda dapat menavigasi melalui "lompatan" ini maju dan mundur.

dimba
sumber
4
@Kungi `. akan membawa Anda ke suntingan terakhir `` akan membawa Anda kembali ke posisi Anda sebelum 'lompatan' terakhir - yang / mungkin / juga menjadi posisi edit terakhir.
Grant McLean
46

Baru-baru ini saya menemukan situs ini: http://vimcasts.org/

Ini cukup baru dan sangat bagus. Orang yang menjalankan situs beralih dari textmate ke vim dan host gips yang sangat bagus dan ringkas tentang topik vim tertentu. Coba lihat!

Ronny Brendel
sumber
3
Jika Anda menyukai tutorial vim, lihat juga video vim Derek Wyatt . Mereka luar biasa.
Jeromy Anglim
42

CTRL+A menambah nomor yang Anda pegang.

hcs42
sumber
19
... dan penurunan CTRL-X.
innaM
9
Ini jalan pintas yang rapi tapi sejauh ini saya belum pernah menemukan gunanya.
SolutionYogi
8
jika Anda menjalankan vim di layar dan bertanya-tanya mengapa ini tidak berhasil - ctrl + A, A
matja
13
@SolutionYogi: Pertimbangkan bahwa Anda ingin menambahkan nomor baris ke awal setiap baris. Solusi: ggI1 <spasi> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42
10
Sangat berguna dengan Vimperator, di mana ia menambah (atau mengurangi, Ctrl-X) nomor terakhir di URL. Berguna untuk berselancar cepat melalui galeri gambar dll.
blueyed
38

Semua dalam mode Normal:

f <char> untuk pindah ke instance berikutnya dari karakter tertentu pada baris saat ini, dan ; mengulang.

F <char> untuk pindah ke instance sebelumnya dari karakter tertentu pada baris saat ini dan ; mengulang.

Jika digunakan dengan cerdas, dua di atas dapat membuat Anda cepat-pembunuh bergerak dalam satu garis.

* pada kata untuk mencari contoh berikutnya.

# pada kata untuk mencari contoh sebelumnya.

Eric Smith
sumber
6
Wah, saya tidak tahu tentang * dan # (mencari maju / kembali untuk kata di bawah kursor) mengikat. Itu agak keren. F / F dan t / T dan; perintah adalah lompatan cepat ke karakter pada baris saat ini. f / F menempatkan kursor pada karakter yang ditunjukkan sementara t / T menempatkannya hanya "ke" karakter (karakter sebelum atau sesudahnya sesuai dengan arah yang dipilih.; cukup mengulangi f / F / t / T yang terbaru lompat (ke arah yang sama)
Jim Dennis
10
:) Tagline di bagian atas halaman tips di vim.org: "Bisakah Anda bayangkan berapa banyak penekanan tombol yang bisa disimpan, jika saya hanya tahu perintah" * "tepat waktu?" - Juergen Salk, 1/19/2001 "
Yewge
1
Seperti yang disebutkan Jim, kombo "t / T" sering kali sama baiknya, jika tidak lebih baik, misalnya, ct(akan menghapus kata dan menempatkan Anda dalam mode penyisipan, tetapi simpan paranthes!
puk
34

Sidang

Sebuah. simpan sesi

: mks sessionname

b. paksa sesi save

: mks! nama sesi

c. sesi pemuatan

gvim atau vim -S sessionname


Menambah dan Mengurangkan

Sebuah. Menambah dan Mengurangkan

CTRL-A; Tambahkan [hitung] ke angka atau karakter alfabet pada atau setelah kursor. {tidak dalam Vi

CTRL-X; Kurangi [hitung] dari angka atau karakter alfabet pada atau setelah kursor. {tidak dalam Vi}

b. Kunci jendela tidak dipetakan

Di jendela, Ctrl-A sudah dipetakan untuk seluruh pemilihan file yang harus Anda hapus dalam file rc. tandai mswin.vim bagian pemetaan CTRL-A sebagai komentar atau tambahkan file rc Anda dengan unmap

c. Dengan Makro

Perintah CTRL-A sangat berguna dalam makro. Contoh: Gunakan langkah-langkah berikut untuk membuat daftar bernomor.

  1. Buat entri daftar pertama, pastikan itu dimulai dengan angka.
  2. qa - mulai merekam ke buffer 'a'
  3. Y - tarik masuk
  4. p - letakkan salinan entri di bawah yang pertama
  5. CTRL-A - menambah nomor
  6. q - berhenti merekam
  7. @ a - ulangi yank, put dan increment times
agfe2
sumber
1
Adakah yang tahu pintasan apa yang ada di Windows?
Don Reba
32

Minggu lalu di tempat kerja proyek kami mewarisi banyak kode Python dari proyek lain. Sayangnya kode tersebut tidak cocok dengan arsitektur kami yang ada - semuanya dilakukan dengan variabel dan fungsi global, yang tidak akan berfungsi di lingkungan multi-utas.

Kami memiliki ~ 80 file yang perlu dikerjakan ulang agar berorientasi objek - semua fungsi dipindahkan ke kelas, parameter diubah, pernyataan impor ditambahkan, dll. Kami memiliki daftar sekitar 20 jenis perbaikan yang perlu dilakukan untuk setiap file. Saya memperkirakan bahwa melakukannya dengan tangan yang bisa dilakukan oleh satu orang mungkin 2-4 per hari.

Jadi saya melakukan yang pertama dengan tangan dan kemudian menulis skrip vim untuk mengotomatiskan perubahan. Sebagian besar adalah daftar perintah vim misalnya

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Yang terakhir layak mendapat sedikit penjelasan:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Untuk beberapa transformasi yang lebih kompleks seperti menghasilkan semua pernyataan impor, saya menyertakan beberapa python ke skrip vim.

Setelah beberapa jam mengerjakannya, saya memiliki skrip yang akan melakukan setidaknya 95% dari konversi. Saya baru saja membuka file di vim kemudian jalankan :source fixit.vimdan file ditransformasikan dalam sekejap mata.

Kami masih memiliki pekerjaan untuk mengubah 5% sisanya yang tidak layak untuk diotomatisasi dan untuk menguji hasilnya, tetapi dengan menghabiskan satu hari menulis skrip ini, saya memperkirakan kami telah menghemat minggu kerja.

Tentu saja akan mungkin untuk mengotomatisasi ini dengan bahasa scripting seperti Python atau Ruby, tetapi itu akan memakan waktu lebih lama untuk menulis dan akan kurang fleksibel - contoh terakhir akan sulit karena regex saja tidak akan mampu menangani kurung bersarang, misalnya untuk dikonversi bar(foo(xxx))ke foo(xxx).bar(). Vim sempurna untuk tugas itu.

Dave Kirby
sumber
1
Terima kasih banyak untuk berbagi yang sangat bagus untuk dipelajari dari makro "berguna & tidak klasik".
Olivier Pons
%s/\(bar\)(\(.\+\))/\2.\1()/akan melakukannya juga. (Escapes kompatibel dengan :set magic.) Hanya sebagai catatan. :)
Ipsquiggle
1
Jika Anda tidak suka pelarian bergaya vim, gunakan \ v untuk menghidupkan Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle
@ lpsquiggle: saran Anda tidak akan menangani ekspresi kompleks dengan lebih dari satu set tanda kurung. misalnya if bar(foo(xxx)) or wibble(xxx): menjadi if foo(xxx)) or wibble(xxx.bar(): yang sepenuhnya salah.
Dave Kirby
28

Gunakan penjelajah file bawaan! Perintahnya adalah :Exploredan memungkinkan Anda untuk menavigasi kode sumber Anda dengan sangat cepat. Saya memiliki pemetaan ini di .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Penjelajah memungkinkan Anda untuk membuat modifikasi file juga. Saya akan memposting beberapa kunci favorit saya, menekan <F1>akan memberi Anda daftar lengkap:

  • - : Yang paling berguna: Ubah ke direktori atas ( cd ..)
  • mf : Tandai file
  • D : Hapus file yang ditandai atau file tempat kursor aktif, jika tidak ada yang ditandai.
  • R : Ganti nama file tempat kursor berada.
  • d : Buat direktori baru di direktori saat ini
  • % : Buat file baru di direktori saat ini
soulmerge
sumber
1
Saya selalu berpikir metode default untuk browsing agak menyedot sebagian besar barang. Cukup lambat untuk menjelajah, jika Anda tahu ke mana Anda ingin pergi. LustyExplorer dari bagian skrip vim.org adalah peningkatan yang sangat dibutuhkan.
Svend
Pemetaan kedua Anda bisa lebih sederhana: map <silent> <S-F8>: Sexplore <CR>
Taurus Olson
8
Saya merekomendasikan NERDtree alih-alih penjelajah internal. Itu telah mengubah cara saya menggunakan vim untuk proyek dan membuat saya jauh lebih produktif. Hanya google untuk itu.
kprobst
Saya tidak pernah merasa perlu untuk mengeksplorasi pohon sumber, saya hanya menggunakan :find, :tagdan berbagai penekanan tombol terkait untuk melompat-lompat. (Mungkin ini karena pohon sumber tempat saya bekerja besar dan terorganisir berbeda dari yang seharusnya saya lakukan? :))
dash-tom-bang
25

Saya adalah anggota dari American Cryptogram Association. Majalah dua bulanan mencakup lebih dari 100 jenis cryptogram. Kira-kira 15 di antaranya adalah "cryptarithms" - berbagai jenis masalah aritmatika dengan huruf-huruf yang diganti untuk digit. Dua atau tiga di antaranya adalah sudokus, kecuali dengan huruf, bukan angka. Ketika kisi-kisi selesai, sembilan huruf yang berbeda akan mengeja kata atau kata-kata, pada beberapa baris, diagonal, spiral, dll., Di suatu tempat di grid.

Daripada bekerja dengan pensil, atau mengetik masalah dengan tangan, saya mengunduh masalah dari area anggota situs web mereka.

Ketika bekerja dengan sudokus ini, saya menggunakan vi, hanya karena saya menggunakan fasilitas yang vi miliki oleh beberapa editor lain. Sebagian besar dalam mengubah kisi berhuruf menjadi kisi bernomor, karena saya merasa lebih mudah untuk menyelesaikan, dan kemudian kisi bernomor selesai kembali ke kisi berhuruf untuk menemukan kata solusi atau kata-kata.

Masalahnya diformat sebagai sembilan kelompok yang terdiri dari sembilan huruf, dengan huruf -s mewakili bagian yang kosong, ditulis dalam dua baris. Langkah pertama adalah memformat ini menjadi sembilan baris sembilan karakter masing-masing. Tidak ada yang istimewa tentang ini, hanya memasukkan delapan linebreak di tempat yang tepat.

Hasilnya akan terlihat seperti ini:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Jadi, langkah pertama dalam mengubah ini menjadi angka adalah membuat daftar huruf-huruf yang berbeda. Pertama, saya membuat salinan blok. Saya memposisikan kursor di bagian atas blok, lalu ketik :y}}p. :menempatkan saya dalam mode perintah, ymenarik perintah gerakan berikutnya. Karena }pindah ke akhir paragraf berikutnya, y}menarik paragraf. }lalu gerakkan kursor ke akhir paragraf, dan ptempelkan apa yang telah kita tarik tepat setelah kursor. Jadi y}}pbuat salinan paragraf berikutnya, dan berakhir dengan kursor di antara dua salinan.

Selanjutnya, saya mengubah salah satu salinan itu menjadi daftar surat yang berbeda. Perintah itu sedikit lebih rumit:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:lagi menempatkan saya dalam mode perintah. !menunjukkan bahwa konten yank berikutnya harus disalurkan melalui baris perintah. }menyentak ayat berikutnya, dan baris perintah kemudian menggunakan trperintah untuk menghapus segala sesuatu kecuali untuk huruf-huruf, yang sedperintah untuk mencetak setiap huruf pada satu baris, dan sortperintah untuk mengurutkan garis, menghapus duplikat, dan kemudian trstrip keluar baris baru, meninggalkan sembilan huruf berbeda dalam satu baris, menggantikan sembilan baris yang telah membentuk paragraf pada awalnya. Dalam hal ini, surat-suratnya adalah:ACELNOPST .

Langkah selanjutnya adalah membuat salinan grid yang lain. Dan kemudian menggunakan huruf Saya baru saja diidentifikasi untuk menggantikan masing-masing huruf dengan angka dari 1 sampai 9. Itu sederhana: :!}tr ACELNOPST 0-9. Hasilnya adalah:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Ini kemudian dapat dipecahkan dengan cara biasa, atau dimasukkan ke pemecah sudoku apa pun yang Anda inginkan. Solusi yang lengkap kemudian dapat dikonversi kembali menjadi huruf dengan :!}tr 1-9 ACELNOPST.

Ada kekuatan di vi yang cocok dengan sangat sedikit orang lain. Masalah terbesar adalah bahwa hanya sedikit dari buku tutorial vi, situs web, file bantuan, dll, melakukan lebih dari menyentuh permukaan apa yang mungkin.

Jeff Dege
sumber
dan iritasi adalah bahwa beberapa distro seperti ubuntu memiliki alias dari kata "vi" ke "vim" sehingga orang tidak akan benar-benar melihat vi. Contoh luar biasa, harus mencoba ... +1
hhh
1
Tidak vim memeriksa nama yang dimulai dengan sehingga dapat muncul di 'mode' yang tepat?
dash-tom-bang
3
Saya bingung dengan kesalahan yang berulang ini: Anda mengatakan Anda harus :masuk ke mode perintah, tetapi kemudian Anda selalu menentukan perintah mode normal (seperti y}}p) yang tidak mungkin bekerja dari mode perintah ?!
lihat
Pendapat saya tentang tantangan karakter unik: :se tw=1 fo=(persiapan) VG:s/./& /g(menyisipkan spasi), gvgq(terbagi menjadi beberapa baris terpisah), V{:sort u(mengurutkan dan menghapus duplikat)
sehe
23

Manipulasi teks massal!

Baik melalui makro:

  • Mulai dengan rekaman: qq
  • Lakukan hal-hal
  • Hentikan rekaman: q
  • Ulangi: @q(pertama kali),@@ setelah itu.
  • Ulangi 20 kali: 20@@

Atau melalui ekspresi reguler:

  • Ganti barang: :%s/[fo]+/bar/g

(Tetapi berhati-hatilah: jika Anda melakukan yang terakhir, Anda akan memiliki 2 masalah :).)

jqno
sumber
5
+1 untuk referensi Jamie Zawinski . (Bahkan tidak ada poin yang diambil karena gagal menautkannya). :)
Jim Dennis
1
@ Jim, aku bahkan tidak tahu itu adalah kutipan Jamie Zawinski :). Saya akan mencoba mengingatnya mulai sekarang.
jqno
Saya menemukan trik berikut ini semakin berguna ... untuk kasus di mana Anda ingin bergabung dengan garis yang cocok (atau yang TIDAK cocok) beberapa pola ke baris sebelumnya: :% g/foo/-1jatau :'a,'z v/bar/-1jmisalnya (di mana yang pertama adalah "semua garis dan cocok dengan pola" sedangkan yang terakhir adalah "garis antara tanda a dan tanda z yang gagal cocok dengan pola"). Bagian setelah derai dalam perintah a gatau vex dapat berupa perintah ex lainnya, -1j hanyalah gerakan garis relatif dan bergabung dengan perintah.
Jim Dennis
tentu saja, jika Anda memberi nama makro Anda '2', maka ketika tiba saatnya untuk menggunakannya, Anda bahkan tidak perlu memindahkan jari Anda dari tombol '@' ke tombol 'q'. Mungkin menghemat 50 hingga 100 milidetik setiap saat di sana. = P
JustJeff
@JustJeff Tergantung sepenuhnya pada tata letak keyboard Anda, tombol @ saya ada di sisi lain keyboard dari tombol 2 saya.
Simon Steele
23

Saya baru-baru ini menemukan q:. Ini membuka "jendela perintah" dan menunjukkan perintah ex-mode (mode-perintah) terbaru Anda. Anda dapat bergerak seperti biasa di dalam jendela, dan menekan <CR>menjalankan perintah. Anda dapat mengedit, dll. Juga. Tak ternilai saat Anda bermain-main dengan beberapa perintah kompleks atau regex dan Anda tidak ingin mengetik ulang semuanya, atau jika hal kompleks yang ingin Anda lakukan adalah 3 perintah kembali. Ini hampir seperti bash set -o vi, tetapi untuk vim itu sendiri (heh!).

Lihat :help q:bit yang lebih menarik untuk bolak-balik.

David Pope
sumber
22

Saya baru saja menemukan penyelesaian omnic Vim tempo hari, dan walaupun saya akui saya agak kabur tentang apa yang dilakukan, saya mendapatkan hasil yang sangat bagus hanya menumbuk Ctrl+ x Ctrl+ uatau Ctrl+ n/ Ctrl+ pdalam mode insert. Ini bukan IntelliSense , tapi saya masih mempelajarinya.

Cobalah! :help ins-completion

Peter Mortensen
sumber
20

Ini bukan jalan pintas, tetapi terkait:

  1. Buat capslock sebuah ESC tambahan (atau Ctrl)
  2. pemimpin peta ke "," (koma), dengan perintah ini: biarkan mapleader = ","

Mereka meningkatkan produktivitas saya.

tfmoraes
sumber
Hai petunjuk bagus tentang "\"! Jauh lebih baik mengetik "," daripada "\".
Olivier Pons
2
Untuk menjadikan Caps Lock sebagai Esc tambahan di Windows (untuk apa kunci caps lock? "Key apa saja"?), Coba ini: web.archive.org/web/20100418005858/http://webpages.charter.net/…
R. Martinho Fernandes
Di Mac, Anda memerlukan PCKeyboardHack - detail di superuser.com/questions/34223/…
Tom Morris
1
Pada Windows saya menggunakan Capslock::Escape
AutoHotKey
19

"Pintasan" vi lain yang bermanfaat yang sering saya gunakan adalah 'xp'. Ini akan menukar karakter di bawah kursor dengan karakter berikutnya.

Costyn
sumber
3
Xpuntuk pergi ke arah lain
tester
5
Sekitar waktu Windows xp keluar, saya sering bercanda bahwa ini adalah satu-satunya penggunaan yang baik untuk itu.
kguest
18

<Ctrl> + W, V untuk membagi layar secara vertikal
<Ctrl> + W, W untuk berpindah antar jendela

! python% [args] untuk menjalankan skrip yang saya edit di jendela ini

ZF dalam mode visual untuk melipat garis sewenang-wenang

Peter Ellis
sumber
2
<Ctrl> + W dan j / k akan memungkinkan Anda bernavigasi secara total (j up, k down, seperti halnya vim normal). Ini bagus ketika Anda memiliki 3+ split.
Andrew Scagnelli
1
+1 untuk zf dalam mode visual, saya suka kode lipat, tetapi tidak tahu tentang itu.
coder_tim
2
setelah bashing keyboard saya saya telah menyimpulkan bahwa <C-w>natau <C-w>smerupakan jendela horisontal baru, <C-w>badalah jendela kanan bawah, <C-w>catau <C-w>qyang jendela dekat, <C-w>xadalah peningkatan dan kemudian menurun lebar jendela (??), <C-w>padalah jendela terakhir, <C-w>backspaceyang bergerak ke kiri window (ish)
puk
:help ctrl-wFTW ... bantulah dirimu sendiri, dan paksakan dirimu untuk mencoba hal-hal ini setidaknya selama 15 menit!
sjas
18

Mode Visual

Seperti beberapa orang lain katakan, mode visual adalah jawaban untuk masalah salin / potong & tempel Anda. Vim memberi Anda 'v', 'V', dan Cv. Huruf kecil 'v' dalam vim pada dasarnya sama dengan tombol shift di notepad. Yang menyenangkan adalah Anda tidak harus menahannya. Anda dapat menggunakan teknik gerakan apa pun untuk menavigasi secara efisien ke titik awal (atau akhir) pilihan Anda. Lalu tekan 'v', dan gunakan teknik gerakan efisien lagi untuk menavigasi ke ujung pilihan Anda. Kemudian 'd' atau 'y' memungkinkan Anda untuk memotong atau menyalin pilihan itu.

Mode visual kelebihan vim memiliki lebih dari deskripsi Jim Dennis tentang cut / copy / paste in vi adalah Anda tidak harus mendapatkan lokasi yang tepat. Terkadang lebih efisien untuk menggunakan gerakan cepat untuk mencapai area umum di mana Anda ingin pergi dan kemudian memperbaikinya dengan gerakan lain daripada memikirkan perintah gerakan tunggal yang lebih kompleks yang membuat Anda tepat di tempat yang ingin Anda tuju.

Kelemahan dari menggunakan mode visual secara luas dengan cara ini adalah bahwa hal itu dapat menjadi penopang yang Anda gunakan sepanjang waktu yang mencegah Anda dari mempelajari perintah vi (m) baru yang memungkinkan Anda melakukan sesuatu dengan lebih efisien. Namun, jika Anda sangat proaktif dalam mempelajari aspek baru vi (m), maka ini mungkin tidak akan banyak mempengaruhi Anda.

Saya juga akan menekankan kembali bahwa garis visual dan mode blok visual memberi Anda variasi pada tema yang sama yang bisa sangat kuat ... terutama mode blok visual.

Penggunaan Keyboard yang Efisien

Saya juga tidak setuju dengan pernyataan Anda bahwa bergantian tangan adalah cara tercepat untuk menggunakan keyboard. Ia memiliki unsur kebenaran di dalamnya. Secara umum, penggunaan berulang dari hal yang sama lambat. Contoh paling penting dari prinsip ini adalah bahwa penekanan tombol berurutan yang diketik dengan jari yang sama sangat lambat. Penegasan Anda mungkin berasal dari kecenderungan alami untuk menggunakan s / jari / tangan / transformasi pada pola ini. Sampai batas tertentu itu benar, tetapi pada ujung yang sangat tinggi dari spektrum efisiensi itu tidak benar.

Tanyakan pianis mana saja. Tanyakan kepada mereka apakah lebih cepat memainkan serangkaian not secara bergantian atau menggunakan jari berturut-turut dari satu tangan secara berurutan. Cara tercepat untuk mengetik 4 kali penekanan tombol bukan dengan mengganti tangan, tetapi mengetiknya dengan 4 jari tangan yang sama dalam urutan naik atau turun (sebut ini "lari"). Ini harus jelas setelah Anda mempertimbangkan kemungkinan ini.

Masalah yang lebih sulit adalah mengoptimalkan hal ini. Cukup mudah untuk mengoptimalkan jarak absolut pada keyboard. Vim melakukan itu. Jauh lebih sulit untuk mengoptimalkan pada level "run", tetapi vi (m) dengan pengeditan modalnya memberi Anda kesempatan yang lebih baik untuk bisa melakukannya daripada pendekatan non-modal (ahem, emacs) yang pernah ada.

Di Emacs

Supaya para fanatik emacs benar-benar mengabaikan seluruh posting saya karena komentar kurung terakhir, saya merasa saya harus menggambarkan akar perbedaan antara emacs dan agama vim. Saya tidak pernah berbicara dalam perang editor dan saya mungkin tidak akan melakukannya lagi, tetapi saya belum pernah mendengar ada orang yang menggambarkan perbedaannya seperti ini, jadi begini saja. Perbedaannya adalah pengorbanan berikut:

Vim memberi Anda efisiensi pengeditan teks mentah yang tak tertandingi Emacs memberi Anda kemampuan yang tak tertandingi untuk menyesuaikan dan memprogram editor

Fanatik vim buta akan mengklaim bahwa vim memiliki bahasa scripting. Tapi itu adalah bahasa ad-hoc yang tidak jelas yang dirancang untuk melayani editor. Emacs memiliki Lisp! Cukup kata. Jika Anda tidak menghargai pentingnya dua kalimat terakhir atau memiliki keinginan untuk belajar cukup banyak tentang pemrograman fungsional dan Lisp untuk mengembangkan apresiasi itu, maka Anda harus menggunakan vim.

Para fanatik emacs akan mengklaim bahwa emacs memiliki mode viper, dan karenanya merupakan superset dari vim. Tetapi mode viper tidak standar. Pemahaman saya adalah bahwa mode viper tidak digunakan oleh mayoritas pengguna emacs. Karena ini bukan default, sebagian besar pengguna emacs mungkin tidak mengembangkan apresiasi sejati untuk manfaat dari paradigma modal.

Menurut pendapat saya, perbedaan-perbedaan ini bersifat ortogonal. Saya percaya manfaat vim dan emacs seperti yang telah saya nyatakan keduanya valid. Ini berarti bahwa editor utama belum ada. Mungkin benar bahwa emacs akan menjadi platform termudah untuk menjadi basis editor utama. Tetapi pengeditan modal tidak tertanam dalam pola pikir emacs. Komunitas emacs bisa bergerak seperti itu di masa depan, tetapi itu tampaknya tidak terlalu mungkin.

Jadi jika Anda ingin efisiensi pengeditan mentah, gunakan vim. Jika Anda ingin lingkungan terbaik untuk skrip dan pemrograman editor Anda menggunakan emacs. Jika Anda menginginkan keduanya dengan penekanan pada kemampuan diprogram, gunakan emacs dengan mode viper (atau programkan mode Anda sendiri). Jika Anda menginginkan yang terbaik dari kedua dunia, Anda kurang beruntung untuk saat ini.

user307058
sumber
17

Habiskan 30 menit melakukan tutorial vim (jalankan vimtutor alih-alih vim di terminal). Anda akan mempelajari gerakan dasar, dan beberapa penekanan tombol, ini akan membuat Anda setidaknya sama produktifnya dengan vim seperti halnya dengan editor teks yang Anda gunakan sebelumnya. Setelah itu, baca jawaban Jim Dennis lagi :)

Konryd
sumber
1
Ini adalah hal pertama yang saya pikirkan ketika membaca OP. Sudah jelas bahwa poster tidak pernah menjalankan ini; Saya berlari melalui itu ketika pertama kali belajar vim dua tahun lalu dan itu mengukuhkan dalam benak saya keunggulan Vim ke salah satu editor lain yang telah saya gunakan (termasuk, bagi saya, Emacs karena kombo kunci yang mengganggu untuk digunakan pada Mac) .
dash-tom-bang
16

Bagaimana cara Anda menggunakan Vim yang membuat Anda lebih produktif daripada dengan editor kontemporer?

Mampu melakukan pengeditan yang kompleks dan berulang dengan sedikit penekanan tombol (sering menggunakan makro ). Lihatlah VimGolf untuk menyaksikan kekuatan Vim!

Setelah lebih dari sepuluh tahun penggunaan sehari-hari, sulit membayangkan menggunakan editor lain.

Johnsyweb
sumber
16

Gunakan \cdi mana saja dalam pencarian untuk mengabaikan case (mengganti pengaturan ignorecase atau smartcase Anda). Misalnya/\cfoo atau /foo\cakan cocok foo, Foo, fOO, FOO, dll

Gunakan \Cdi mana saja dalam pencarian untuk memaksa pencocokan kasus. Misalnya /\Cfooatau/foo\C hanya akan cocok dengan foo.

kev
sumber
16

Saya terkejut menemukan tidak ada yang menyebut tgerakan itu. Saya sering menggunakannya dengan daftar parameter dalam bentuk dt,atauyt,

David Corbin
sumber
2
atau dfx, dFx, dtx, ytx, dll di mana x adalah char, +1
hhh
Iya! Dan jangan lupa ct (ubah ke).
markle976
16

Aneh, tidak ada yang disebutkan ctag. Unduh "ctag riang" dan letakkan di depan versi jelek yang sudah Anda miliki di jalur pencarian. Cd ke root apa pun yang sedang Anda kerjakan; misalnya distribusi kernel Android. Ketik "ctags -R." untuk membangun indeks file sumber di mana saja di bawah dir dalam file bernama "tag". Ini berisi semua tag, bukan bahasa atau di mana pun dalam dir, dalam satu file, jadi pekerjaan lintas-bahasa itu mudah.

Kemudian buka vim di folder itu dan baca: help ctags untuk beberapa perintah. Beberapa yang sering saya gunakan:

  • Letakkan kursor pada pemanggilan metode dan ketik CTRL-] untuk pergi ke definisi metode.

  • Ketik: ta nama untuk pergi ke definisi nama.

Bradjcox
sumber
14

Lekukan otomatis:

gg(buka awal dokumen)
=(indent time!)
shift-g(pergi ke akhir dokumen)

Anda akan memerlukan 'indentasi plugin tipe' pada .vimrcfile Anda , dan mungkin pengaturan 'shiftwidth' dan 'bentangkan tab' yang sesuai.

David Claridge
sumber
4
Atau cukup gunakan fasilitas ": set ai" (indentasi otomatis), yang telah ada sejak awal.
xcramps
14

Anda bertanya tentang jalan pintas yang produktif, tetapi saya pikir pertanyaan Anda sebenarnya adalah: Apakah vim sepadan? Jawaban untuk pertanyaan stackoverflow ini adalah -> "Ya"

Anda pasti memperhatikan dua hal. Vim kuat, dan vim sulit dipelajari. Sebagian besar kekuatannya terletak pada perluasannya dan kombinasi perintah yang tak ada habisnya. Jangan merasa kewalahan. Lambat. Satu perintah, satu plugin sekaligus. Jangan berlebihan.

Semua investasi yang Anda masukkan ke vim akan membayar seribu kali lipat. Anda akan berada di dalam editor teks selama berjam-jam sebelum Anda mati. Vim akan menjadi temanmu.

autodidakto
sumber
13

Banyak buffer, dan khususnya lompatan cepat di antara mereka untuk membandingkan dua file dengan :bpdan :bn(dipetakan ulang dengan benar ke satu Shift+ patau Shift+ n)

vimdiff mode (terbagi dalam dua buffer vertikal, dengan warna untuk menunjukkan perbedaan)

Salin area dengan Ctrl+v

Dan akhirnya, tab penyelesaian pengidentifikasi (cari "mosh_tab_or_complete"). Itu pengubah kehidupan.

Stefano Borini
sumber
12

Setuju dengan poster teratas - the : r! perintah ini sangat bermanfaat.

Paling sering saya menggunakannya untuk "menempelkan" hal-hal:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Dengan cara ini saya tidak perlu mengutak-atik :set paste.

David Wolever
sumber
3
Mungkin lebih baik untuk mengatur clipboardopsi ke unnamed( set clipboard=unnameddalam .vimrc Anda) untuk menggunakan clipboard sistem secara default. Atau jika Anda masih ingin sistem clipboard terpisah dari register disebutkan namanya, menggunakan tepat bernama clipboard mendaftar: "*p.
R. Martinho Fernandes
2
Suka! Setelah kesal dengan menempelkan contoh kode dari web dan saya baru saja mulai merasa mahir dalam vim. Itulah perintah yang saya impikan saat itu juga. Inilah saat vim benar-benar mengaitkan saya.
kevpie
Jika Anda mengembangkan di Mac, Command + C dan Command + V salin dan tempel menggunakan clipboard sistem, tidak diperlukan remap.
Ben Mordecai
Hanya dengan GVIm ... Dari konsol, menempel tanpa :set pastetidak berfungsi dengan baik jika autoindent diaktifkan.
David Wolever