Как ориентироваться в большом проекте в VIM


86

Как управлять большими проектами (сотнями файлов), используя только VIM?

Лично у меня возникают проблемы в любом крупном проекте.

  • есть ли способ быстро «перейти к файлу», желательно с завершением имени?
  • то же самое для «перейти к определению класса», когда он находится в другом файле

Я вроде как знаю все основы VIM, поэтому у меня нет проблем с его использованием для написания скриптов или быстрого редактирования исходного кода. Но когда мне приходится перемещаться между файлами, мне становится очень неприятно.


На каком языке ты говоришь?
LB40

Я бы предпочел независимое от языка решение, но мне нужна поддержка C ++, PHP и Rails.
Якуб Арнольд,

Какой ответ вы приняли? @JakubArnold

@xetrasu Я в конечном итоге использовалNERDTree
Якуб Арнольд

Ответы:


33

VIM имеет отличную поддержку тегов . После того, как вы создали файл тегов для своего проекта, вы можете перейти к определению или объявлению метода, класса и т. Д., Включая переход между файлами, и все это в рамках одного сеанса редактирования.

Пытаться

:help tags

Чтобы создать файл тегов для C / C ++, перейдите в приглашение оболочки (я предполагаю, что ваша система - * nix / Cygwin) и введите

info ctags

или

ctags --help

2
Vim также поддерживает cscope, что позволяет вам делать такие вещи, как поиск функций, вызывающих данную функцию - см. :help cscopeИнформацию. Во введении есть хороший список функций (в разделе «Он предназначен для ответов на такие вопросы, как»).
Cascabel

1
К сожалению, cscope имеет очень ограниченное понимание C ++.
Люк Эрмитт,

28

Мне нравятся простые решения, мой любимый способ навигации на данный момент:

добавить в ~/.vimrc.local

