Cách điều hướng trong dự án lớn trong VIM


86

Làm thế nào để bạn quản lý các dự án lớn (hàng trăm tệp) chỉ sử dụng VIM?

Cá nhân tôi bắt đầu gặp vấn đề trong bất kỳ dự án lớn hơn nhỏ nào.

  • có cách nào để nhanh chóng 'đi đến tệp', tốt nhất là với tên hoàn chỉnh?
  • tương tự cho 'đi đến định nghĩa lớp', khi nó nằm trong một tệp khác

Tôi gần như biết tất cả các kiến ​​thức cơ bản về VIM, vì vậy tôi không gặp vấn đề gì khi sử dụng nó để viết script hoặc chỉnh sửa nhanh một số mã nguồn. Nhưng nó thực sự lộn xộn đối với tôi khi tôi phải điều hướng giữa các tệp.


Ngôn ngữ của bạn đang sử dụng là gì ?
LB40

Tôi thích giải pháp bất khả tri ngôn ngữ hơn, nhưng tôi cần hỗ trợ cho C ++, PHP và Rails.
Jakub Arnold

Câu trả lời nào bạn đã chấp nhận? @JakubArnold

@xetrasu Tôi đã kết thúc bằng cách sử dụngNERDTree
Jakub Arnold

Câu trả lời:


33

VIM hỗ trợ rất tốt cho các thẻ . Khi bạn đã tạo tệp thẻ cho dự án của mình, bạn có thể chuyển đến định nghĩa hoặc khai báo của một phương thức, lớp, v.v., bao gồm cả việc chuyển qua các tệp, tất cả đều nằm trong cùng một phiên chỉnh sửa.

Thử

:help tags

Để tạo tệp thẻ cho C / C ++, hãy chuyển đến lời nhắc trình bao của bạn (tôi giả sử hệ thống của bạn là * nix / Cygwin) và nhập

info ctags

hoặc là

ctags --help

2
Vim cũng có hỗ trợ cho cscope, cho phép bạn thực hiện những việc như tìm hàm nào gọi một hàm nhất định - hãy xem :help cscopeđể biết thông tin. Có một danh sách tính năng hay trong phần giới thiệu (trong phần "Nó được thiết kế để trả lời những câu hỏi như").
Cascabel 22/09/09

1
Thật không may, cscope có hiểu biết rất hạn chế về C ++.
Luc Hermitte 22/09/09

28

Tôi thích các giải pháp đơn giản, cách điều hướng yêu thích của tôi vào lúc này là:

Thêm vào ~/.vimrc.local

