Советы и рекомендации Vim и Ctags

Я только что установил Ctags (для помощи в разработке на C ++) с моим Vim (или, скорее, gVim), и хотел бы узнать ваши любимые команды, макросы, сочетания клавиш, сопутствующие советы ...

Поделитесь своим лучшим арсеналом. Какие еще надстройки Vim вы бы порекомендовали для C ++ при разработке Vim?

РЕДАКТИРОВАТЬ Какие еще надстройки вы бы использовали вместе с Ctags?

EDIT2 Какую версию gVim вы используете с тегами? Есть ли разница?

EDIT3 Как вы улучшите свой опыт программирования как для больших, так и для маленьких проектов?


person Community    schedule 19.02.2009    source источник
comment
Для достижения наилучших результатов убедитесь, что вы используете обильные ctags (современная реализация): ctags.sourceforge.net   -  person idbrii    schedule 23.02.2011
comment
Может, кев неконструктивен?   -  person Floyd    schedule 06.06.2013
comment
Итак, я здесь отвечаю: попробуйте clang + supertab + snipmate. Это как intellisense в vim! zwiener.org/vimautocomplete.html   -  person Zardoz89    schedule 24.06.2013
comment
хотя closed as not constructive почти два года назад, для меня это так конструктивно   -  person sazary    schedule 11.08.2013
comment
Я думаю, что настоящая причина закрыть этот вопрос должна была быть: этот вопрос, несмотря на то, что он чрезвычайно полезен, не вписывается в политику StackOverflow в вопросах и ответах. Пусть этот вопрос и ответы переместятся на Quora и расширят этот сайт, в то время как мы упорно закрываем полезные вопросы и ответы.   -  person Diego Pino    schedule 17.02.2014
comment
В тот момент, когда я увидел этот вопрос в результатах поиска Google, я понял, что он будет закрыт как неконструктивный вопрос!   -  person Pratik Singhal    schedule 10.11.2014
comment
noremap <c-]> <c-]>zz, просто потому, что я хочу, чтобы прыжок располагался по центру экрана;)   -  person Paschalis    schedule 26.02.2015
comment
Я понимаю, почему этот вопрос был закрыт, учитывая правила SO. Но пометить ›вопрос с 400 голосами за› ответ с 300 голосами за удаление - это немного раздражительно, не так ли?   -  person DevSolar    schedule 17.08.2015
comment
Мне так надоело видеть закрытые вопросы как неконструктивные, когда они явно полезны для стольких людей ...   -  person Chauncey Garrett    schedule 09.06.2016


Ответы (15)


Ctrl + ] - перейти к определению
Ctrl + T - вернуться к определению.
Ctrl + W Ctrl + ] - открыть определение в горизонтальном разделении

Добавьте эти строки в vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl + \ - открыть определение в новой вкладке
Alt + ] - открыть определение в вертикальный раскол

После создания тегов. Вы можете использовать следующие клавиши для включения и выключения функций:

Ctrl + Left MouseClick - перейти к определению
Ctrl + Right MouseClick - вернуться к определению

person Amjith    schedule 19.02.2009
comment
C -] = ›(клавиша управления) и] клавиша C - T =› (клавиша управления) и клавиша T Только для новичков в ctags. Спасибо за трюк с новой вкладкой - person kumar; 08.12.2009
comment
Точно так же после разделения окна с помощью Ctrl-w C-] вы можете использовать C-w T (также известный как Shift-t), чтобы изменить это разделение на новую вкладку. - person dash-tom-bang; 29.09.2010
comment
Когда я использую ваше предложение с set tags = tags; /, оно работает в vim, но не в gvim. Он говорит, что не может найти файлы тегов. Любое предложение? - person Somebody still uses you MS-DOS; 02.12.2010
comment
@ Кто-то все еще использует MS-DOS: `теги; C:`? Я чувствую, что вы пошутили ... - person mattalxndr; 19.04.2011
comment
Хм ... один недостаток в том, что когда тега нет, новая вкладка / разделение все равно открывается. - person Ehtesh Choudhury; 09.08.2011
comment
Подобно вашим картам, vim имеет команду :ptag, которая открывает определение в окне предварительного просмотра. - person idbrii; 24.11.2011
comment
как заставить A-] работать на Os X? - person Will; 31.01.2012
comment
@Will Если вы используете vim из терминала, вам нужно изменить настройки терминала, чтобы клавиша option работала как клавиша alt. Если вы используете MacVim, добавьте эту строку в vimrc 'set macmeta'. Есть документ для макметы,: h макмета. - person Amjith; 31.01.2012
comment
g C-] очень полезно. Он открывает быстрое диалоговое окно для выбора одного из нескольких определений. - person Vincenzo Pii; 22.03.2012
comment
g] тоже полезен. Вы можете навести курсор на имя тега и нажать g], чтобы получить список подходящих тегов. - person zeekvfu; 23.08.2013
comment
также set splitright может быть полезным. команды будут выполняться в правом окне после разделения - person Kirill Zaitsev; 31.03.2014
comment
vim -t <tag> тоже весьма полезно: открывает vim по тегу - person shangxiao; 06.01.2016

