vim, beralih antar file dengan cepat menggunakan vanilla Vim (tanpa plugin)

103

Saya memahami bahwa membatasi diri saya pada vanilla Vim (tidak menggunakan plugin) membatasi kekuatan editor, tetapi karena saya sering beralih di antara mesin yang berbeda, seringkali terlalu banyak kesulitan untuk memindahkan lingkungan saya ke mana-mana. Saya ingin tetap di vanilla Vim.

Sesuatu yang menahan saya adalah kemampuan untuk beralih antar file dengan cepat. Saya (percaya setidaknya) memiliki pemahaman yang baik dari buffer , jendela , tab , serta netrw ( Vex, Ex, dll).

Tetapi di editor seperti Sublime Text , saya cukup mengetik ctrl- pdan langsung membuka file.

Saya tahu bahwa saya bisa drop down ke shell, tapi saya bertanya-tanya apakah ada rahasia "tersembunyi" lain untuk beralih cepat antar file di Vim berdasarkan lebih dari sekedar nama file.

Jonathan.Brink
sumber
2
Ini tidak menjawab pertanyaan Anda, tetapi mungkin membujuk Anda untuk mempertimbangkan menggunakan plugin: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood
Saya pribadi menyinkronkan pengaturan saya dengan Dropbox. Ini kikuk tetapi kurang lebih berfungsi tanpa harus memikirkannya. Satu plugin yang saya gunakan dan tahu berfungsi dengan baik untuk apa yang Anda inginkan adalah Command-T ( github.com/wincent/Command-T ). Ctrl-P bisa menjadi alternatif ( vim.org/scripts/script.php?script_id=3736 ).
FX
1
Pernahkah Anda melihat danielmiessler.com/study/vim ? Dia memiliki praktik yang sangat cerdas dalam menempatkan vimrc + semua plugin yang dia butuhkan ke Github ... ke mana pun dia pergi, dia dapat mengkloningnya dan voila, Vim persis seperti yang dia suka. Brilian
bobox
6
@bobox, puluhan ribu orang melakukan itu; tidak ada yang luar biasa tentang itu.
romainl

Jawaban:

236

Persamaan yang paling dekat ("paling dekat", bukan "tepat") dengan Ctrl+ ST2 Padalah sebuah plugin bernama, bersiaplah… CtrlP . Ada plugin serupa lainnya seperti Command-T atau FuzzyFinder .

Saya menggunakan CtrlP dan saya menyukainya tapi saya dengan sepenuh hati mendukung keputusan Anda untuk menggunakan "plugin-free". Ini bukan cara termudah untuk melakukannya tetapi akan terbayar dalam jangka panjang.


Membuka file

Cara paling dasar untuk membuka file adalah :e /path/to/filename. Untungnya, Anda mendapatkan penyelesaian tab dan karakter pengganti: klasik *dan khusus **, yang merupakan singkatan dari "sembarang subdirektori".

Menggabungkan semua itu, Anda dapat melakukan:

:e **/*foo<Tab>

untuk memilih dari semua file yang berisi foonamanya di bawah direktori kerja atau:

:e **/*foo/*bar<Tab>

untuk memilih dari semua file yang berisi barnamanya di bawah subdirektori mana pun yang mengandung foonamanya, di mana saja di bawah direktori kerja.

Tentu saja, itu berhasil untuk :tabe[dit], :sp[lit]dan :vs[plit], juga.

Perintah-perintah itu terbatas pada satu file. Gunakan :nextuntuk membuka banyak file:

:next **/*.js

dan lihatlah :help arglist.


Melompat di antara buffer

:b[uffer] adalah perintah buffer-switching dasar:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Perhatikan bahwa banyak dari perintah ini dan kerabatnya menerima hitungan.

