سؤال

I would like to use Ack (or similar plugin if something else can do the job) to search my whole project in Vim by default, rather than just the current directory. Ideally I'd end up with a process that works like using Cmd+Shift+F in Sublime. How can I do this?

An option like CtrlP's let g:ctrlp_working_path_mode = 'r' that makes it search within the nearest parent directory that contains a file like .git would be perfect. (https://github.com/kien/ctrlp.vim#basic-options)

هل كانت مفيدة؟

المحلول 2

I don't think Ack (or grep/vimgrep) can detect your "project root". If you often work on several projects, you could add this block in your vimrc:

let g:projectA_path="/path/to/A"
let g:projectB_path="/path/to/B"
let g:projectC_path="/path/to/C"

also define some functions/commands, like AckA, AckB, AckC... basically the func/command just does:

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

the pattern is the argument you passed in. then, in future, you could do:

:AckA foo

or

:call AckA("foo")

for quick grepping/acking in projectA.

I didn't think of a simpler way to do it. glad to see if there is better solution.

نصائح أخرى

I think Rooter is what you want. For example:

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

Most of the time I don't need to cd the project root, but stay in the same working directory. So there is a simpler solution, based on answer of Kent, without cd'ing the project root, installing additional plugins and using 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()

And to use it call :Ag <keyword>

I have this line in my .vimrc:

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

Whenever you type :ack and hit the space the rest will be added to the command line and you can add the keyword.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top