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

默认情况下,使用Vim/Ack搜索整个项目,vim,ack,Vim,Ack,默认情况下,我想使用Ack(或者类似的插件,如果其他东西可以完成这项工作的话)在Vim中搜索我的整个项目,而不仅仅是当前目录。理想情况下,我最终会使用一个类似于在Sublime中使用Cmd+Shift+F的过程。我该怎么做 像CtrlP的让g:CtrlP\u working\u path\u mode='r'这样的选项可以让它在最近的父目录中搜索,该目录包含一个类似.git的文件。()我认为Ack(或grep/vimgrep)无法检测到您的“项目根目录”。如果您经常处理多个项目,可以在vimrc

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


像CtrlP的
让g:CtrlP\u working\u path\u mode='r'
这样的选项可以让它在最近的父目录中搜索,该目录包含一个类似
.git
的文件。()

我认为
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"
cnoreabbrev ack cd ~/your-project <bar> Ack! <Space>
还定义一些函数/命令,如
AckA
AckB
AckC
。。。 基本上,func/命令只执行以下操作:

exec 'Ack! '. pattern . " " . g:projectA_path
模式是您传入的参数。然后,在将来,你可以做:

:AckA foo

用于在projectA中快速翻页/备份

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

我想这正是您想要的。例如:

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

大多数情况下,我不需要cd项目根目录,而是保持在同一个工作目录中。 因此,有一个更简单的解决方案,基于Kent的答案,无需cd’ing项目根目录、安装其他插件和使用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()
g:ackprg='ag--vimgrep--smart case'
功能!查找\u git\u root()
返回系统('git rev parse--show toplevel 2>/dev/null')[:-2]
端功能
命令-nargs=1 Ag执行“确认!”。查找\u git\u root()

要使用它,请调用
:Ag
我的
中有这一行。vimrc

let g:projectA_path="/path/to/A"
let g:projectB_path="/path/to/B"
let g:projectC_path="/path/to/C"
cnoreabbrev ack cd ~/your-project <bar> Ack! <Space>
cnoreabrevack cd~/您的项目确认!

每当您键入
:ack
并点击空格时,其余内容将添加到命令行,您可以添加关键字。

通常,您的项目目录就是您的工作目录。如果不是这样的话,你可能做了一些错误的事情,比如…从
$HOME
启动Vim并从那里打开文件。谢谢你-我正在使用MacVim,它在$HOME中打开,然后使用NERDTree从那里导航到我的项目-这能解释吗?另一方面,当我打开一个文件时,它似乎只在该文件的直接父目录中进行搜索。如果没有指向
.vimrc
的链接,就很难再进一步了,但它闻起来像是一个NERDTree选项或
autochdir
。要摆脱尾随行结尾,您还可以通过管道连接到
tr-d'\\n'