The :lsperintah menunjukkan Anda daftar buffer dimuat. Ini sedikit "istimewa", meskipun: buffer diberi nomor saat dibuat sehingga Anda dapat memiliki daftar yang terlihat seperti 1 2 5jika Anda menghapus buffer. Ini agak canggung, ya, dan itu membuat peralihan ke buffer berdasarkan nomornya agak terlalu merepotkan. Lebih suka beralih dengan nama parsial, :b foo<Tab>atau bersepeda :bn :bp,.

Bagaimanapun, berikut adalah pemetaan keren yang mencantumkan semua buffer yang dimuat dan mengisi prompt untuk Anda, menunggu Anda untuk mengetik nomor buffer dan tekan <enter>:

nnoremap gb :ls<CR>:b<Space>

Dengan pemetaan ini, beralih ke buffer lain semudah:

gb
(quickly scanning the list)
3<CR>

atau:

gb
(quickly scanning the list)
foo<tab><CR>

Ide tersebut berasal dari gambar yang diambil dari koleksi infografis Vim Bairui :

Terbang vs bersepeda

Vim juga memiliki <C-^>(atau <C-6>pada beberapa keyboard) —mode normal yang setara dengan :b#—untuk melompat antara buffer saat ini dan yang sebelumnya. Gunakan jika Anda sering bergantian di antara dua buffer.

Baca semua tentang buffer di :help buffers.


Pergi ke deklarasi

Di dalam file, Anda dapat menggunakan gdatau gD.

Dalam sebuah proyek, fitur "tag" Vim adalah teman Anda, tetapi Anda memerlukan pengindeks kode eksternal seperti ctags atau cscope. Perintah paling dasar adalah :tag foodan <C-]>dengan kursor di nama metode. Kedua alat terintegrasi dengan baik ke dalam Vim: lihat :help tags, :help ctagsdan :help cscope.

Untuk apa nilainya, saya menggunakan navigasi tag secara ekstensif untuk berpindah dalam sebuah proyek (menggunakan CtrlP :CtrlPTagdan :CtrlPBufTagperintah, sebagian besar, tetapi buit-in juga) dan metode buffer switching "umum" favorit saya adalah dengan nama.


Menerapkan konfigurasi Anda

Banyak pengguna Vim meletakkan konfigurasi mereka di bawah kontrol versi yang membuatnya sangat cepat dan mudah untuk menginstal konfigurasi Anda sendiri di mesin baru. Pikirkan tentang itu.


EDIT

Beberapa bulan lalu, saya harus mengerjakan mesin jarak jauh dengan Vim yang sudah ketinggalan zaman. Saya bisa saja memasang Vim yang tepat dan mengkloning konfigurasi kesayangan saya, tetapi saya memutuskan untuk melakukan perjalanan ringan, kali ini, untuk "mempertajam gergaji". Saya segera membangun minimalis .vimrcdan mengunjungi kembali beberapa fitur asli yang setengah terlupakan. Setelah pertunjukan itu, saya memutuskan CtrlP tidak terlalu penting dan menyingkirkannya: fitur asli dan pemetaan khusus tidak seseksi itu tetapi mereka menyelesaikan pekerjaan tanpa banyak ketergantungan.


Menyulap dengan file

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findadalah perintah yang benar-benar hebat jika Anda melakukannya set pathdengan benar. Dengan pengaturan saya, ,ffoo<Tab>akan menemukan semua file yang berisi di foobawah direktori saat ini, secara rekursif. Cepat, intuitif, dan ringan. Tentu saja, saya mendapat manfaat dari penyelesaian dan karakter pengganti yang sama seperti dengan :editdan teman.

Untuk mempercepat prosesnya, pemetaan berikut memungkinkan saya melewati seluruh bagian proyek dan menemukan file secara rekursif di bawah direktori file saat ini:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

PERINGATAN! The pathpilihan adalah sangat kuat. Nilai di atas— .,**—berfungsi untuk saya tetapi bahasa yang saya gunakan tidak memiliki perpustakaan standar. Nilai yang tepat bergantung sepenuhnya pada kebutuhan Anda .


