Navigasi file Vim

90

Saya berusaha sangat keras untuk mempelajari vim setelah menggunakan TextMate selama beberapa tahun terakhir.

Saya sudah mulai melakukan beberapa navigasi dalam file ke memori tetapi saya kesulitan menavigasi di antara banyak file.

Dalam alur kerja saya, sangat umum bahwa saya membalik di antara beberapa file secara teratur (cukup file sehingga jendela panel terpisah menjadi terlalu kecil).

Saya saat ini menggunakan NERDTree tetapi menemukan menelusuri ke dalam direktori tidak praktis serta terus menggunakan CTRL+ W h/ CTRL+ W luntuk melompat-lompat.

Saya pikir saya akan melakukan lebih baik dengan tab yang saya dapat dengan mudah beralih di antara tetapi mungkin saya perlu menggunakan alur kerja yang berbeda.

Saya juga ingin pintasan "Buka File ..." seperti CMD+ Tdi TextMate. Saya telah menemukan fuzzy_file_findertetapi membutuhkan vim untuk dibangun dengan pengikatan Ruby yang bukan merupakan kasus penginstalan asli yang saya kerjakan.

Meskipun saya dapat membangun kembali alasan utama saya ingin beralih ke vim adalah agar saya dapat memiliki satu lingkungan editor yang saya tahu akan dengan mudah bekerja di semua platform.

Pilihan di luar sana sangat banyak, ide apa pun sangat dihargai!

Pete
sumber
1
Saya belum menemukan cara yang sangat memuaskan untuk menavigasi file dan buffer, yang tidak menggunakan bantuan eksternal sama sekali. Barang bawaan cukup buruk (maksud saya, mengubah ke buffer berdasarkan nomornya? Siapa yang berkeliling mengingat nomor buffer sementara ...)
Svend
1
@svend: Anda dapat merujuk ke buffer dengan nama serta nomor - lihat jawaban saya di bawah
Dave Kirby

Jawaban:

92

Saya tidak menemukan pengeboran ke subdirektori melalui lama biasa :emenjadi tidak praktis mengingat konfigurasi yang layak untuk penyelesaian tab.

Lihat ke 'wildmenu'opsi agar Vim menampilkan daftar penyelesaian (nama file) di modeline di atas baris perintah. Anda dapat mengubah 'wildmode'opsi untuk mengonfigurasi lebih lanjut jenis penyelesaian tab yang akan dilakukan Vim.

Secara pribadi saya gunakan :set wildmode=full.

Alur kerja saya seperti ini:

  1. :cd ke direktori tingkat atas proyek saya.
  2. Untuk membuka file foo/bar/baz:

    • Skenario paling sederhana: ketik :e f<tab>b<tab>b<tab><enter>.

    • Jika ada lebih dari satu file dimulai dengan bdi salah satu direktori Anda mungkin harus melakukan <left>atau <right>atau yang lain <tab>pada keyboard untuk melompat antara mereka (atau ketik beberapa huruf lagi untuk disambiguate).

    • Skenario terburuk ada file dan direktori yang berbagi nama dan Anda perlu menelusuri ke direktori. Dalam hal ini tab-lengkapi nama direktori dan kemudian ketik *<tab>untuk menelusuri .

  3. Buka 2 atau 3 jendela dan buka file di semuanya sesuai kebutuhan.
  4. Setelah file terbuka di buffer, jangan matikan buffer. Biarkan terbuka di latar belakang saat Anda membuka file baru. Hanya :efile baru di jendela yang sama.
  5. Kemudian, gunakan :b <tab>untuk menelusuri buffer yang sudah terbuka di latar belakang. Jika Anda mengetiknya, :b foo<tab>itu hanya akan cocok dengan file yang sedang terbuka yang cocok foo.

