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.


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

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.


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.


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.


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.


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

3

Ctag yang riang.

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


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).


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.


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.


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.