Juggling dengan buffer

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Pemetaan di atas mencantumkan buffer yang tersedia di "wildmenu" dengan prompt kosong, yang memungkinkan saya menavigasi menu dengan <Tab>atau mengetik beberapa huruf dan <Tab>sekali lagi mempersempit daftar. Seperti halnya pemetaan file di atas, prosesnya cepat dan hampir tanpa gesekan.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Pemetaan itu berbicara sendiri.


Menyulap dengan tag

nnoremap <leader>j :tjump /

Pemetaan ini menggunakan pencarian regex dan bukan pencarian seluruh kata sehingga saya dapat melakukannya ,jba<Tab>untuk menemukan tag foobarbaz().

Ya, pencocokan fuzzy memang membuat ketagihan, tetapi Anda bisa sama produktif tanpanya. Dan untuk sebagian kecil dari biaya.


LEBIH BANYAK EDIT

Beberapa tip / trik tambahan…


Opsi Wildmenu

The "wildmenu", diaktifkan dengan set wildmenu, membuat navigasi file / buffer lebih mudah. Perilakunya diatur oleh sejumlah opsi yang patut diselidiki:

wildmode memberi tahu Vim bagaimana Anda ingin "wildmenu" berperilaku:

set wildmode=list:full

wildignore menyaring semua cruft:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecasememungkinkan Anda untuk mencari foodan menemukan Foo:

set wildignorecase

Tanda file

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

Saya baru-baru ini menemukan permata ini pada orang lain ~/.vimrc. Ini membuat tanda file pada posisi kursor yang tepat setiap kali Anda meninggalkan buffer sehingga, di mana pun Anda berada, 'Jmelompat ke buffer JavaScript terbaru yang Anda edit. Hebat.

romainl
sumber
2
+1. Aku tidak tahu tentang "subdirektori setiap" dalam kombinasi dengan :etapi saya akan menggunakannya banyak dari sekarang. Saya mengagumi pekerjaan yang menggunakan Ctrl-P dan dapat belajar banyak darinya tetapi tidak berhasil untuk saya. Saya merasa agak lamban dan dengan demikian mengganggu
alur
2
**memang bagus.
romainl
1
Saya ingin memberi suara positif lagi untuk gbpeta. Satu lagi akan saya gunakan banyak. Semua plugin buffer yang saya coba (CtrlP, bufExplorer, ...) hampir tidak secepat ini (memang, plugin ini menawarkan lebih banyak fungsionalitas tetapi tidak cukup bagi saya untuk tetap menggunakannya) .
Lieven Keersmaekers
2
@LievenKeersmaekers, ini adalah di mana saya mendapatkannya dari dan ini adalah di mana gambar konyol berasal dari. Terima kasih Bairui!
romainl
4
Ini mungkin satu-satunya jawaban terbesar yang pernah ada.
craigp
5

Jawabannya sangat bergantung pada preferensi dan keadaan Anda. Beberapa contoh:

  • Jika sebagian besar terdiri dari dua file (misalnya header C dan file implementasi), <C-^>sangat berguna. Secara umum, file alternatif merupakan konsep penting.
  • Jika Anda menggunakan jendela editor besar, window :splits mengubah masalah penempatan buffer dari lokasi jendela (setelah Anda membuka semua buffer). Anda dapat menggunakan [N]<C-w><C-w>untuk beralih ke sana dengan cepat.
  • Jika Anda dapat menghafal (beberapa) nomor buffer, perintah :[N]b[uffer]dan :[N]sb[uffer]cukup berguna; :lsmemberi tahu Anda jumlahnya.

Plugin (atau setidaknya pemetaan khusus) dapat meningkatkan banyak hal, dan ada banyak variasi tentang topik ini di vim.org . Ada berbagai mekanisme untuk mendistribusikan konfigurasi Anda (Pathogen + GitHub, Dropbox, ...), atau Anda dapat mengedit file server dari jarak jauh melalui plugin netrw yang disertakan dengan Vim.

