Catatan dari penerjemah: ini adalah bagian pertama dari artikel monumental (sebenarnya monumental) tentang Vim dan kemampuannya dari pengembang dari Minneapolis dan penulis proyek PostgREST, Joe memperanakkan Nelson.
Bagian pertama dari artikel ini ditujukan untuk berkenalan dengan sejarah Vim sebagai editor, dan penulis berbicara tentang sejumlah fakta menarik tentang kemampuan Vim. Pada bagian kedua dari terjemahan, semua chip dan hack kehidupan yang Joe memutuskan untuk dibagikan kepada audiens akan terkonsentrasi, di sana narasinya, dengan demikian, memudar dan hanya ada satu set pedoman untuk tindakan. Karena teks aslinya memiliki dimensi yang sama sekali tidak dapat diterima, kami membagi cerita ini menjadi dua artikel yang kira-kira berukuran sama. Hari ini adalah yang pertama dari dua publikasi. Selamat membaca.
Artikel ini didasarkan pada penelitian sejarah Vim dan membaca sampul buku petunjuknya. Saya harap catatan ini akan membantu Anda menemukan (atau menemukan kembali?) Fungsi dasar editor ini untuk Anda sendiri, serta memungkinkan Anda untuk meninggalkan penggunaan file vimrc yang diperingatkan dan menggunakan plugin dengan lebih bijaksana.

Referensi
Untuk melampaui topik yang biasa, saya akan merekomendasikan mendapatkan salinan kertas dari manual ini dan referensi saku yang luas. Saya tidak dapat menemukan salinan cetak dari panduan pengguna untuk Vim, jadi pada akhirnya saya hanya mencetak
file PDF yang menyertai editor menggunakan printme1.com.
$VIMRUNTIME/doc/usr_??
ini disertai dengan perangkat lunak dalam
$VIMRUNTIME/doc/usr_??
. Sebagai daftar perintah yang mudah saya dapat menyarankan buku referensi
"Vi and Vim Editor Pocket" .
Isi- Ceritanya
- Hirarki konfigurasi
- Plugin pihak ke-3
- Cadangan dan kickback
- Sertakan dan jalan
- Mengedit dan menyusun loop
- Diff dan Patch
- Input / output buffer
- Jenis file
- Jangan lupakan tetikus
- Lain-lain
Ceritanya
Kelahiran vi
Perintah dan fungsi Vi telah ada selama lebih dari lima puluh tahun, dimulai dengan editor QED. Inilah timeline-nya:
- 1966: QED (Editor Cepat) di Sistem Timesharing Berkeley
- Juli 1969: dengan bantuannya mereka mendarat di bulan (yah, untuk referensi)
- Agustus 1969: QED → red di AT&T
- 1976 Februari: ed → em ("Editor for Mortals") di Queen Mary's College
- 1976: em → ex ("EXtended") di University of California, Berkeley
- 1977 Okt: ex menerima mode visual, terminal vi-text
Jika Anda membaca
QED dan
ex manual, Anda mungkin menemukan beberapa kesamaan di antara mereka. Kedua editor menggunakan tata bahasa yang sama untuk menunjukkan dan bekerja dengan rentang garis.
Editor seperti QED ed dan em dirancang untuk terminal cetak, yang sebagian besar adalah mesin tik listrik biasa dengan modem yang terhubung dengannya. Terminal "mesin fotokopi penuh" seperti itu menampilkan perintah di atas kertas dan jelas, setelah masuk tidak mungkin untuk melakukan koreksi. Oleh karena itu, proses pengeditan terdiri dari mengedit perintah pengguna secara manual di atas kertas, dan kemudian memasukkannya kembali.
Pada 1976, terminal video, misalnya, ADM-3A, muncul. "Mode terbuka" telah ditambahkan ke editor Ex, yang memungkinkan pengeditan melalui terminal video dalam satu halaman. Mode visual ditambahkan untuk mengarahkan garis terminal menggunakan kursor. Mode visual diaktifkan oleh perintah "vi" dan terus-menerus memperbarui file yang ditampilkan di layar, sambil mempertahankan posisi baris perintah di bagian bawah layar. Fakta menarik: panah ditempatkan pada tombol h, j, k, l pada ADM-3A, yang memungkinkan kami untuk memindahkan kursor ke vi.
Anda dapat mempelajari lebih lanjut tentang transisi ini dari ed ke ex / vi dalam
sebuah wawancara dengan Bill Joy . Di dalamnya, ia berbicara tentang bagaimana ia menciptakan ex / vi dan tentang beberapa hal yang akhirnya mengecewakannya.
Klasik vi hanya alter ex. Keduanya diwakili oleh file biner yang sama, yang dapat dijalankan dalam mode ex-mode dan vi-mode, tergantung pada nama file yang dapat dieksekusi. Warisan dari keseluruhan cerita ini adalah bahwa ex / vi "dibuka" saat digunakan, hampir tidak memerlukan sumber daya sistem dan dapat bekerja dalam kondisi bandwidth terbatas. Ini juga tersedia pada sebagian besar sistem yang ada dan
sepenuhnya dijelaskan dalam POSIX.
Vi ke vim
Berasal dari ed, mantan editor adalah properti intelektual AT&T. Untuk menggunakan vi pada platform selain Unix, orang harus menulis klon yang memiliki basis kode sumber berbeda.
Inilah beberapa di antaranya:
- nvi - 1980 untuk 4BSD
- calvin - 1987 untuk DOS
- vile - 1990 untuk DOS
- stevie - 1987 untuk Atari ST
- elvis - 1990 untuk Minix dan 386BSD
- vim - 1991 untuk Amiga
- viper - 1995 untuk Emacs
- elwin - 1995 untuk Windows
- lemmy - 2002 untuk Windows
Kami akan fokus pada klon dari pusat daftar - Vim. Bram Mulenaar ingin menggunakan vi pada Amiga dan mulai porting dengan Atari dan mengembangkan vi clone stevie. Dan dia menamai versinya dari port “Vi Imitation”. Jika Anda ingin belajar tentang proses ini secara langsung, maka saksikan wawancara untuk Majalah Perangkat Lunak Bebas.
Dalam versi 1.22, Vim diganti namanya menjadi "Vi IMproved", yang menunjukkan superioritas salinan daripada yang asli. Berikut adalah grafik dari versi utama berikut dengan deskripsi beberapa fitur:

