我正在使用ctags
生成代码并在set tags+=~/.vim/tags/cpp
中添加.vimrc
(仅跟this wiki page}。在我的vimrc
文件中还有设置如下所示我可以自动同步当前文件的nerdtree查看器(参见this):
" returns true iff is NERDTree open/active
function! rc:isNTOpen()
return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction
" returns true iff focused window is NERDTree window
function! rc:isNTFocused()
return -1 != match(expand('%'), 'NERD_Tree')
endfunction
" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
if &modifiable && rc:isNTOpen() && !rc:isNTFocused() && strlen(expand('%')) > 0 && !&diff
NERDTreeFind
wincmd p
endif
endfunction
autocmd BufEnter * call rc:syncTree()
问题在于~/.vim
实际上是另一个文件夹的符号链接(所以我可以轻松地使用git或其他VCS管理我的所有dotfiles)。当我使用 Ctrl + ] 来查找定义(其标签信息位于〜/ .vim / tags / cpp 中)时,会出现永远是错误:
detected while processing function rc:syncTree..<SNR>15_findAndRevealPath..102:
line 2:
E605: Exception not caught: NERDTree.InvalidArgumentsError: /home/hongxuchen/.vim/tags/cpp_src/stl_iterator.h should be under /home/hongxuchen/data_backup/dotfiles/_vim/tags/cpp_src
这是否意味着我必须在set tags+=/real/path/to/cpp
中使用 vimrc
?
答案 0 :(得分:3)
在Vim中,resolve()
函数可以处理符号链接。尝试替换plugin/NERD_tree.vim
function! s:findAndRevealPath()
try
let p = s:Path.New(expand("%:p"))
与
function! s:findAndRevealPath()
try
let p = s:Path.New(resolve(expand("%:p")))
如果有效,我会向该插件的作者发送补丁。
答案 1 :(得分:2)
虽然它不是您问题的严格答案,但我的答案肯定有助于解决您的根本问题。
我在vimrc
的版本控制下有“真正的”~/.vim/vimrc
而~/.vimrc
不是符号链接,因为我讨厌符号链接。相反,~/.vimrc
是一个只有一行的常规文件:
runtime vimrc