Saya juga menggunakan pemetaan ini untuk mempermudah membuka jendela baru dan beralih di antaranya karena itu adalah sesuatu yang sering saya lakukan.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Saya membutuhkan beberapa detik untuk membuka Vim, mengatur beberapa jendela dan membuka beberapa file di dalamnya. Secara pribadi saya tidak pernah menemukan skrip penjelajahan file pihak ketiga mana pun yang sangat berguna.

Brian Carper
sumber
4
Ujung topi untuk penjelasan yang luar biasa. Wag of the finger for the skillz ++ you have to have to have to have to understand eksplenation.
Tn. Baudin
257

Cara mudah untuk menelusuri sistem file adalah dengan perintah:

:Sex

Saya tidak mengada-ada :)


sumber
15
dan dari bantuan saya melihat bahwa: Vex juga bagus.
jrwren
16
Dan ini memiliki 69 suara positif. Saya tidak berpikir saya tega mengubahnya.
AlbeyAmakiir
3
Dan :Vexjika Anda ingin membagi layar secara vertikal, bukan horizontal
sreenivas
1
Wow, tidak pernah tahu semua ini. Saya menemukan :Vexlebih praktis, tetapi :Sexhanya membuat hari saya menyenangkan.
William Robertson
2
sebagai catatan, :Seberfungsi juga (sama untuk Ve, Tevarian). Tidak perlu membuatnya aneh :)
towc
46

:Sex, :Vex, :TexDan :Exsemua perintah yang berguna untuk mantan (ploring) berkas dalam sistem Anda jika Anda ingin menggunakan sesuatu yang berbeda dari:e

(di mana S/V/Tkependekan dari Split / Vertical / Tab)

Emil Rehhnberg
sumber
7

Jika Anda belum menemukannya, Anda mungkin ingin melihat:

  • plugin pencari fuzzy asli - yang IIRC tidak memiliki masalah pengikatan Ruby
  • plugin Project - mirip dengan NERDTree
  • plugin buffer explorer - menampilkan daftar buffer yang terbuka

Ingat juga bahwa Anda dapat memetakan ulang pintasan utama di .vimrc Anda agar tidak terlalu rumit. Saya sering menggunakan jendela terpisah; Saya telah menemukan hal berikut membuat menangani mereka jauh lebih mudah:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h
dlimeb.dll
sumber
5

Saya pikir saya akan melakukan lebih baik dengan tab yang saya dapat dengan mudah beralih di antara, tapi mungkin saya perlu menggunakan alur kerja yang berbeda.

Apakah Anda mengetahui tab Vim? Tidak yakin apakah Anda merujuk ke tab Vim sendiri di sana, atau memasang pin untuk TextMate. Tidak jelas versi Vim apa yang Anda gunakan tetapi memiliki tab setidaknya sejak 7.0 (yang tampaknya dipasang di mana pun saya melihat belakangan ini), dan mereka luar biasa.

:tabemembuka yang baru (kependekan dari "tab edit", jadi misal :tabeuntuk kosong atau :tabe path/to/fileuntuk membuka file di tab baru,) Anda dapat berpindah di antara tab yang berdekatan dengan gt/ gT, dan ada banyak perintah navigasi terkait tab lainnya juga, seperti yang mungkin Anda harapkan dari Vim ( :help tabs)

Alur kerja saya untuk proyek besar cenderung melibatkan banyak tab, masing-masing dengan antara 1 dan 3 jendela tergantung pada jenis konteks yang saya butuhkan. Ini bekerja lebih baik jika saya memiliki jendela terminal dua kali lipat karena saya dapat membagi secara vertikal :vs, jadi satu tab dapat dengan mudah menampilkan saya 4 file sekaligus dengan banyak ruang untuk masing-masing.

Tip terakhir: Saya kadang-kadang menggunakan perintah "switch buffer" ( :sb <partial_buf_name>) yang agak mirip dengan temuan fuzzy TM, karena ia bekerja cukup baik tetapi hanya untuk buffer yang sudah terbuka. Masih bagus untuk saat saya membuka selusin atau lebih file sekaligus. (NB saya perlu :set switchbuf=usetabdi vimrc saya agar ini berfungsi di seluruh tab, tetapi setelah itu disetel, itu bagus.)

