it-swarm.com.ru

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

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

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

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

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

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

485
Sasha

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

Добавьте эти строки в 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 - перейти назад от определения

394
Amjith

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

set tags=./tags;/

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

177
uzi

Другой полезный плагин для разработки на 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. Таким образом, я индексирую только те файлы, которые фактически используются проектом.

45
nimrodm

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

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

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

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

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

23
Johan

Я использую ALT-влево и ALT-вправо, чтобы вытолкнуть/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>.

16
strager

Несколько определений с одинаковым именем

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

10
Heikki Naski

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

8
raimue

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

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

6
Walter

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

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

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

5
Mykola Golubyev

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

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

5
Luc Hermitte

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

Я использую 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>
2
Zhenyu Li

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

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