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

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

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

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

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

Ответ 1

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

Try

:help tags

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

info ctags

или

ctags --help

Ответ 2

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

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

set path=$PWD/**

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

:find user_spec.rb

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

Ответ 3

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

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

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

Ответ 4

Также как и бесценные 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.

Ответ 5

Начиная с Vim 7.3, команда :find имеет вкладку-заполнение имен файлов.

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

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

Ответ 6

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

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

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

Ответ 7

Exuberant ctags.

Используйте Ctrl-] для перехода к тегу под курсором.

Ответ 8

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

Ответ 9

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

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

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

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

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

Конечно, я тоже использую ctags, но они полезны только тогда, когда у вас есть функция рядом с курсором и нужно перейти к ее определению в другом файле или что-то в этом роде. Много раз я говорю "ОК, мне нужно работать с функцией x сейчас" и вам нужно перейти к другому файлу без каких-либо ссылок поблизости, которые ctags действительно помогут.

Ответ 10

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

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

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

Ответ 11

Открытие 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, хотя это.

Ответ 12

Попробуйте SourceCodeObedinece. Это я разработал для работы с исходными файлами исходных файлов С++ 1Gb.
Я использую его в паре с 0scan.

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