bitprophet
sumber
1
Pemahaman saya tentang tab adalah bahwa ini lebih merupakan pemelihara tata letak, bukan metode yang memiliki satu buffer terbuka di setiap tab (lihat Bram Molenaars memiliki pandangan sendiri tentang tab dalam video "7 kebiasaan pengeditan teks yang efektif".
Svend
Kemudian setelah Anda menemukan perintah seperti ini yang cocok untuk Anda, Anda dapat mengikatnya ke sebuah kunci. Saya memiliki kontrol-tab membalik antara buffer terbuka (a la firefox), tetapi Anda dapat beralih tab sebagai gantinya.
Jonathan Hartley
vim-titlecasesekrup dengan gt / pemetaan gT, tapi ada kerja-sekitar .
n nothing101
5

Saya menemukan LustyExplorer yang terbaik sejauh ini.

Anda dapat membuka file hanya dengan mengetik sebagian dari namanya.

Anda dapat membuka file dari direktori file saat ini, atau saat ini pwd, atau dari daftar buffer.

Jika Anda membuka file dari daftar buffer, Anda tidak perlu menelusuri pohon direktori, meskipun sayangnya untuk dua mode lainnya, Anda masih harus menavigasi melalui pohon. Hal baiknya adalah Anda tidak harus memulai dari karakter pertama.

Jika Anda memiliki:

dir_a/
    ...
dir_b/
    file.js
    file.html

dan Anda ingin membukanya dir_b/file.htmlbiasanya Anda dapat menemukannya dengan mengetikb<Tab>h

hasen
sumber
Saya membuat beberapa ekstensi untuk addon yang luar biasa ini. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Pada dasarnya memungkinkan saya untuk memasukkan nama file yang baru saja digunakan, apakah itu sudah dimuat atau tidak tidak masalah. Ini berarti Anda hanya perlu menelusuri FS saat Anda membuka file untuk pertama kali.
Kirim
4

Mengejutkan melihat bahwa :findperintah tersebut tidak disebutkan dalam jawaban mana pun. Saya biasanya bekerja dengan proyek rel di mana saya perlu menelusuri jauh ke dalam hierarki direktori. Jadi untuk file application.css, letaknya di app/assets/stylesheets/semua saya harus ketik is :find applicalalu tekan tab untuk autocomplete dan enter untuk membuka.

Imran Ali
sumber
3

Lihat plugin ctrlp sebagai alternatif dari plugin Command-T . Ini lebih baik daripada ini karena ini adalah skrip Vim 'asli' dan tidak memerlukan Vim untuk dikompilasi dengan ruby ​​(atau dukungan lain) sementara itu berjalan sangat cepat dan tidak mengganggu.

nikola
sumber
2

Jika file yang Anda inginkan sudah dimuat ke buffer (yang kemungkinan besar jika Anda beralih di antara beberapa file secara teratur) maka Anda dapat dengan cepat beralih ke buffer dengan :b[uffer]perintah.

:bdapat mengambil nomor buffer sebagai parameter, atau (lebih berguna) string yang cocok dengan bagian dari jalur / nama file. Jika ada beberapa pertandingan, Anda dapat menggunakan tab untuk menggilirnya.

Jika Anda ingin membagi jendela dan membuka buffer di jendela baru, gunakan :sb name

Jika Anda ingin membuka buffer di tab baru, gunakan :tab b name

Anda juga dapat menggunakan :lsperintah untuk melihat daftar buffer yang saat ini dimuat.

Dave Kirby
sumber
1

Saya menggunakan fungsi ini untuk menemukan file di subdirektori, saya tidak menulisnya. Ini dari vim wiki :

fungsi! Temukan (nama)
    biarkan l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    biarkan l: num = strlen (substitusi (l: list, "[^ \ n]", "", "g")) 
    jika l: num 0 
            echo "Bukan angka" 
            kembali 
        berakhir jika 
        jika l: inputl: num 
            echo "Di luar jangkauan" 
            kembali 
        berakhir jika 
        biarkan l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    lain 
      biarkan l: baris = l: daftar 
    berakhir jika 
    misalkan l: line = substitusi (l: line, "^ [^ \ t] * \ t. /", "", "") 
    jalankan ": e" .l: line 
fungsi akhir 

perintah! -nargs = 1 Temukan: call Temukan ("")

Satu hal yang saya suka adalah ada dukungan untuk wildcard (*). Itu juga berperilaku baik untuk beberapa pertandingan.

uniquesnowflake8
sumber
1

Selain wildmenujawaban, saya menggunakan plugin BufExplorer , dan pemetaan berikut untuk melompati buffer dengan cepat:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

Atau Anda bisa mengganti buffer explorer dengan :lsperintah, yang pada dasarnya menampilkan hal yang sama.

Yang terakhir memetakan Alt-=untuk menampilkan penjelajah buffer.

Saya tidak menggunakan Windows sebanyak itu, karena saya biasanya hanya memiliki satu atau dua jendela.

Saya juga memodifikasi statuslineuntuk memasukkan nomor buffer %2n, sehingga saya selalu tahu buffer mana yang sedang diedit. Lihat:h statusline

Ayman
sumber
0

Inilah sesuatu yang cukup sepele yang saya pertahankan .vimrc. Ini akan memuat file dari subdirektori manapun.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Jadi saya bisa bilang:

: Er Main.java

dan itu akan mencari subdirektori, menemukan Main.javadan memuatnya. Ini tidak berperilaku baik untuk banyak file dengan nama yang sama, tetapi cepat dan sederhana.

Alat lain yang saya gunakan adalah VTreeExplorer , yang menyediakan jendela file / direktori berbasis pohon, dan tidak memerlukan opsi build khusus dari VIM (yaitu plugin vanilla).

Brian Agnew
sumber
Saya ingin memuat dari sub-direktori, tetapi masalah banyak file akan menjadi pemecah masalah bagi saya. Aku seorang pengembang Django, jadi saya biasanya memiliki banyak sub-direktori yang semua memiliki models.py, views.py, dll
Pete
0

Alur kerja saya untuk menemukan file adalah wildmenu, autocwd dan :e.

Bagian yang relevan di .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

Dan bagaimana cara menggunakannya:

:e myf^D

Itu memberikan semua file di direktori saat ini yang dimulai dengan myf. Anda juga bisa <Tab>melalui mereka. Gunakan kembali untuk membuka :)

^Dakan selalu memberi Anda semua pertandingan. Karena autocmd selalu masuk ke folder file saat ini, maka mudah untuk dikerjakan. Jika Anda berada di dalam foo/bar.pydan ingin pergi, foo/baz.pylakukan saja :e baz.pydan Anda di sana. Itu juga berfungsi dengan buffer ( :b foo^Dmencantumkan semua buffer yang dimulai dengan foo)

Armin Ronacher
sumber
Bagaimana kalau pergi ke direktori lain? Misalnya, saya akan sering bekerja antara tampilan Python, template HTML, dan file JavaScript saya yang semuanya tinggal di sub-direktori yang berbeda? Di TextMate, saya mulai mengetik nama file dan semua kecocokan dalam "proyek" saya (alias cwd) muncul.
Pete
Itu tidak muncul kembali ke subfolder, tidak. Tapi saya menyesuaikan alur kerja saya dengan itu. Juga setelah file saya buka, saya bisa menyebutkan nama buffer dan saya baik-baik saja. Anda dapat memberi tahu Vim untuk mengingat buffer yang terbuka, maka biasanya Anda tidak memerlukan fitur itu sama sekali.
Armin Ronacher