Bagaimana menavigasi dalam proyek besar di VIM

87

Bagaimana Anda mengelola proyek besar (ratusan file) hanya dengan menggunakan VIM?

Saya pribadi mulai mengalami masalah dalam proyek yang lebih besar dari yang kecil.

  • adakah cara untuk 'membuka file' dengan cepat, lebih disukai dengan melengkapi nama?
  • sama untuk 'go to class definition', jika ada di file lain

Saya agak tahu semua dasar-dasar VIM, jadi saya tidak punya masalah menggunakannya untuk menulis skrip atau mengedit cepat beberapa kode sumber. Tapi itu menjadi sangat berantakan bagi saya ketika saya harus menavigasi antar file.

Jakub Arnold
sumber
Bahasa apa yang Anda gunakan ?
LB40
Saya lebih suka solusi bahasa agnostik, tetapi saya membutuhkan dukungan untuk C ++, PHP dan Rails.
Jakub Arnold
Jawaban mana yang Anda terima? @JakubArnold
@xetrasu Saya akhirnya menggunakanNERDTree
Jakub Arnold

Jawaban:

33

VIM memiliki dukungan yang sangat baik untuk tag . Setelah Anda membuat file tag untuk proyek Anda, Anda dapat melompat ke definisi atau deklarasi metode, kelas, dll., Termasuk melompati file, semuanya di dalam sesi pengeditan yang sama.

Mencoba

:help tags

Untuk membuat file tag untuk C / C ++, buka prompt shell Anda (saya berasumsi sistem Anda adalah * nix / Cygwin) dan ketik

info ctags

atau

ctags --help
sistem JEDA
sumber
2
Vim juga memiliki dukungan untuk cscope, yang memungkinkan Anda melakukan hal-hal seperti menemukan fungsi apa yang memanggil fungsi yang diberikan - lihat :help cscopeinformasi. Ada daftar fitur bagus dalam pendahuluan (di bawah "Ini dirancang untuk menjawab pertanyaan seperti").
Cascabel
1
Sayangnya, cscope memiliki pemahaman yang sangat terbatas tentang C ++.
Luc Hermitte
28

Saya suka solusi sederhana, cara favorit saya untuk menavigasi saat ini adalah:

Tambahkan ~/.vimrc.local