set path=$PWD/**

Затем введите это в редакторе, чтобы найти файл в любом месте текущего рабочего каталога (pwd).

:find user_spec.rb

Вы можете использовать завершение табуляции в именах файлов, чтобы найти несколько вариантов, что очень удобно для преобразования TextMate.


1
Это решение намного проще, чем FC и плагины, потому что кеширование не требуется и ... вы сделали мой дневной авокад! Благодарность!
Srikumar

1
Vim не считывает wd каталогом по умолчанию. Я перезапустил оболочку, но она по-прежнему не работает. Также пробовал vim .перед выполнением команды: /
Адам Грант

13

Я использую комбинацию NERDTree (боковая панель каталога), FuzzyFinder Textmate (переход к файлу, как CMD + T TextMate) и Sessions (: h sessions), чтобы помочь мне справиться с большими проектами.

Я бы предложил использовать вспомогательный плагин для некоторых сессий. Я бы сказал, что использую, но пока не доволен. Просто погуглите "vim sessions".

Одна вещь, которую следует отметить, чтобы заставить FuzzyFinder Textmate работать, заключается в том, что это зависит от старой версии плагина FuzzyFinder, в частности v2.16. Что-нибудь выше, и вы получите ошибки. Но это определенно того стоит. Хотя у него нет завершения имени, его поиск является умным, поэтому, если я буду искать, fro/time/actionsphpон откроет файл apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(скобки обозначают, что он соответствует). Это позволяет очень легко выбирать файлы, которые уникальны только по имени папки.


2
Я нашел новый плагин, который мне больше нравится и который проще настроить (по крайней мере, в моем случае): CommandT . Намного быстрее.
пончик

6
Более новый, более мощный инструмент, писатель на vim script, поэтому ctrlp не используется в проекте janus
alexandru.topliceanu

7

А также бесценные теги ctags и различные связанные с ними команды. Я также не мог жить без плагина проекта , который позволяет вам иметь интересующие файлы, связанные с проектом, на отдельной панели. Я не могу вспомнить, какая часть моих настроек настроена, но если я хочу открыть исходный файл с именем Debug.c, я нажимаю:

<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

Я часто делаю:

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

С помощью этой относительно короткой последовательности я могу открыть любой файл и его заголовок с вертикальным разделением. Поскольку окно плагина проекта представляет собой просто текстовый файл, завершение достигается за счет использования возможностей поиска Vim.


4

Начиная с Vim 7.3, в :findкоманде есть завершение имен файлов табуляцией.

Так что, если вы установите 'path'опцию , чтобы содержать весь проект (возможно , с использованием **группового символа , чтобы рекурсивно поиском поддиректории), то вы можете использовать :find, :sfind, :tabfindи т.д. команды с завершением добраться до любого файла в вашем проекте. Это также позволяет переходить к файлам напрямую и с gfдрузьями, если имя файла указано в вашем тексте, например, в директиве include.

При использовании этого метода не требуются внешние инструменты или плагины для перехода к определенным файлам. Хотя, по общему признанию, он может быть не таким быстрым или простым в использовании и не учитывает необходимость перехода к определениям. Для определений я использую ctags, как предлагают другие ответы.


3

Если вы используете ctags, как рекомендовали другие плакаты, обязательно посмотрите плагин taglist .

Убедитесь, что вы нашли время, чтобы прочитать документацию и изучить привязки клавиш. Вот несколько примеров для начала (из окна TList):

  • o - открыть файл в новом окне
  • t - открыть файл в новой вкладке
  • [[или backspace - предыдущий файл в списке
  • ]] или табуляция - следующий файл в списке

3

Обильные теги.

Используйте Ctrl-], чтобы перейти к тегу под курсором.


2

Я использую FindFile . Если вы откроете vim в корне вашего проекта и запустите :FC .плагин, он будет кэшировать все имена файлов под вашим cwd. Затем вы :FFможете открыть меню завершения и ввести имя нужного файла (точнее, первые несколько букв).


вау, это самый простой в использовании плагин. Никаких настроек не требуется ... просто FC .в корневом каталоге, затем :FFвведите, начните вводить имя файла, которое хотите, и все готово. Я все еще пытаюсь понять, как запускать в новых вкладках ..
тестировщик

также стоит отметить, что если вы используете это, каждый раз, когда вы запускаете vim, вам нужно будет переделывать :FC .файлы для кеширования в этом каталоге.
тестировщик

Вот обновленная версия FindFile.vim с :FTили :FindTabNew gist.github.com/1104884
тестер

2

Открытие vimиз корня исходного файла и pathвозможность расширения для включения в него всех подкаталогов.
Например, set path+=/usr/include/c++/**для заголовков C ++ иset path+=** для вашего исходного каталога.

Таким образом, это открывает множество следующих возможностей.

1) Открытие файла по имени или его части

:find file_name

Вы можете использовать автозаполнение и подстановочные знаки с :findнадежностью. Вы вводите имя, оно найдет имя. Это работает независимо от языка. Я уверен, что вам это понравится.

2) Переход к файлам под cusror:
если вы хотите перейти по пути к файлу, например #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- вернуться к последней позиции курсора после gfилиgF

3) Поиск API и переход к местоположению API

[iили [Iможет использоваться для поиска сигнатуры вашей функции по слову под курсором, не покидая рабочего пространства. [<Tab>фактически перейти к декларации. Используйте Ctrl-, 6чтобы вернуться в последнее место.


Не расширяя path, вы можете начать навигацию по файлам по :Exкоманде, а также перемещаться и открывать файл. Я предпочитаю NerdTreeэто.


1

Хотя я как бы надеюсь, что кто-то укажет лучшее решение, чтобы я мог чему-то научиться, NERDTree был мне полезен для доступа к конкретным файлам с завершением имени, пока у меня было развернуто дерево. Команда, когда мне нужно перейти к файлу, выглядит примерно так:

, d / foo.pyo (где foo.py - имя файла)

, d, чтобы открыть дерево, /, чтобы войти в режим поиска, имя (или частичное имя, или регулярное выражение, или что-то еще) файла, а затем o, чтобы открыть.

Конечно, вам, возможно, придется нажать «n» несколько раз, если вы не набрали достаточно имени файла или есть дубликаты.

Я признаю, что это похоже на хакерство с использованием NERDTree, подобного этому, хотя к настоящему времени это так глубоко проникло в мою мышечную память, что я даже не думаю об этом.

Конечно, я тоже использую ctags, но они полезны только тогда, когда у вас есть функция рядом с курсором и вам нужно добраться до ее определения в другом файле или в чем-то еще. Часто я говорю: «Хорошо, мне нужно поработать над функцией x сейчас», и мне нужно перейти к другому файлу без каких-либо ссылок поблизости, с которыми действительно помогли бы ctags.


3
Я изучил это еще раз, fuzzyfinder выглядит отличной идеей для поиска проектов.
тяготение

1

Я использую два своих плагина:

  • searchInRuntime, который завершает имена файлов в командной строке. Он чем-то похож на fuzzyfinder и lookupfile,
  • lh-tags, который является полностью экспериментальным и недокументированным. Он предлагает две функции: автоматическое и быстрое обновление файла тегов при сохранении файла (ing?) И селектор тегов, подключенный <c-w><m-down>по умолчанию. Вместо этого вы можете проверить известный плагин taglist.

Оба требуют моей библиотеки viml lh-vim-lib.


0

Пытаться SourceCodeObedinece . Этот я разработал для работы с проектами исходных файлов C ++ 1 ГБ.
Использую в паре с 0scan .

Эти два плагина являются оболочкой для самых популярных инструментов просмотра Vim: ctags и cscope .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.