VIM 7:如何以有效的方式从代码库的根源导航代码源代码树?

时间:2011-03-22 12:43:21

标签: vim

我有一个在庞大的代码库中跨多个文件导航代码的系统,我想改进/修复它目前的缺点:

我的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

4 个答案:

答案 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)

我认为Vim Fuzzy Finder plugin很适合您的用例。

顾名思义,使用插件,您可以使用模糊文本搜索找到文件。

另外,它也适用于其他Vim资源,如缓冲区,标签等。

答案 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的映射。