【问题标题】:Search whole project by default with Vim/Ack默认使用 Vim/Ack 搜索整个项目
【发布时间】:2013-10-15 09:49:25
【问题描述】:

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

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

【问题讨论】:

  • 通常,您的项目目录您的工作目录。如果不是这种情况,你可能做错了……从$HOME 启动 Vim 并从那里打开文件。
  • 谢谢 - 我正在使用 MacVim,它在 $HOME 中打开,然后使用 NERDTree 从那里导航到我的项目 - 这可以解释吗?另一方面,当我打开一个文件时,它似乎只在该文件的直接父目录中搜索。
  • 导航到您的项目并从那里打开 MacVim,这就是它的全部内容。如果没有指向您的 .vimrc 的链接,很难走得更远,但它闻起来像 NERDTree 选项或 autochdir

标签: vim ack


【解决方案1】:

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

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

【讨论】:

    【解决方案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/command 就可以了:

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

    pattern 是您传入的参数。那么,将来您可以这样做:

    :AckA foo
    

    :call AckA("foo")
    

    用于在 projectA 中快速 grepping/acking。

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

    【讨论】:

      【解决方案3】:

      大多数时候我不需要 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()
      

      并使用它调用:Ag &lt;keyword&gt;

      【讨论】:

      【解决方案4】:

      我的.vimrc 中有这一行:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-15
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多