Untuk informasi lebih lanjut tentang setiap versi, bantuan harus digunakan, misalnya, untuk vim8. Untuk melihat pembaruan yang direncanakan, serta daftar kesalahan yang diketahui, Anda harus beralih ke todo.txt.
Sebagai contoh, versi kedelapan menyertakan beberapa dukungan untuk pekerjaan asinkron karena tekanan pada proyek dari NeoVim. Pengembang yang terakhir
ingin menjalankan debugging dan REPL untuk skrip web tepat di dalam editor.
Secara umum Vim superportable. Mengadaptasi seluruh sejarah keberadaannya untuk bekerja pada platform yang sama sekali berbeda, editor ini dipaksa untuk tetap berada dalam kerangka budaya "mudah" pengkodean. Vim berjalan pada OS / 390, Amiga, BeOS dan BeBox, Macintosh Classic, Atari MiNT, MS-DOS, OS / 2, QNX, RISC-OS, BSD, Linux, OS X, VMS dan MS-Windows. Anda dapat mengandalkan Vim di mana saja dan tidak peduli peralatan apa yang Anda gunakan.
Pada akhir jalur vi asli, pada tahun 2002, kode sumber ex / vi masih diterbitkan di bawah lisensi perangkat lunak bebas BSD. Penyihir tersedia di
ex-vi.sourceforge.net .
Tapi mari kita mulai bisnis. Sebelum Anda mulai menganalisis Vim, penting untuk mengetahui bagaimana Vim mengatur dan membaca file konfigurasinya.
Hirarki konfigurasi
Sebelumnya, saya secara keliru percaya bahwa Vim mendapatkan semua pengaturan dan skripnya hanya dari file .vimrc. Melihat repositori “dotfile” acak hanya dapat memperkuat pendapat ini. Cukup sering, orang mengunggah file intis tunggal .vimrc yang tugasnya mengontrol setiap aspek editor. Konfigurasi besar ini kadang-kadang juga disebut "vim distro".
Bahkan, Vim memiliki struktur yang rapi di mana .vimrc hanyalah salah satu dari banyak "titik masuk". Bahkan, Anda sendiri dapat meminta Vim skrip mana yang dimuatnya. Untuk melakukan ini, edit beberapa kode sumber untuk proyek acak pada mesin Anda, unduh dan jalankan perintah
:scriptnames
Daftar ini layak dibaca. Coba tebak apa yang dilakukan skrip ini dan tulis direktori di mana skrip berada.
Daftarnya lebih panjang dari yang Anda harapkan? Jika Anda telah menginstal banyak plugin, maka editor harus melakukan banyak hal. Verifikasi bahwa itu melambat pada saat startup dengan menjalankan perintah start.log penciptaan berikut:
vim --startuptime start.log name-of-your-file
Bandingkan saja seberapa cepat Vim dimulai dari luar kotak:
vim --clean --startuptime clean.log name-of-your-file
Untuk menentukan skrip mana yang harus dimuat saat startup atau selama pemuatan buffer, Anda perlu memeriksa jalur runtime Vim. Jalur ini diwakili oleh daftar direktori yang dipisahkan koma, yang masing-masing berisi struktur umum. Vim memeriksa struktur ini di setiap direktori untuk menemukan skrip startupnya. Direktori diproses secara ketat sesuai urutannya.
Periksa jalur eksekusi di sistem Anda melalui perintah ini:
:set runtimepath
Sistem saya berisi direktori berikut yang ditentukan secara default untuk verifikasi runtimepath. Bahkan tidak semua dari mereka ada, tetapi Vim akan tetap mencoba mengaksesnya dan akan memeriksa isinya jika masih ada:
~/.vim
Direktori rumah, dirancang untuk profil yang dibuat.
/usr/local/share/vim/vimfiles
Direktori Vim di seluruh sistem, untuk profil dengan hak administrator sistem.
/usr/local/share/vim/vim81
Aka $ VIMRUNTIME, untuk file yang didistribusikan dengan Vim.
/usr/local/share/vim/vimfiles/after
Dalam direktori Vim seluruh sistem, ada juga direktori after. Ini dimaksudkan untuk menambahkan pengaturan pribadi administrator sistem "default".
~/.vim/after
Direktori "setelah" di direktori home. Ini diperlukan agar konfigurasi pribadi tidak membatalkan atau tumpang tindih dengan pengaturan sistem atau "default".
Secara umum, direktori diproses dalam urutan yang sama di mana mereka ditulis dalam start.log, pengecualian dibuat hanya untuk "setelah". Yang ini selalu ada di akhir daftar dan diproses terakhir.
Saat memproses setiap direktori, Vim mencari subfolder di dalamnya dengan nama tertentu. Untuk mempelajari lebih lanjut tentang ini, lihat bantuan runtimepath. Berikut adalah uraian singkat tentang hal-hal yang akan kami pertimbangkan lebih lanjut dalam teks:
plugin /
Di sini letak file skrip Vim yang secara otomatis dimuat saat mengedit semua jenis file. Mereka juga disebut "global."
autoload /
(Jangan bingung dengan "plugin"). Skrip startup ini berisi fungsi yang diperketat hanya atas permintaan skrip lain.
ftdetect /
Script untuk menentukan jenis file. Dalam pekerjaan mereka, mereka bergantung pada ekstensi, lokasi, atau konten internal file.
ftplugin /
Script yang dieksekusi saat mengedit file dari tipe yang dikenal.
compiler /
Menentukan cara menjalankan berbagai kompiler atau pemeriksaan serat, dan bagaimana menganalisis outputnya. Ini dapat dibagi antara beberapa ftplugin sekaligus. Kompiler tidak dieksekusi secara otomatis dan harus dipanggil oleh perintah.
pack /
Wadah untuk paket Vim 8 asli, penerus manajemen paket gaya-Pathogen. Ini memiliki sistem pengemasan sendiri, tidak memerlukan kode pihak ketiga untuk bekerja.
Dan akhirnya,
~ / .vimrc
adalah jebakan untuk pengaturan editor umum. Digunakan untuk mengonfigurasi pengaturan default, yang dapat ditetapkan untuk jenis file tertentu. Untuk melihat seluruh daftar, Anda dapat memilih .vimrc dan menjalankan perintah opsi.
Plugin pihak ke-3
Plugin hanyalah skrip Vim, yang cukup untuk menempatkannya di tempat yang benar di runtimepath. Secara umum, proses instalasi sangat sederhana: cukup unggah file. Masalahnya adalah beberapa plugin cukup sulit untuk diperbarui atau dihapus, karena mereka tersebar di subdirektori yang berbeda dan mereka menyumbat jalur eksekusi dengan skrip mereka. Artinya, pada akhirnya sulit untuk menentukan file mana yang menjadi milik plugin yang mana.
Untuk mengatasi masalah ini, "pengelola plugin" mulai berkembang. Di vim.org ada registry plugin setidaknya sampai tahun 2003 inklusif (jika arsip tidak berbohong). Namun, "pengelola plugin" sebagai entitas baru masuk mode pada 2008.
Alat-alat ini menambahkan direktori khusus untuk plugin untuk melacak jalur eksekusi dan mengatur tag dimana plugin dapat dilacak. Sebagian besar manajer juga menarik pembaruan plugin dari jaringan.
Di bawah ini saya telah membangun manajer plugin sesuai dengan kronologi kejadiannya. Berdasarkan rentang tanggal rilis versi pertama dan terbaru. Jika tidak ada rilis resmi, maka saya mengambil tanggal rilis paling awal dan pembaruan terakhir.
- Mar 2006 - Jul 2014: Vimball
- Okt 2008 - Des 2015: Patogen
- Agustus 2009 - Des 2009: Vimana
- Des 2009 - Des 2014: VAM
- Agustus 2010 - Nov 2010: Sentakan
- Okt 2010 - Nov 2012: tplugin
- Okt 2010 - Februari 2014: Vundle
- Mar 2012 - Mar 2018: vim-flavor
- Apr 2012 - Mar 2016: NeoBundle
- Jan 2013 - Agustus 2017: infeksi
- Feb 2013 - Agustus 2016: vimogen
- Oktober 2013 - Jan 2015: vim-unbundle
- Des 2013 - Jul 2015: Vizardry
- Feb 2014 - Okt 2018: vim-plug
- Jan 2015 - Okt 2015: enabler
- Agu 2015 - Apr 2016: Vizardry 2
- Jan 2016 - Jun 2018: dein.vim
- Sep 2016 - Sekarang: asli dalam Vim 8
- Feb 2017 - Sep 2018: minpac
- Mar 2018 - Mar 2018: autopac
- Feb 2017 - Jun 2018: paket
- Mar 2017 - Sep 2017: vim-pck
- Sep 2017 - Sep 2017: vim8-pack
- Sep 2017 - Mei 2019: volt
- Sep 2018 - Feb 2019: vim-packager
- Feb 2019 - Feb 2019: plugpac.vim
Hal pertama yang perlu Anda perhatikan dalam daftar di atas adalah variasi yang sangat besar. Yang kedua - masing-masing alat yang disajikan telah "hidup" selama sekitar empat tahun, dan kemudian, kemungkinan besar, keluar dari mode.
Jalur resistensi paling sedikit dalam manajemen plugin adalah dengan menggunakan fungsionalitas Vim 8 bawaan, yang tidak perlu menarik kode pihak ketiga apa pun. Mari kita lihat bagaimana melakukannya.
Untuk memulai, buat dua direktori di dalam runtimepath Anda: opt and start.
mkdir -p ~/.vim/pack/foobar/{opt,start}
Perhatikan placeholder "foobar" (nama dapat diubah). Ini sepenuhnya mengklasifikasikan semua paket yang masuk. Sebagian besar pengguna cukup membuang semua plugin mereka ke dalam satu kategori dan, secara umum, ini normal. Pilih nama yang Anda suka; Saya akan terus menggunakan foobar. Secara teori, Anda juga dapat membuat beberapa kategori, misalnya
~/.vim/pack/navigation
dan
~/.vim/pack/linting
. Harap dicatat bahwa Vim tidak mengenali duplikasi antara kategori dan mengunduh duplikat dua kali jika ada.
Paket di "mulai" dimuat secara otomatis, sedangkan paket di "opt" tidak dimuat sampai mereka dari Vim menggunakan perintah
:packadd
. Opsi ini baik untuk paket yang jarang digunakan dan didukung oleh Vim di luar kotak, tanpa harus menjalankan skrip. Perhatikan bahwa
:packadd
tidak
:packadd
rekanan untuk membongkar paket.
Untuk meninjau contoh ini, kami akan menambahkan plugin pencarian fuzzy ctrlp untuk memilih. Unduh dan hapus zip versi terbarunya di:
curl -L https://github.com/kien/ctrlp.vim/archive/1.79.tar.gz \ | tar zx -C ~/.vim/pack/foobar/opt
Perintah ini akan membuat
~ / .vim / pack / foobar / opt / ctrlp.vim-1.79
siap-pakai. Kembali ke vim dan buat pointer tag bantuan (indeks helptags) untuk paket baru:
:helptags ~/.vim/pack/foobar/opt/ctrlp.vim-1.79/doc
Perintah ini akan membuat file yang disebut "tag" di folder dengan jenis paket, yang membuat tema tersedia untuk dilihat di sistem internal Vim. Cara alternatif: jalankan helptags ALL setelah mengunduh paket, dan perintah akan menangani semua file dan jalur eksekusi mereka.
Saat Anda ingin menggunakan paket, cukup unduh dan ingatlah bahwa dalam kasus ini pemutusan berfungsi menggunakan tab, jadi Anda tidak perlu memasukkan nama lengkap:
:packadd ctrlp.vim-1.79
Direktori dasar Packadd terletak pada runtimepath, yang memungkinkannya menggunakan skrip dari plugin dan mendeteksi. Setelah memuat ctrlp, Anda dapat menggunakan perintah CTRL-P untuk membuka pencarian file berdasarkan kecocokan sebagian.
Beberapa orang melacak direktori ~ / .vim mereka dan menggunakan git untuk mengontrol versi setiap paket. Untuk bagian saya, saya hanya membongkar paket dari arsip tar dan melacaknya secara manual melalui repositori. Jika Anda menggunakan paket yang cukup matang yang tidak memerlukan pembaruan sering, serta skrip, maka mereka cukup kecil dan tidak mengacaukan sejarah git.
Cadangkan dan kembalikan versi
Bergantung pada preferensi pengguna Anda, Vim dapat melindungi Anda dari empat kemungkinan penyebab kehilangan data:
- Kecelakaan saat mengedit (di antara menyimpan). Vim dapat melindungi dari hal ini dengan secara berkala menyimpan perubahan pada file halaman.
- Perlindungan terhadap pengeditan file yang sama dengan dua instance Vim, perlindungan terhadap perubahan overwriting yang dilakukan melalui satu atau lebih instance. Ini juga dilakukan melalui file swap.
- Kegagalan selama proses penyimpanan itu sendiri setelah mengubah file terakhir, tetapi sampai konten baru sepenuhnya ditulis. Vim dapat melindungi Anda dari ini dengan fungsi writebackup. Untuk melakukan ini, ia membuat dalam proses menyimpan file baru, yang kemudian menggantikan yang asli, jika semuanya berjalan lancar. Metode penggantian ditentukan oleh pengaturan cadangan.
- Menyimpan konten baru dari file asalkan asli dikembalikan. Vim memungkinkan Anda menyimpan salinan cadangan file setelah membuat perubahan.
Tetapi sebelum Anda mulai menjelajahi pengaturan cerdas ini, bagaimana dengan beberapa lelucon? Berikut adalah beberapa contoh komentar dari file vimrc di GitHub:
“Jangan membuat file halaman. Kelola semuanya melalui kontrol versi. "
“Cadangan untuk orang buangan. Gunakan kontrol versi. "
"Hanya kontrol versi!" Hanya hardcore! "
"Kita hidup di dunia kontrol versi, jadi swap dan cadangan ada di tempat sampah."
"Mengapa Anda perlu file cadangan jika kontrol versi sudah cukup."
"Aku belum pernah menggunakan file cadangan Vim ... Gunakan kontrol versi."
"Kebanyakan hal dapat ditemukan melalui kontrol versi."
"Nonaktifkan cadangan file, karena Anda masih menggunakan sistem kontrol versi;)"
"Dan kontrol versi datang, dan Git menyelamatkan kita."
“Nonaktifkan file swap dan sistem cadangan. Selalu gunakan kontrol versi! SELALU! ”
"Saya tidak perlu cadangan, karena saya bekerja dengan kontrol versi."
Ironisnya adalah bahwa komentar di atas hanya mencerminkan pemahaman tentang jenis kegagalan keempat dan sebagian. Jika Anda menolak file swap dan cadangan, Anda akan kehilangan perlindungan dalam kasus yang dijelaskan dalam paragraf 1 dan 2.
Berikut adalah contoh konfigurasi yang saya rekomendasikan untuk operasi yang aman:
" Protect changes between writes. Default values of " updatecount (200 keystrokes) and updatetime " (4 seconds) are fine set swapfile set directory^=~/.vim/swap// " protect against crash-during-write set writebackup " but do not persist backup after successful write set nobackup " use rename-and-write-new method whenever safe set backupcopy=auto " patch required to honor double slash at end if has("patch-8.1.0251") " consolidate the writebackups -- not a big " deal either way, since they usually get deleted set backupdir^=~/.vim/backup// end " persist the undo tree for each file set undofile set undodir^=~/.vim/undo//
Pengaturan ini termasuk cadangan untuk rekaman yang tidak lengkap, tetapi jangan menyimpan file setelah operasi selesai dengan sukses, karena kami memiliki kontrol versi, kontrol versi terbaik, bla bla bla, dll. dll. Harap dicatat bahwa Anda mungkin perlu mkdir ~ / .vim / {swap, undodir, backup}, jika tidak Vim akan mengakses folder yang dapat dibaca berikutnya. Anda juga mungkin perlu menjalankan perintah chmod pada folder target agar isinya bersifat pribadi, karena file swap dan riwayat cadangan mungkin berisi informasi sensitif.
Perlu dicatat bahwa fitur dari jalur konfigurasi kami adalah bahwa mereka selalu ditutup dengan garis miring. Ejaan ini memungkinkan fungsi untuk menghilangkan kemungkinan ambiguitas di jalur paging dan file cadangan untuk file dengan nama yang sama, yang ada di direktori yang berbeda. Sebagai contoh, file swap untuk / foo / bar akan disimpan di ~ / .vim / swap /% foo% bar.swp (saya lolos dari garis miring dengan tanda persen). Ada bug di patch Vim baru-baru ini yang mencegah slash dari diperhitungkan untuk backupdir, jadi perlindungan terhadapnya ditampilkan di atas.
Vim kami juga menyimpan riwayat rollback untuk setiap file, sehingga Anda dapat mengembalikan versi yang benar bahkan setelah keluar dari mode edit. Meskipun fungsi seperti itu mungkin tampak berlebihan dengan latar belakang file swap yang sudah kita miliki, sejarah rollback adalah garis pertahanan tambahan selama perekaman file.
Ketika kita berbicara tentang rollback, perlu diingat bahwa Vim mendukung pohon lengkap sejarah pengeditan file. Ini berarti bahwa Anda dapat membuat perubahan, memutar kembali, dan kemudian mengulangi perubahan yang sama lagi, dan semua ini akan menjadi tiga titik pemulihan yang berbeda. Waktu dan luasnya perubahan yang dibuat dapat diperiksa menggunakan perintah undolist, tetapi bermasalah untuk mengeluarkan pohon itu. : 5 , . , — , undotree — .
. . : . , .
: , ,vim . nowritebackup, , . , Vim , . backupskip .
«patchmode» Vim . , . , tar-, , git. set patchmod = .orig foo- foo.orig.
Include path
(include) . Vim path, include, suffixesadd, includeexpr. (. help include-search) — ctags .
. , . ,
help include
.
,
[i
, ,
[d
.
gf
Vim . :find,
**/*
, . , .. , .
, . ( ) CTRL-D. .
" fuzzy-find lite nmap <Leader><space> :e ./**/
: path (headers) . , : checkpath, , . C checkpath. , , . , checkpath , .
«., / Usr / include ,,»
. , — /usr/include, . ,
:help file-searching
.
ftplugin ( ) , . : ./src/include ./include.
setlocal path=.,,*/include/**3,./*/include/**3 setlocal path+=/usr/include
«**3»
— . , . , .
, , :checkpath , . , , .
:
:he [, :he gf, :he :find
.
.