我有一个在庞大的代码库中跨多个文件导航代码的系统,我想改进/修复它目前的缺点:
我的shell预先配置为在我的代码库的根目录下打开 - 让我们称之为Dev /。 在同步/代码构建期间,我有一个脚本,它自动将所有.h和.c文件的相对路径存储在cscope使用的单个文件中(让我们称之为cscope.files)。
一旦我同步,这个文件就会更新 - 然后我可以使用Dev /中的以下命令在vim中打开我想要的任何文件:
vif "part of file name",
其中
vif: aliased to vi `grep !:1 cscope.files`
如果我将文件名的一部分提供足够长的时间来唯一标识它,我可以立即在vim中打开它。
现在,这种方法的缺点是,当我已经打开一个文件,并跳转到另一个文件而不退出vim 时,我能做到的唯一方法是
:!vif *file2*
这会生成一个新shell,然后在那里启动的vim中打开该文件。因此,我无法在两个文件之间切换(使用Ctrl- ^)。我无法想出一个解决方案:
a)让我打开Dev /的任何文件
b)让我在同一个shell中打开vim中的任何其他文件(一旦我打开现有文件),这样2个vim会话就会互相识别(我可以使用Ctrl-^在2之间跳转) )
我知道这是一个很长的问题(如何谷歌这个:)),但我打赌解决方案对于更熟练的vim的人来说简单而明显!
让我知道问题的任何部分是否模糊,我会澄清它......
更新: 在使用快捷方式进行自定义之后,我最终采用了cscope方式(因为在cscope.files上使用'gf'仍然阻止我在两个源文件之间切换)。有关快捷方式,请参阅VIM 7 and cscope: Using "cscope find f" inside a keyboard mapping for switching between files 。
答案 0 :(得分:3)
使用vim的grep:
:map <F1> :vim <pattern> cscope.files<CR>gf
例如,有了这个:
vnoremap <F1> "ry:exe ':1vim /'.@r.'/ cscope.files'<CR>gf
选择(视觉模式)您要搜索的模式,然后按 F1 。将打开与模式匹配的第一个文件,替换当前缓冲区 * 。
*如果可以的话。即如果保存了当前缓冲区或设置了hidden
等等。
如果您希望得到提示,请使用input()
:
nnoremap <F1> :exe ':1vim /'.input("Enter pattern: ").'/ cscope.files'<CR>
[但之后您必须手动gf
,因为input()
会消耗地图的其余字符。为避免这种情况,您可以使用inputsave()
和inputrestore()
]
......比如说:
function! GetPat()
call inputsave()
let mypat = input("Enter pattern: ")
call inputrestore()
return mypat
endfunction
nnoremap <F1> :exe ':1vim /'.GetPat().'/ cscope.files'<CR>gf
答案 1 :(得分:3)
答案 2 :(得分:1)
我自己不使用cscope,但似乎可以用它来查找文件,请参阅:help cscope-find
。
否则,像(未经测试)这样的事情可能会有所帮助:
"Custom function
function! MyFunc(pat)
" Get files list
let filelist = readfile('path/to/cscope.files')
" Filter non matching item out and see if only one item is left
if len(filter(filelist, 'v:var =~? '.a:pat)) == 1
" edit file
exec 'edit '.filelist[0]
else
" Report back
echom 'More than one match:'
for file in filelist
echom file
endfor
endif
endfunction
" Custom command
command! -bar -nargs=1 MyCom call MyFunc(<args>)
答案 3 :(得分:1)
还尝试使用内置的cscope集成:
:cs find f stdio.h
Cscope tag: stdio.h
# line filename / context / line
1 1 /usr/include/stdio.h <<<unknown>>>
2 1 /usr/include/bits/stdio.h <<<unknown>>>
Type number and <Enter> (empty cancels):
请参阅:help cscope-suggestions
了解一些可能更容易在vim中使用cscope的映射。