Одна строка, которая всегда идет в моем .vimrc:

set tags=./tags;/

Это будет искать в текущем каталоге «теги» и двигаться вверх по дереву к корню, пока не будет найден один. IOW, вы можете находиться где угодно в дереве исходных текстов, а не только в его корне.

person uzi    schedule 12.04.2009
comment
Подниматься до root - это лишнее. Я предлагаю вместо этого идти только домой: tags + = tags; $ HOME - person gotgenes; 12.05.2009
comment
Исходные деревья, над которыми я работаю, не всегда находятся в моем домашнем каталоге ... и поскольку $ HOME обычно находится на расстоянии двух каталогов от корня ... ну, я могу позволить себе еще два просмотра каталогов. :) - person uzi; 13.05.2009
comment
Я согласен с узи. Если мой cwd - это / home / me / programming / foo / bar / baz / bang / bam, это всего лишь 8 поисков в каталогах. Я полагаю, это зависит от вашей терпимости к скорости, но время поиска 1 каталога не сильно отличается от 8 на моей машине. - person Nate Murray; 23.10.2009
comment
Я помещаю свои теги в подкаталог, но использую аналогичный трюк (который дает то же исправление, о котором упоминал @Amit), set tags=_tags/tags;c:/work - person dash-tom-bang; 29.09.2010
comment
Это зависит от вашего сценария, мне нужно использовать предложение gotgenes на одной из моих машин, потому что в / home примерно 8000 каталогов, и это, как правило, немного вялый. - person jkerian; 22.02.2011
comment
Есть что-то подобное для cscope? - person szx; 07.12.2012
comment
Вам даже не понадобится /, если вы подниметесь в корневой каталог. Достаточно всего ;. - person danadam; 28.06.2013

Еще один полезный плагин для разработки на C - cscope. Так же, как Ctags позволяет переходить к определениям, Cscope переходит к вызов функций.

Если у вас есть cscope в вашем каталоге ~ / bin /, добавьте следующее в ваш .vimrc и используйте g ^] для перехода к вызывающей функции (см.: Help cscope).

if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
        " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
endif

Чуть не забыл ... Так же, как ctags - нужно генерировать (и периодически обновлять) базу данных. Я использую следующий скрипт

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

Где select_files - это еще один сценарий, который извлекает список файлов C и заголовочных файлов из Makefile. Таким образом я индексирую только те файлы, которые фактически используются в проекте.

person nimrodm    schedule 19.02.2009
comment
В чем преимущество cscope перед ctags? Делают ли они комплименты друг другу? - person Whaledawg; 20.02.2009
comment
Они дополняют друг друга. Ctags находит определение символа или функции. Cscope может найти все места, вызывающие функцию. их использование делает навигацию в больших деревьях исходных текстов очень простой. - person nimrodm; 20.02.2009
comment
Однако AFAIK cscope имеет ограниченное понимание C ++. - person Luc Hermitte; 21.02.2009
comment
Он ограничен и не очень хорош. Но для того, что он делает (переход к ИСПОЛЬЗОВАНИЮ), лучшей альтернативы нет. Его основная проблема заключается в том, что, когда вы хотите перейти к вызовам функций (f), вам часто нужно перейти в любое место, где используется этот символ (символы), и мысленно отфильтровать результаты ... - person Greg Rogers; 13.04.2009
comment
... потому что он ненавидит пространства имен. Global тоже работает, но IMO немного хуже. - person Greg Rogers; 13.04.2009
comment
Можете ли вы показать пример скриптов select_files? - person vehomzzz; 08.09.2009
comment
@Whaledawg Да, когда я нажимаю CTRL +] моя звуковая карта отправляет clap.wav на выходе :) - person Patrizio Rullo; 02.02.2011
comment
@vehomzzz: nimrodm делает что-то более интересное со своими make-файлами, но вы можете просто использовать find: find . -type f \( -iname "*.cpp" -o -iname "*.h" \) - person idbrii; 24.11.2011

Вы можете добавлять каталоги в поиск по ctags. Например, у меня есть индекс ctags, созданный для Qt4, и он есть в моем .vimrc:

set tags+=/usr/local/share/ctags/qt4
person strager    schedule 19.02.2009

Все вышеперечисленное и ...

code_complete: завершение параметра функции, фрагменты кода и многое другое.

taglist.vim: браузер исходного кода (поддерживает C / C ++, java, perl, python, tcl, sql, php и т. д.)

person Johan    schedule 05.03.2009
comment
Думаю, было бы хорошо добавить, что taglist.vim - самый загружаемый плагин vim. - person amit; 28.11.2009

Я использую ALT-left и ALT-right, чтобы выталкивать / выталкивать из / в стек тегов.

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

