В прошлый раз, когда я проверял, давным-давно, ctags
был в порядке, но он пропустил некоторые идентификаторы, а cscope
имел более исчерпывающую опцию поиска, но все равно пропустил некоторые идентификаторы.
grep
это то, что я предпочитаю. Это исчерпывающе, но все же довольно быстро, если база исходного кода имеет приемлемый размер или ПК работает быстро. Вы можете вызвать его из vim с помощью :grep
. Вот упрощенная версия моей собственной _vimrc
, чтобы показать, как я ее настроил. Я помещаю комментарии, чтобы объяснить, какие ключи делают.
" for Windows, replace with the location of `grep.exe'
" not needed for Unix/Linux
:set grepprg=c:\prog\cygwin\bin\grep.exe\ -n\ $*\ /dev/null
:function! RecursiveSearchIdentifierUnderCursor()
: sp
: let grep_cmd = "silent grep -r \"\\<" . expand("<cword>") . "\\>\" *"
: exe grep_cmd
:endfunction
" CTRL-backslash to search for the identifier (or "word") under the cursor
"
" an identifier is in the form "xxx_123_yyy" but something in the form
" "xxx_123_yyy.aaa_999" would be two identifiers separated by a period
"
"
" this basically executes:
"
" :grep -r "\<identifier\>" *
"
" for whatever `identifier' the cursor happens to be over
"
"
" to close the newly opened window, use:
"
" :q
"
:map <C-\> :call RecursiveSearchIdentifierUnderCursor()<CR>
" cursor up/down to move to the previous/next search result
:map <Up> :cp<CR>zz
:map <Down> :cn<CR>zz
" jump up/down between horizontally split windows
:map <PageUp> <C-W>k
:map <PageDown> <C-W>j
" move to the previous/next enclosing brace
:map <Left> [{
:map <Right> ]}
" move to the previous/next enclosing parenthesis
:map <Home> [(
:map <End> ])
" move to the previous/next enclosing # preprocessor directive
:map <Insert> [#
:map <Del> ]#
Кроме того, не забудьте *
(SHIFT-8) и #
(SHIFT-3) для поиска вперед и назад текущего идентификатора под курсором в текущем файле. Я нашел их неоценимыми при переходе по коду, особенно при поиске коротких имен переменных, таких как 'i' и 'j', которые в противном случае соответствовали бы частям других имен переменных в слепом поиске в обычном текстовом редакторе.
Вы также можете вызвать :make
из vim
, если хотите использовать make
. Он остановится при первой ошибке компиляции, затем вы сможете отредактировать и снова запустить сборку изнутри vim
.
Как только вы освоитесь с определением своих собственных функций и назначений клавиш, есть множество способов упростить повторяющиеся задачи программирования с помощью vim
.