Как перемещаться в большом проекте в 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.