我刚刚在我的Vim(或更确切地说是gVim)中安装了Ctags(以帮助C ++开发),并且想找出自己喜欢的命令,宏,快捷方式以及与之配套的技巧...
分享您最好的武器库。您会为Vim开发上的C ++建议其他哪些Vim插件?
编辑您还将与Ctags一起使用的其他附加组件吗?
EDIT2与标签一起使用的gVim是哪个版本?这有什么不同吗?
EDIT3如何提高大型和小型项目的编程经验?
closed as not constructive
差不多两年前,但对我来说却如此具有建设性
我刚刚在我的Vim(或更确切地说是gVim)中安装了Ctags(以帮助C ++开发),并且想找出自己喜欢的命令,宏,快捷方式以及与之配套的技巧...
分享您最好的武器库。您会为Vim开发上的C ++建议其他哪些Vim插件?
编辑您还将与Ctags一起使用的其他附加组件吗?
EDIT2与标签一起使用的gVim是哪个版本?这有什么不同吗?
EDIT3如何提高大型和小型项目的编程经验?
closed as not constructive
差不多两年前,但对我来说却如此具有建设性
Answers:
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
-从定义跳回
Ctrl-w C-]
您可以C-w T
(也称为Shift-t)将其拆分为一个新选项卡。
g C-]
非常有用 它打开一个快速对话框,以在多个定义中选择一个。
g]
也很有用 您可以将光标放在标签名称上,然后按g]
以获得匹配标签的列表。
我的.vimrc中总是存在以下一行:
set tags=./tags;/
这将在当前目录中查找“标签”,并使树朝根工作直到找到一个。IOW,您可以在源代码树中的任何位置,而不仅仅是其根目录。
cscope
吗?
Cscope的另一个有用的插件是cscope就像Ctags可以跳转到定义一样,Cscope可以跳转到调用函数。
如果〜/ bin /目录中有cscope,请将以下内容添加到.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”是另一个脚本,它从Makefile中提取C和头文件的列表。这样,我仅索引项目实际使用的文件。
以上所有...
code_complete:功能参数完成,代码段等。
taglist.vim:源代码浏览器(支持C / C ++,java,perl,python,tcl,sql,php等)
我使用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>
代替。
同名的几个定义
<C-w>g<C-]>
打开拆分中的定义,但也可以执行:tjump
定义中的定义,或者如果有多个定义,则为您提供可供选择的定义列表。
:ptag
在预览窗口中打开定义的命令。
:h CursorHold-example
可配置的超时后,该标签在预览窗口中的光标下方显示该项目的标签。
:help
是真棒有时......看到:help CTRL-W_g}
和:ptjump
我最常用的命令是C-],它会跳转到光标下的函数定义。您可以更频繁地使用它来接听更多电话。之后,Co将带您回到一个新的高度,Ci会再次变得更深。
我一直在修改我的vim插件以支持足够大的c ++项目。您可以看看它们。
他们使用ctags和cscsope。
http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507
我将以下内容放在我的.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 -
我在macOS中使用vim,原始的ctags不能正常工作,因此我下载了最新的并配置make make install。我在/ usr / local / bin / ctags中安装了ctgas(以保持原始状态)
"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>
我修改了上面的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()
上面的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