Советы и трюки Vim и Ctags

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

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

EDIT. Какое дополнительное дополнение вы будете использовать в сочетании с Ctags?

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

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

Ответ 1

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 - Возврат из определения

Ответ 2

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

set tags=./tags;/

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

Ответ 3

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

Если у вас есть cscope в каталоге ~/bin/, добавьте следующее в свой .vimrc и используйте g ^], чтобы перейти к вызывающей функции (см. справку 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 - вам нужно сгенерировать (и периодически обновлять) базу данных. Я использую следующие script

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

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

Ответ 4

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

set tags+=/usr/local/share/ctags/qt4

Ответ 6

Я использую ALT-left и ALT-right для pop/push из/в стек тегов.

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 12

Я помещаю следующее в мой файл .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()

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

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

Ответ 13

Я использую vim в macos, а оригинальные ctags не работают хорошо, поэтому я загружаю новейшие и настраиваю make make install 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>

Ответ 14

Я применил функцию поиска 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()

Ответ 15

Еще одна итерация функции 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