Ingo Karkat
sumber
4
Mungkin layak disebut ctags, cscope, gtags, id, dan teman. Saya merasa menggunakan tanda huruf besar sangat membantu. Gunakan mAuntuk menyimpan tanda Adan `` A``` untuk mengembalikan. Saya menemukan jaringan jauh lebih berguna setelah saya belajar tentang :Rexmana yang kembali ke penjelajah. :b, :e, Dan banyak lainnya dapat mengambil wildcard seperti *dan **. The :bperintah dapat mengambil nama file parsial. Gabungkan itu dengan <c-d>atau menu liar Anda bisa cukup jauh. Sedangkan untuk plugin Anda dapat menggunakan sesuatu yang spesifik domain seperti rail.vim yang menyediakan perintah navigasi khusus rel atau sesuatu yang lebih umum seperti CtrlP.
Peter Rincker
@PeterRincker: +1 untuk menyebutkan tentang tanda. Saya menyarankan untuk membuat jawaban dengan tanda.
Helbreder
Apa arti <C - ^> dan [N] <Cw> <Cw>?
Josh Desmond
5

Kadang-kadang juga berguna untuk menelusuri daftar file secara berurutan (misalnya, jika Anda melakukan sesuatu seperti vim *.phpmembuka beberapa file sekaligus). Kemudian Anda dapat menggunakan :n[ext](serta :prev[ious], :fir[st], dan :la[st]) untuk navigasi (selain apa yang disarankan dalam jawaban yang lain).

chris
sumber
4

Anda dapat melakukan penyelesaian tab karakter pengganti pada baris perintah tanpa plugin apa pun. misalnya

:e src/**/foo*<tab>

akan membiarkan Anda menggilir semua file yang dimulai dengan 'foo' pada pohon direktori di bawah ./src dan pilih yang ingin Anda edit.

Jika Anda sudah mengedit file dan masih dalam buffer, Anda dapat beralih ke file tersebut dengan:

:b foo<tab>

yang akan menggilir semua buffer dengan 'foo' di jalurnya. Anda mungkin perlu menyetel opsi wildmode dan wildmenu untuk mendapatkan perilaku yang Anda inginkan. saya sudah

wildmode=longest:full
wildmenu

di .vimrc saya.

Dave Kirby
sumber
2

Jika Anda menggunakan nama file dan ingin melompat ke file itu, gfakan melakukannya untuk Anda. Saya juga suka menggunakan ctags , yang bukan merupakan plugin; Anda baru saja membuat tag dan dapat dengan mudah beralih ke basis kode Anda.

gpojd.dll
sumber
1

Jika Anda ingin beralih antar file di editor vim, silakan lihat jawaban di bawah ini

Pertama tekan Esctombol untuk keluar dari mode edit.

Kemudian ketik :euntuk memeriksa jalur file saat ini.

jika Anda ingin membuka file lain kemudian ketik :e /path-of-file.txt/menggunakan ini Anda dapat beralih.

Jika Anda ingin pergi ke file sebelumnya cukup ketik :e#yang beralih ke jalur file sebelumnya.

Amol Udage
sumber
0

Saya memiliki masalah yang sama dengan Vim.

Hal terakhir yang saya inginkan adalah bergantung pada plugin untuk tugas biasa seperti pengalihan file.

Saya menambahkan baris berikut ke .vimrc

set path+=**
set wildmenu

Dan BAM! Saya sekarang bisa :find any/filename/in/any/folder/selama vim ada di direktori root proyek. Penyelesaian tab bekerja. Wildcard bekerja!

Setelah file dibuka, dan ada banyak buffer di latar belakang (Anda dapat menggunakan :lsuntuk melihat semua buffer), menjalankan :b any/file <TAB>pencarian fuzzy untuk semua buffer dan melompat ke file yang diperlukan. Dalam kasus ini tidak unik akan ada menu tab (karena itu baris ke-2 dalam .vimrc) yang dapat dipilih menggunakan tab.

Jawaban saya datang dari video yang luar biasa ini
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Ada lebih banyak trik dan saya sarankan untuk menontonnya.

Ya
sumber