set path=$PWD/**

Sau đó, nhập tệp này vào trình chỉnh sửa để tìm tệp ở bất kỳ đâu trong thư mục làm việc hiện tại (pwd)

:find user_spec.rb

Bạn cũng có thể sử dụng tính năng hoàn thành tab trên tên tệp để tìm nhiều lựa chọn, làm cho việc chuyển đổi TextMate này rất vui.


1
Giải pháp này đơn giản hơn nhiều so với: FC và plugin 'vì không cần bộ nhớ đệm và ... bạn đã làm nên ngày của tôi! Cảm ơn!
Srikumar

1
Vim không đọc wd dưới dạng thư mục mặc định. Tôi đã khởi động lại shell và nó vẫn không hoạt động. Cũng đã thử vim .trước khi thực hiện lệnh: /
Adam Grant

13

Tôi sử dụng kết hợp NERDTree (thanh bên thư mục), FuzzyFinder Textmate (chuyển đến tệp như CMD + T của TextMate) và Sessions (: h phiên) để giúp tôi giải quyết các dự án lớn.

Tôi sẽ đề xuất sử dụng một số plugin trợ giúp phiên. Tôi sẽ đề cập đến những gì tôi sử dụng, nhưng tôi chưa hài lòng với nó. Chỉ cần Google "phiên vim".

Một điều cần lưu ý để FuzzyFinder Textmate hoạt động là nó phụ thuộc vào phiên bản cũ của plugin FuzzyFinder, cụ thể là v2.16. Bất cứ điều gì cao hơn và bạn sẽ nhận được lỗi. Nhưng nó chắc chắn đáng để rắc rối. Mặc dù nó không có tên hoàn thành, nhưng tìm kiếm của nó rất thông minh vì vậy nếu tôi tìm kiếm fro/time/actionsphpnó sẽ kéo tệp lên apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(dấu ngoặc đơn biểu thị những gì nó khớp). Nó giúp bạn dễ dàng chọn ra các tệp chỉ duy nhất theo tên thư mục của chúng.


2
Tôi đã tìm thấy một plugin mới mà tôi thích hơn và dễ cài đặt hơn (ít nhất là trong trường hợp của tôi): CommandT . Nhanh hơn nhiều.
donut

6
Một phiên bản mới hơn, công cụ mạnh mẽ hơn, người viết kịch bản trong vim, phụ thuộc nên không bên ngoài là ctrlp sử dụng bởi các dự án Janus
alexandru.topliceanu

7

Cũng như các ctags vô giá và các lệnh liên quan khác nhau. Tôi cũng không thể sống mà không có plugin dự án , cho phép bạn có các tệp quan tâm được liên kết với dự án trong một ngăn riêng biệt. Tôi không thể nhớ mức độ thiết lập của mình được tùy chỉnh, nhưng nếu tôi muốn mở một tệp nguồn có tên là Debug.c, tôi nhấn:

<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

Sau đó tôi thường làm:

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

Với trình tự tương đối ngắn này, tôi có thể mở bất kỳ tệp nào và tiêu đề của tệp đó được tách theo chiều dọc. Vì cửa sổ plugin của dự án chỉ là một tệp văn bản, việc hoàn thành có thể đạt được bằng cách sử dụng khả năng tìm kiếm của Vim.


4

Bắt đầu từ Vim 7.3, :findlệnh có tên tệp hoàn thành bằng tab.

Vì vậy, nếu bạn thiết lập 'path'tùy chọn để chứa toàn bộ dự án của bạn (có thể sử dụng các **ký tự đại diện để cho phép các thư mục con đệ quy tìm kiếm), sau đó bạn có thể sử dụng :find, :sfind, :tabfindvv lệnh với hoàn để có được bất kỳ tập tin trong dự án của bạn. Điều này cũng cho phép chuyển đến tệp trực tiếp với gfvà bạn bè nếu tên tệp nằm trong văn bản của bạn, chẳng hạn như trong chỉ thị bao gồm.

Với phương pháp này, không cần công cụ hoặc plugin bên ngoài nào để điều hướng đến các tệp cụ thể. Mặc dù, phải thừa nhận rằng nó không nhanh hoặc dễ sử dụng và không giải quyết được nhu cầu chuyển sang định nghĩa. Đối với các định nghĩa, tôi sử dụng thẻ ctags như các câu trả lời khác đề xuất.


3

Nếu bạn đang sử dụng ctags như áp phích khác đã đề nghị, thì chắc chắn rằng bạn nhìn vào taglist plugin.

Đảm bảo rằng bạn dành thời gian để đọc tài liệu và tìm hiểu các ràng buộc chính. Dưới đây là một số cách giúp bạn bắt đầu (từ cửa sổ TList):

  • o - mở tệp trong cửa sổ mới
  • t - mở tệp trong tab mới
  • [[hoặc backspace - tệp trước đó trong danh sách
  • ]] hoặc tab - tệp tiếp theo trong danh sách

3

Ctags hoa lệ.

Sử dụng Ctrl-] để chuyển đến thẻ dưới con trỏ.


2

Tôi sử dụng FindFile . Nếu bạn mở vim tại thư mục gốc của dự án và chạy :FC .plugin sẽ lưu vào bộ đệm tất cả các tên tệp bên dưới cwd của bạn. Sau đó, bạn có thể :FFmở menu hoàn thành và nhập tên của tệp bạn muốn (hay đúng hơn là một vài chữ cái đầu tiên).


wow đây giống như plugin dễ sử dụng nhất. Không liên quan đến thiết lập .. chỉ FC .trong thư mục gốc của bạn, sau đó :FFnhập, bắt đầu nhập tên tệp bạn muốn và bạn đã hoàn tất. Tôi cố gắng để tìm ra cách để khởi động trong tab mới vẫn mặc dù ..
thử nghiệm

Cũng cần lưu ý rằng nếu bạn sử dụng điều này, mỗi khi bạn khởi chạy vim, bạn sẽ cần phải thực hiện lại :FC .bộ nhớ cache các tệp trong thư mục đó.
tester

Đây là phiên bản cập nhật của FindFile.vim với :FThoặc :FindTabNew gist.github.com/1104884
người thử nghiệm vào

2

Mở vimtừ thư mục gốc của tệp nguồn của bạn và mở rộng pathtùy chọn để bao gồm tất cả các thư mục con trong đó.
Ví dụ set path+=/usr/include/c++/**cho tiêu đề C ++ và set path+=**cho thư mục nguồn của bạn.

Điều này, sau đó, mở ra rất nhiều khả năng sau đây.

1) Mở tệp theo tên hoặc các phần của nó

:find file_name

Bạn có thể sử dụng tính năng tự động hoàn thành và mở rộng ký tự đại diện :findmột cách đáng tin cậy. Bạn gõ tên, nó sẽ định vị tên. Điều này hoạt động theo ngôn ngữ bất khả tri, tôi chắc chắn bạn sẽ thích nó.

2) Điều hướng đến các tệp dưới lỗi:
nếu bạn muốn đi đến một đường dẫn tệp như #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- để quay lại vị trí con trỏ cuối cùng sau gfhoặcgF

3) Tra cứu API và điều hướng đến vị trí API

[ihoặc [Icó thể được sử dụng để tra cứu chữ ký hàm của bạn cho từng từ dưới con trỏ mà không cần rời khỏi vùng làm việc của bạn. [<Tab>để thực sự đi đến khai báo. Sử dụng Ctrl- 6để quay lại vị trí cuối cùng.


Không cần mở rộng path, bạn có thể bắt đầu điều hướng tệp bằng :Exlệnh và điều hướng và mở tệp của mình. Tôi thích NerdTreeđiều này hơn.


1

Mặc dù tôi hy vọng ai đó sẽ chỉ ra một giải pháp tốt hơn để tôi có thể học được điều gì đó, nhưng NERDTree đã rất tốt với tôi khi truy cập vào các tệp cụ thể với tên hoàn tất miễn là tôi mở rộng cây. Lệnh khi tôi cần truy cập một tệp như sau:

, d / foo.pyo (trong đó foo.py là tên tệp)

, d để mở cây, / để vào chế độ tìm kiếm, tên (hoặc một phần tên, hoặc regex, hoặc bất cứ thứ gì) của tệp, rồi nhấn o để mở.

Tất nhiên bạn có thể phải nhấn 'n' một vài lần nếu bạn không nhập đủ tên tệp hoặc có các bản sao.

Tôi thừa nhận rằng nó giống như một chút hack khi sử dụng NERDTree như thế này mặc dù nó đã đi sâu vào trí nhớ cơ bắp của tôi cho đến bây giờ tôi thậm chí không nghĩ về nó.

Tất nhiên tôi cũng sử dụng thẻ ctags nhưng những thẻ đó chỉ hữu ích khi bạn có một hàm gần con trỏ và cần đi đến định nghĩa của nó trong một tệp khác hoặc một cái gì đó. Rất nhiều lần tôi nói "OK, tôi cần làm việc với tính năng x ngay bây giờ" và cần điều hướng đến một tệp khác mà không có bất kỳ tham chiếu nào gần đó mà ctags thực sự sẽ hữu ích.


3
Tôi đã xem xét kỹ hơn, công cụ tìm kiếm mờ trông giống như một ý tưởng tuyệt vời để tìm kiếm dự án.
hấp dẫn

1

Tôi đang sử dụng hai plugin của mình:

  • searchInRuntime hoàn thành tên tệp trên dòng lệnh. Bằng cách nào đó, nó tương tự như dimfinder và lookupfile,
  • Thẻ lh hoàn toàn là thẻ thử nghiệm và không có tài liệu. Nó cung cấp hai tính năng: cập nhật tự động và nhanh chóng tệp thẻ khi lưu tệp (ing?) Và một bộ chọn thẻ được cắm vào <c-w><m-down>theo mặc định. Bạn có thể muốn kiểm tra plugin danh sách thẻ nổi tiếng để thay thế.

Cả hai đều yêu cầu thư viện viml của tôi lh-vim-lib.


0

Hãy thử SourceCodeObedinece . Cái này tôi đã phát triển để xử lý dự án tệp nguồn C ++ 1Gb.
Tôi sử dụng nó cùng với 0scan .

Hai plugin này là những trình bao bọc xung quanh các công cụ duyệt Vim phổ biến nhất: ctagscscope .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.