Если вы используете hjkl для движения, вы можете вместо этого отобразить <M-h> и <M-l>.

person strager    schedule 19.02.2009
comment
не то же самое, что ctrl -] и ctrl-t - я думаю, ваше предложение немного чище. - person ; 19.02.2009
comment
@ Саша, простите? Не понимаю, о чем ты говоришь. = X Обратите внимание: это также работает в: help. - person strager; 19.02.2009
comment
Я думаю, что это более интуитивно понятно и чище, чем по умолчанию. - person Ayman; 10.09.2009
comment
@Ayman Но также нарушает принцип отсутствия необходимости убирать руки с домашней строки, например, при использовании hjkl вместо клавиш со стрелками. - person TankorSmash; 30.08.2013
comment
@ ТанкорСмаш, какой принцип? - person strager; 30.08.2013

Несколько определений одного и того же имени

<C-w>g<C-]> открыть определение в разделе, но также сделать :tjump, который либо переходит к определению, либо, если определений несколько, предоставляет вам список определений на выбор.

person Heikki Naski    schedule 22.04.2010
comment
Подобно первой команде, vim имеет команду :ptag, которая открывает определение в окне предварительного просмотра. - person idbrii; 24.11.2011
comment
Окно предварительного просмотра приятно, потому что вы можете закрыть его с помощью: pc из любого другого окна, без необходимости сначала перемещать курсор в окно предварительного просмотра. - person Heikki Naski; 22.03.2012
comment
Также есть изящный трюк autocmd с ptag в :h CursorHold-example, который отображает тег для элемента под курсором в окне предварительного просмотра после настраиваемого тайм-аута. - person dash-tom-bang; 28.05.2013
comment
+1 за: tjump Я привязал: tjump ‹C-r› ‹C-w› ‹CR› работает лучше, чем ‹C -]› imho Хотел бы совместить это поведение с: ptag - person Andreas Fliesberg; 17.06.2013
comment
:help иногда потрясающе ... см. :help CTRL-W_g} и :ptjump - person Andreas Fliesberg; 17.06.2013

Чаще всего я использую команду C-], которая переходит к определению функции под курсором. Вы можете использовать его чаще, чтобы следить за большим количеством звонков. После этого C-o вернет вас на один уровень, C-i снова войдет глубже.

person raimue    schedule 19.02.2009
comment
C-t возвращает на один уровень назад в стеке C-], а C-o возвращается на предыдущую позицию курсора после перемещения. Итак, если вы C-] к функции, а затем на страницу вниз, C-t немедленно вернется, а C-o вернется к началу функции, затем вернется к вызову. - person Greg Hewgill; 19.02.2009

Я считаю, что подключаемый модуль taglist просто необходим. Он перечисляет все теги, о которых он знает (файлы, которые вы открыли), в отдельном окне и упрощает навигацию по большим файлам.

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

person Walter    schedule 21.02.2009

Я инкапсулировал манипуляции с тегами в экспериментальном плагине мой.

Что касается разработки на C ++ в vim, я уже ответил там : Я использую свой собственный набор и несколько других плагинов.

person Luc Hermitte    schedule 19.02.2009

Я адаптирую свои плагины vim в течение двух лет для поддержки достаточно большого проекта C ++. Вы можете взглянуть на них.

Они используют ctags и cscsope.

http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507

person Mykola Golubyev    schedule 05.03.2009

Я поместил следующее в свой файл .gvimrc, который ищет по дереву из любой точки файл тегов при запуске gvim:

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

Затем я периодически регенерирую файл тегов в верхней части моего исходного дерева с помощью сценария, который выглядит так:

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -
person alanwj    schedule 17.04.2009
comment
Вы только что заново изобрели восходящий поиск. См .: h поиск файлов. См. Также stackoverflow.com/questions/563616/vimctags- советы и рекомендации / - person gotgenes; 12.05.2009

Я использую vim в macos, и исходные теги ctags не работают, поэтому я загружаю самую новую и настраиваю make make install. Я устанавливаю ctgas в / usr / local / bin / ctags (чтобы сохранить исходный)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>
person Zhenyu Li    schedule 27.12.2010

Я адаптировал указанную выше функцию поиска SetTags () (которую следует заменить на эквивалент set tags+=./tags;/) для работы с cscope. Кажется, работает!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()
person dergachev    schedule 04.05.2011
comment
Как сказал готгенес, вы заново изобрели поиск вверх. См .: h поиск файлов. См. этот плагин для соответствующего примера. - person idbrii; 24.11.2011

Еще одна итерация вышеупомянутой функции SetCscope (). Это устанавливает предварительный путь cscope для получения совпадений, не находясь в каталоге, где "cscope.out":

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif
person saoret.one    schedule 13.06.2011
comment
Как сказал готгенес, вы заново изобрели поиск вверх. См .: h поиск файлов. См. этот плагин для соответствующего примера. - person idbrii; 24.11.2011