Як орієнтуватися у великому проекті у 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 ++.
Luc Hermitte

28

Мені подобаються прості рішення, на даний момент улюбленим способом навігації є:

Додати до ~/.vimrc.local

set path=$PWD/**

Потім введіть це в редакторі, щоб знайти файл у будь-якому місці поточного робочого каталогу (pwd)

:find user_spec.rb

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


1
Це рішення набагато простіше, ніж: FC та плагіни, тому що кешування не потрібно, і ... Ви зробили мій день авокадою! Дякую!
Шрікумар

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

13

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

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

Одне, на що слід звернути увагу, коли FuzzyFinder Textmate працює, це те, що це залежить від старої версії плагіна FuzzyFinder, зокрема версії 2.16. Щось вище, і ви отримаєте помилки. Але це безумовно варто потрудитися. Хоча він не має завершення імені, його пошук розумний, тому, якщо я його шукаю fro/time/actionsphp, витягне файл apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(дужки означають, що воно відповідає). Це дозволяє дуже легко виділити файли, унікальні лише за назвою папки.


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

6
Більш новий, більш потужний інструмент, writter в Vim сценарію, так що немає зовнішніх залежностей ctrlp використовується проект Янус
alexandru.topliceanu

7

А також безцінні теги та різні пов'язані команди. Я також не міг жити без плагіна проекту , який дозволяє розміщувати цікаві файли, пов’язані з проектом, на окремій панелі. Я не можу згадати, скільки налаштувань налаштовано, але якщо я хочу відкрити вихідний файл під назвою 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

Буйний ctags.

Використовуйте 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) Перехід до файлів під кастрором:
якщо ви хочете пройти шлях до файлу, як #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 і файл пошуку,
  • lh-теги, що є повністю експериментальним та бездокументарним. Він пропонує дві функції: автоматичне та швидке оновлення файлу тегів при збереженні файлу (ing?) Та селектор тегів, підключений <c-w><m-down>за замовчуванням. Можливо, ви захочете перевірити відомий плагін списку тегів.

Для обох потрібна моя бібліотека viml lh-vim-lib.


0

Спробуйте SourceCodeObedinece . Цей я розробив для обробки проекту вихідних файлів C ++ 1Gb.
Я використовую його в парі з 0scan .

Ці два плагіни є обгортками навколо найпопулярніших інструментів перегляду Vim: ctags та cscope .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.