set path=$PWD/**

Kemudian ketik ini di editor untuk menemukan file di mana saja di direktori kerja saat ini (pwd)

:find user_spec.rb

Anda dapat menggunakan pelengkapan tab pada nama file untuk menemukan banyak pilihan juga, membuat konversi TextMate ini sangat menyenangkan.

alpukat
sumber
1
Solusi ini jauh lebih sederhana daripada: FC dan plugin karena tidak perlu cache dan ... Anda membuat hari saya menyenangkan! Terima kasih!
Srikumar
1
Vim tidak membaca wd sebagai direktori default. Saya telah memulai ulang shell dan masih tidak berfungsi. Juga diadili vim .sebelum menjalankan perintah: /
Adam Grant
13

Saya menggunakan kombinasi NERDTree (sidebar direktori), FuzzyFinder Textmate (go-to-file seperti CMD + T TextMate), dan Sessions (: sesi h) untuk membantu saya menangani proyek-proyek besar.

Saya akan menyarankan menggunakan beberapa plugin pembantu sesi. Saya akan menyebutkan apa yang saya gunakan, tetapi saya belum puas dengannya. Hanya Google "sesi vim".

Satu hal yang perlu diperhatikan agar FuzzyFinder Textmate berfungsi adalah bahwa itu bergantung pada versi lama plugin FuzzyFinder, khususnya v2.16. Apa pun yang lebih tinggi dan Anda akan mendapatkan kesalahan. Tapi itu pasti sepadan dengan masalahnya. Meskipun tidak memiliki penyelesaian nama, pencariannya cerdas jadi jika saya mencarinya fro/time/actionsphpakan menarik file apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(tanda kurung menunjukkan apa yang cocok). Itu membuatnya sangat mudah untuk memilih file yang hanya unik menurut nama foldernya.

donat
sumber
2
Saya telah menemukan plugin baru yang lebih saya sukai dan lebih mudah disiapkan (setidaknya dalam kasus saya): CommandT . Lebih cepat.
donat
6
Alat yang lebih baru, lebih kuat, penulis dalam skrip vim, jadi tidak ada dependensi eksternal yang digunakan ctrlp oleh proyek janus
alexandru.topliceanu
7

Serta ctag yang tak ternilai dan berbagai perintah terkait. Saya juga tidak bisa hidup tanpa plugin proyek , yang memungkinkan Anda untuk memiliki file yang diinginkan terkait dengan proyek di panel terpisah. Saya tidak ingat berapa banyak pengaturan saya yang disesuaikan, tetapi jika saya ingin membuka file sumber bernama Debug.c, saya menekan:

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

Saya kemudian sering melakukan:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

Dengan urutan yang relatif singkat ini, saya dapat membuka file apa pun dan headernya dalam pemisahan vertikal. Karena jendela plugin proyek hanyalah file teks, penyelesaian dicapai dengan menggunakan kemampuan pencarian Vim.

DrAl
sumber
4

Mulai Vim 7.3, :findperintah memiliki tab-penyelesaian nama file.

Jadi, jika Anda menetapkan 'path'pilihan untuk mengandung seluruh proyek Anda (mungkin menggunakan **wildcard untuk memungkinkan rekursif mencari subdirektori), maka Anda dapat menggunakan :find, :sfind, :tabfind, dll perintah dengan selesainya untuk mendapatkan file dalam proyek Anda. Ini juga memungkinkan melompat ke file secara langsung dengan gfdan teman jika nama file ada dalam teks Anda, misalnya dalam perintah include.

Dengan metode ini, tidak ada alat atau plugin eksternal yang diperlukan untuk menavigasi ke file tertentu. Meskipun demikian, mungkin diakui tidak secepat atau mudah digunakan, dan tidak menjawab kebutuhan untuk melompat ke definisi. Untuk definisi, saya menggunakan ctag sebagai saran jawaban lain.

Ben
sumber
3

Jika Anda menggunakan ctag seperti yang direkomendasikan oleh poster lain, pastikan Anda melihat plugin daftar tag .

Pastikan Anda meluangkan waktu untuk membaca dokumen dan mempelajari pengikatan kuncinya. Berikut adalah beberapa untuk Anda mulai (dari jendela TList):

  • o - buka file di jendela baru
  • t - buka file di tab baru
  • [[atau backspace - file sebelumnya dalam daftar
  • ]] atau tab - file berikutnya dalam daftar
Peter Gibson
sumber
3

Ctag yang riang.

Gunakan Ctrl-] untuk melompat ke tag di bawah kursor.

Shizzmo
sumber
2

Saya menggunakan FindFile . Jika Anda membuka vim di root proyek Anda dan menjalankan :FC .plugin akan menyimpan semua nama file di bawah cwd Anda. Anda kemudian dapat melakukannya :FFuntuk membuka menu penyelesaian dan mengetik nama file yang Anda inginkan (atau lebih tepatnya, beberapa huruf pertama).


sumber
wow ini seperti plugin yang paling mudah digunakan. Tidak ada pengaturan yang terlibat .. cukup FC .di direktori root Anda, lalu :FFenter, mulai ketik nama file yang Anda inginkan dan selesai. Saya masih mencoba mencari cara untuk meluncurkan di tab baru ..
penguji
juga perlu diperhatikan bahwa jika Anda menggunakan ini, setiap kali Anda menjalankan vim, Anda harus mengulang file :FC .ke cache di direktori itu.
penguji
Ini adalah versi terbaru dari FindFile.vim dengan :FTatau :FindTabNew gist.github.com/1104884
penguji
2

Membuka vimdari root file sumber Anda dan memperluas pathopsi untuk memasukkan semua sub-direktori di dalamnya.
Misalnya set path+=/usr/include/c++/**untuk header C ++ dan set path+=**untuk direktori sumber Anda.

Ini, kemudian, membuka sejumlah besar kemungkinan berikut.

1) Membuka file dengan nama atau bagiannya

:find file_name

Anda dapat menggunakan pelengkapan otomatis dan perluasan karakter pengganti dengan :findandal. Anda mengetik namanya, itu akan menemukan namanya. Ini bekerja dengan bahasa agnostik. Saya yakin Anda akan menyukainya.

2) Menavigasi ke file di bawah cusror:
jika Anda ingin pergi ke jalur file seperti #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- untuk kembali ke posisi kursor terakhir setelah gfataugF

3) Pencarian API dan menavigasi ke lokasi API

[iatau [Idapat digunakan untuk mencari tanda tangan fungsi Anda untuk kata di bawah kursor tanpa meninggalkan ruang kerja Anda. [<Tab>untuk benar-benar pergi ke deklarasi. Gunakan Ctrl- 6untuk kembali ke lokasi terakhir.


Tanpa memperluas path, Anda dapat mulai menavigasi file dengan :Experintah dan menavigasi serta membuka file Anda. Saya lebih suka NerdTreedaripada ini.

dlmeetei
sumber
1

Meskipun saya agak berharap seseorang akan menunjukkan solusi yang lebih baik sehingga saya dapat mempelajari sesuatu, NERDTree telah membantu saya untuk mendapatkan file tertentu dengan pelengkapan nama selama saya memiliki pohon yang diperluas. Perintah ketika saya perlu membuka file adalah seperti:

, d / foo.pyo (di mana foo.py adalah nama file)

, d untuk membuka pohon, / untuk masuk ke mode pencarian, nama (atau nama parsial, atau regex, atau apapun) file, dan kemudian o untuk membukanya.

Tentu saja Anda mungkin harus menekan 'n' beberapa kali jika Anda tidak mengetik cukup nama file atau ada duplikat.

Saya akui rasanya seperti sedikit retasan menggunakan NERDTree seperti ini meskipun itu sudah sejauh ini ke dalam memori otot saya sekarang sehingga saya bahkan tidak memikirkannya.

Tentu saja saya menggunakan ctag juga tetapi itu hanya berguna ketika Anda memiliki fungsi di dekat kursor dan perlu mendapatkan definisinya di file lain atau sesuatu. Sering kali saya berkata "Oke, saya perlu mengerjakan fitur x sekarang" dan perlu menavigasi ke file lain tanpa referensi di sekitar yang akan sangat membantu oleh ctag.

gravitasi
sumber
3
Saya memeriksanya lagi, fuzzyfinder sepertinya ide bagus untuk pencarian proyek.
gravitasi
1

Saya menggunakan dua plugin saya:

  • searchInRuntime yang melengkapi nama file pada baris perintah. Ini entah bagaimana mirip dengan fuzzyfinder dan lookupfile,
  • lh-tag yang sepenuhnya eksperimental dan tidak berdokumen. Ini menawarkan dua fitur: pembaruan otomatis dan cepat dari tagfile pada penyimpanan file (ing?), Dan pemilih tag dicolokkan <c-w><m-down>secara default. Anda mungkin ingin memeriksa plugin daftar tag terkenal sebagai gantinya.

Keduanya membutuhkan perpustakaan viml saya lh-vim-lib.

Luc Hermitte
sumber
0

Coba SourceCodeObedinece . Yang ini saya kembangkan untuk menangani proyek file sumber C ++ 1Gb.
Saya menggunakannya berpasangan dengan 0scan .

Kedua plugin ini membungkus alat penjelajahan Vim paling populer: ctags dan cscope .

Mykola Golubyev
sumber