默认情况下使用Vim / Ack搜索整个项目

时间:2013-10-15 09:49:25

标签: vim ack

我想使用Ack(或类似的插件,如果其他东西可以完成这项工作)默认情况下在Vim中搜索我的整个项目,而不仅仅是当前目录。理想情况下,我最终会得到一个像在Sublime中使用Cmd + Shift + F一样的过程。我怎么能这样做?

像CtrlP let g:ctrlp_working_path_mode = 'r'这样的选项让它在包含像.git这样的文件的最近的父目录中进行搜索将是完美的。 (https://github.com/kien/ctrlp.vim#basic-options

4 个答案:

答案 0 :(得分:3)

我认为Rooter就是你想要的。例如:

let g:rooter_patterns = ['Rakefile', '.git/']

答案 1 :(得分:2)

我认为Ack(或grep / vimgrep)无法检测到您的“项目根目录”。如果您经常处理多个项目,可以在vimrc

中添加此块
let g:projectA_path="/path/to/A"
let g:projectB_path="/path/to/B"
let g:projectC_path="/path/to/C"

还定义了一些函数/命令,例如AckAAckBAckC ... 基本上func /命令就是这样:

exec 'Ack! '. pattern . " " . g:projectA_path

pattern是你传入的参数。然后,将来你可以这样做:

:AckA foo

:call AckA("foo")

用于projectA中的快速grepping / acking。

我没想到更简单的方法。很高兴看到是否有更好的解决方案。

答案 2 :(得分:1)

大多数时候,我不需要cd项目根目录,而是保留在相同的工作目录中。 因此,有一个更简单的解决方案,基于Kent的答案,而无需CD项目的根目录,安装其他插件并使用AG:

let g:ackprg = 'ag --vimgrep --smart-case'

function! Find_git_root()
  return system('git rev-parse --show-toplevel 2> /dev/null')[:-2]
endfunction

command! -nargs=1 Ag execute "Ack! <args> " . Find_git_root()

要使用它,请致电:Ag <keyword>

答案 3 :(得分:0)

我的.vimrc中有这行:

cnoreabbrev ack cd ~/your-project <bar> Ack! <Space>

每当您键入:ack并点击空格时,其余的都会添加到命令行中,并且您可以添加关键字。