Советы и трюки 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
Ответ 5
Все вышеперечисленное и...
code_complete: полный параметр функции, фрагменты кода и многое другое.
taglist.vim: Браузер исходного кода (поддерживает C/С++, java, perl, python, tcl, sql, php и т.д.)
Ответ 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, я уже ответил там: я использую свой собственный пакет и несколько других плагинов.
Ответ 11
Я уже два года адаптирую свои плагины vim для поддержки достаточно большого проекта С++. Вы можете взглянуть на них.
Они используют ctags и cscsope.
http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507
Ответ 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