mirror of https://github.com/amix/vimrc.git
pull/233/merge
parent
5f990400c2
commit
c4fbfe8aa8
@ -0,0 +1 @@ |
||||
tags |
@ -0,0 +1,89 @@ |
||||
ack.vim is distributed under the same license terms as Vim itself, which you |
||||
can find in full with `:help license` within Vim, or copied in full herein. |
||||
|
||||
Copyright (c) 2007-2015 Antoine Imbert <antoine.imbert+ackvim@gmail.com> |
||||
and contributors. |
||||
|
||||
Maintainers may be contacted via GitHub Issues at: |
||||
|
||||
https://github.com/mileszs/ack.vim/issues |
||||
|
||||
|
||||
VIM LICENSE |
||||
|
||||
I) There are no restrictions on distributing unmodified copies of Vim except |
||||
that they must include this license text. You can also distribute |
||||
unmodified parts of Vim, likewise unrestricted except that they must |
||||
include this license text. You are also allowed to include executables |
||||
that you made from the unmodified Vim sources, plus your own usage |
||||
examples and Vim scripts. |
||||
|
||||
II) It is allowed to distribute a modified (or extended) version of Vim, |
||||
including executables and/or source code, when the following four |
||||
conditions are met: |
||||
1) This license text must be included unmodified. |
||||
2) The modified Vim must be distributed in one of the following five ways: |
||||
a) If you make changes to Vim yourself, you must clearly describe in |
||||
the distribution how to contact you. When the maintainer asks you |
||||
(in any way) for a copy of the modified Vim you distributed, you |
||||
must make your changes, including source code, available to the |
||||
maintainer without fee. The maintainer reserves the right to |
||||
include your changes in the official version of Vim. What the |
||||
maintainer will do with your changes and under what license they |
||||
will be distributed is negotiable. If there has been no negotiation |
||||
then this license, or a later version, also applies to your changes. |
||||
The current maintainer is Bram Moolenaar <Bram@vim.org>. If this |
||||
changes it will be announced in appropriate places (most likely |
||||
vim.sf.net, www.vim.org and/or comp.editors). When it is completely |
||||
impossible to contact the maintainer, the obligation to send him |
||||
your changes ceases. Once the maintainer has confirmed that he has |
||||
received your changes they will not have to be sent again. |
||||
b) If you have received a modified Vim that was distributed as |
||||
mentioned under a) you are allowed to further distribute it |
||||
unmodified, as mentioned at I). If you make additional changes the |
||||
text under a) applies to those changes. |
||||
c) Provide all the changes, including source code, with every copy of |
||||
the modified Vim you distribute. This may be done in the form of a |
||||
context diff. You can choose what license to use for new code you |
||||
add. The changes and their license must not restrict others from |
||||
making their own changes to the official version of Vim. |
||||
d) When you have a modified Vim which includes changes as mentioned |
||||
under c), you can distribute it without the source code for the |
||||
changes if the following three conditions are met: |
||||
- The license that applies to the changes permits you to distribute |
||||
the changes to the Vim maintainer without fee or restriction, and |
||||
permits the Vim maintainer to include the changes in the official |
||||
version of Vim without fee or restriction. |
||||
- You keep the changes for at least three years after last |
||||
distributing the corresponding modified Vim. When the maintainer |
||||
or someone who you distributed the modified Vim to asks you (in |
||||
any way) for the changes within this period, you must make them |
||||
available to him. |
||||
- You clearly describe in the distribution how to contact you. This |
||||
contact information must remain valid for at least three years |
||||
after last distributing the corresponding modified Vim, or as long |
||||
as possible. |
||||
e) When the GNU General Public License (GPL) applies to the changes, |
||||
you can distribute the modified Vim under the GNU GPL version 2 or |
||||
any later version. |
||||
3) A message must be added, at least in the output of the ":version" |
||||
command and in the intro screen, such that the user of the modified Vim |
||||
is able to see that it was modified. When distributing as mentioned |
||||
under 2)e) adding the message is only required for as far as this does |
||||
not conflict with the license used for the changes. |
||||
4) The contact information as required under 2)a) and 2)d) must not be |
||||
removed or changed, except that the person himself can make |
||||
corrections. |
||||
|
||||
III) If you distribute a modified version of Vim, you are encouraged to use |
||||
the Vim license for your changes and make them available to the |
||||
maintainer, including the source code. The preferred way to do this is |
||||
by e-mail or by uploading the files to a server and e-mailing the URL. |
||||
If the number of changes is small (e.g., a modified Makefile) e-mailing a |
||||
context diff will do. The e-mail address to be used is |
||||
<maintainer@vim.org> |
||||
|
||||
IV) It is not allowed to remove this license from the distribution of the Vim |
||||
sources, parts of it or from a modified version. You may use this |
||||
license for previous Vim releases instead of the license that they came |
||||
with, at your option. |
@ -0,0 +1,161 @@ |
||||
# ack.vim |
||||
|
||||
Run your favorite search tool from Vim, with an enhanced results list. |
||||
|
||||
This plugin was designed as a Vim frontend for the Perl module [App::Ack]. Ack |
||||
can be used as a replacement for 99% of the uses of _grep_. The plugin allows |
||||
you to run ack from Vim, and shows the results in a split window. |
||||
|
||||
But here's a little secret for the Vim-seasoned: it's just a light wrapper for |
||||
Vim's [grepprg] and the [quickfix] window for match results. This makes it easy |
||||
to integrate with your own Vim configuration and use existing knowledge of core |
||||
features. It also means the plugin is flexible to use with other search tools. |
||||
|
||||
[App::Ack]: http://search.cpan.org/~petdance/ack/ack |
||||
[grepprg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'grepprg' |
||||
[quickfix]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html#quickfix |
||||
|
||||
## Installation |
||||
|
||||
### Ack |
||||
|
||||
You will need ack (>= 2.0), of course. To install it follow the |
||||
[manual](http://beyondgrep.com/install/). |
||||
|
||||
### The Plugin |
||||
|
||||
It is recommended to use one of the popular plugin managers for Vim. There are |
||||
many and you probably already have a preferred one, but a few examples for your |
||||
copy-and-paste convenience: |
||||
|
||||
#### Pathogen |
||||
|
||||
$ git clone https://github.com/mileszs/ack.vim.git ~/.vim/bundle/ack.vim |
||||
|
||||
#### Vundle |
||||
|
||||
```vim |
||||
Plugin 'mileszs/ack.vim' |
||||
``` |
||||
|
||||
#### NeoBundle |
||||
|
||||
```vim |
||||
NeoBundle 'mileszs/ack.vim' |
||||
``` |
||||
|
||||
#### Manual (not recommended) |
||||
|
||||
[Download][releases] the plugin and extract it in `~/.vim/` (or |
||||
`%PROGRAMFILES%/Vim/vimfiles` on Windows). |
||||
|
||||
[zipball]: https://github.com/mileszs/ack.vim/archive/master.zip |
||||
|
||||
## Usage |
||||
|
||||
:Ack [options] {pattern} [{directories}] |
||||
|
||||
Search recursively in `{directories}` (which defaults to the current directory) |
||||
for the `{pattern}`. |
||||
|
||||
Files containing the search term will be listed in the quickfix window, along |
||||
with the line number of the occurrence, once for each occurrence. `<Enter>` on |
||||
a line in this window will open the file, and place the cursor on the matching |
||||
line. |
||||
|
||||
Just like where you use `:grep`, `:grepadd`, `:lgrep`, and :`lgrepadd`, you can |
||||
use `:Ack`, `:AckAdd`, `:LAck`, and `:LAckAdd` respectively. (See `:help Ack` |
||||
after installing, or [`doc/ack.txt`][doc] in the repo, for more information.) |
||||
|
||||
For more ack help see [ack documentation](http://beyondgrep.com/documentation/). |
||||
|
||||
[doc]: https://github.com/mileszs/ack.vim/blob/master/doc/ack.txt |
||||
|
||||
### Keyboard Shortcuts |
||||
|
||||
The quickfix results window is augmented with these convenience mappings: |
||||
|
||||
? a quick summary of these keys, repeat to close |
||||
o to open (same as Enter) |
||||
O to open and close the quickfix window |
||||
go to preview file, open but maintain focus on ack.vim results |
||||
t to open in new tab |
||||
T to open in new tab without moving to it |
||||
h to open in horizontal split |
||||
H to open in horizontal split, keeping focus on the results |
||||
v to open in vertical split |
||||
gv to open in vertical split, keeping focus on the results |
||||
q to close the quickfix window |
||||
|
||||
### Gotchas |
||||
|
||||
Some characters have special meaning, and need to be escaped in your search |
||||
pattern. For instance, `#`. You need to escape it with `:Ack '\\\#define |
||||
foo'` to search for '#define foo'. See [issue #5]. |
||||
|
||||
[issue #5]: https://github.com/mileszs/ack.vim/issues/5 |
||||
|
||||
## Possibly FAQ |
||||
|
||||
#### Can I use `ag` ([The Silver Searcher]) with this? |
||||
|
||||
Absolutely, and probably other tools if their output is similar or you can |
||||
write a pattern match for it--just set `g:ackprg`. If you like, you can fall |
||||
back to Ack in case you use your vimrc on a system without Ag available: |
||||
|
||||
```vim |
||||
if executable('ag') |
||||
let g:ackprg = 'ag --vimgrep' |
||||
endif |
||||
``` |
||||
|
||||
Since Ack is quite portable you might check a copy of it into your dotfiles |
||||
repository in `~/bin` so you'll nearly always have it available. |
||||
|
||||
#### What's the difference from ag.vim? |
||||
|
||||
Well... not a lot really. |
||||
|
||||
Present maintainer, yours truly, [kind of wishes they never forked][sadface], |
||||
contributes to both, and wouldn't mind seeing them merged again. ag.vim got a |
||||
nice code clean-up (which ack.vim is now hopefully getting), and ack.vim picked |
||||
up a few features that haven't made their way to ag.vim, like `:AckWindow`, |
||||
optional background search execution with [vim-dispatch], and auto-previewing. |
||||
|
||||
#### I don't want to jump to the first result automatically. #### |
||||
|
||||
Use `:Ack!`, with bang. If you want this behavior most of the time, you might |
||||
like an abbreviation or mapping in your personal config, something like these: |
||||
|
||||
```vim |
||||
cnoreabbrev Ack Ack! |
||||
nnoremap <Leader>a :Ack!<Space> |
||||
``` |
||||
|
||||
Most of the `:[L]Ack*` commands support this. Note that this behavior follows |
||||
the convention of Vim's built-in `:grep` and `:make` commands. |
||||
|
||||
[The Silver Searcher]: https://github.com/ggreer/the_silver_searcher |
||||
[sadface]: https://github.com/mileszs/ack.vim/commit/d97090fb502d40229e6976dfec0e06636ba227d5#commitcomment-5771145 |
||||
|
||||
## Changelog |
||||
|
||||
Please see [the Github releases page][releases]. |
||||
|
||||
## Credits |
||||
|
||||
This plugin is derived from Antoine Imbert's blog post [Ack and Vim |
||||
Integration][] (in particular, the function in the update to the post). [Miles |
||||
Sterrett][mileszs] packaged it up as a plugin and documented it in Vim's help |
||||
format, and since then [many contributors][contributors] have submitted |
||||
enhancements and fixes. |
||||
|
||||
And of course, where would we be without [Ack]. And, you know, Vim. |
||||
|
||||
[Ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html |
||||
[mileszs]: https://github.com/mileszs |
||||
[contributors]: https://github.com/mileszs/ack.vim/graphs/contributors |
||||
[Ack]: http://beyondgrep.com/ |
||||
|
||||
[vim-dispatch]: https://github.com/tpope/vim-dispatch |
||||
[releases]: https://github.com/mileszs/ack.vim/releases |
@ -0,0 +1,246 @@ |
||||
if exists('g:autoloaded_ack') || &cp |
||||
finish |
||||
endif |
||||
|
||||
if exists('g:ack_use_dispatch') |
||||
if g:ack_use_dispatch && !exists(':Dispatch') |
||||
call s:Warn('Dispatch not loaded! Falling back to g:ack_use_dispatch = 0.') |
||||
let g:ack_use_dispatch = 0 |
||||
endif |
||||
else |
||||
let g:ack_use_dispatch = 0 |
||||
endif |
||||
|
||||
"----------------------------------------------------------------------------- |
||||
" Public API |
||||
"----------------------------------------------------------------------------- |
||||
|
||||
function! ack#Ack(cmd, args) "{{{ |
||||
call s:Init(a:cmd) |
||||
redraw |
||||
|
||||
" Local values that we'll temporarily set as options when searching |
||||
let l:grepprg = g:ackprg |
||||
let l:grepformat = '%f:%l:%c:%m,%f:%l:%m' " Include column number |
||||
|
||||
" Strip some options that are meaningless for path search and set match |
||||
" format accordingly. |
||||
if s:SearchingFilepaths() |
||||
let l:grepprg = substitute(l:grepprg, '-H\|--column', '', 'g') |
||||
let l:grepformat = '%f' |
||||
endif |
||||
|
||||
" Check user policy for blank searches |
||||
if empty(a:args) |
||||
if !g:ack_use_cword_for_empty_search |
||||
echo "No regular expression found." |
||||
return |
||||
endif |
||||
endif |
||||
|
||||
" If no pattern is provided, search for the word under the cursor |
||||
let l:grepargs = empty(a:args) ? expand("<cword>") : a:args . join(a:000, ' ') |
||||
|
||||
"Bypass search if cursor is on blank string |
||||
if l:grepargs == "" |
||||
echo "No regular expression found." |
||||
return |
||||
endif |
||||
|
||||
" NOTE: we escape special chars, but not everything using shellescape to |
||||
" allow for passing arguments etc |
||||
let l:escaped_args = escape(l:grepargs, '|#%') |
||||
|
||||
echo "Searching ..." |
||||
|
||||
if g:ack_use_dispatch |
||||
call s:SearchWithDispatch(l:grepprg, l:escaped_args, l:grepformat) |
||||
else |
||||
call s:SearchWithGrep(a:cmd, l:grepprg, l:escaped_args, l:grepformat) |
||||
endif |
||||
|
||||
" Dispatch has no callback mechanism currently, we just have to display the |
||||
" list window early and wait for it to populate :-/ |
||||
call ack#ShowResults() |
||||
call s:Highlight(l:grepargs) |
||||
endfunction "}}} |
||||
|
||||
function! ack#AckFromSearch(cmd, args) "{{{ |
||||
let search = getreg('/') |
||||
" translate vim regular expression to perl regular expression. |
||||
let search = substitute(search, '\(\\<\|\\>\)', '\\b', 'g') |
||||
call ack#Ack(a:cmd, '"' . search . '" ' . a:args) |
||||
endfunction "}}} |
||||
|
||||
function! ack#AckHelp(cmd, args) "{{{ |
||||
let args = a:args . ' ' . s:GetDocLocations() |
||||
call ack#Ack(a:cmd, args) |
||||
endfunction "}}} |
||||
|
||||
function! ack#AckWindow(cmd, args) "{{{ |
||||
let files = tabpagebuflist() |
||||
|
||||
" remove duplicated filenames (files appearing in more than one window) |
||||
let files = filter(copy(sort(files)), 'index(files,v:val,v:key+1)==-1') |
||||
call map(files, "bufname(v:val)") |
||||
|
||||
" remove unnamed buffers as quickfix (empty strings before shellescape) |
||||
call filter(files, 'v:val != ""') |
||||
|
||||
" expand to full path (avoid problems with cd/lcd in au QuickFixCmdPre) |
||||
let files = map(files, "shellescape(fnamemodify(v:val, ':p'))") |
||||
let args = a:args . ' ' . join(files) |
||||
|
||||
call ack#Ack(a:cmd, args) |
||||
endfunction "}}} |
||||
|
||||
function! ack#ShowResults() "{{{ |
||||
let l:handler = s:UsingLocList() ? g:ack_lhandler : g:ack_qhandler |
||||
execute l:handler |
||||
call s:ApplyMappings() |
||||
redraw! |
||||
endfunction "}}} |
||||
|
||||
"----------------------------------------------------------------------------- |
||||
" Private API |
||||
"----------------------------------------------------------------------------- |
||||
|
||||
function! s:ApplyMappings() "{{{ |
||||
if !s:UsingListMappings() || &filetype != 'qf' |
||||
return |
||||
endif |
||||
|
||||
let l:wintype = s:UsingLocList() ? 'l' : 'c' |
||||
let l:closemap = ':' . l:wintype . 'close<CR>' |
||||
let g:ack_mappings.q = l:closemap |
||||
|
||||
nnoremap <buffer> <silent> ? :call <SID>QuickHelp()<CR> |
||||
|
||||
if g:ack_autoclose |
||||
" We just map the 'go' and 'gv' mappings to close on autoclose, wtf? |
||||
for key_map in items(g:ack_mappings) |
||||
execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1) . l:closemap) |
||||
endfor |
||||
|
||||
execute "nnoremap <buffer> <silent> <CR> <CR>" . l:closemap |
||||
else |
||||
for key_map in items(g:ack_mappings) |
||||
execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1)) |
||||
endfor |
||||
endif |
||||
|
||||
if exists("g:ackpreview") " if auto preview in on, remap j and k keys |
||||
nnoremap <buffer> <silent> j j<CR><C-W><C-W> |
||||
nnoremap <buffer> <silent> k k<CR><C-W><C-W> |
||||
nmap <buffer> <silent> <Down> j |
||||
nmap <buffer> <silent> <Up> k |
||||
endif |
||||
endfunction "}}} |
||||
|
||||
function! s:GetDocLocations() "{{{ |
||||
let dp = '' |
||||
for p in split(&rtp, ',') |
||||
let p = p . '/doc/' |
||||
if isdirectory(p) |
||||
let dp = p . '*.txt ' . dp |
||||
endif |
||||
endfor |
||||
|
||||
return dp |
||||
endfunction "}}} |
||||
|
||||
function! s:Highlight(args) "{{{ |
||||
if !g:ackhighlight |
||||
return |
||||
endif |
||||
|
||||
let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]") |
||||
call feedkeys(":let &hlsearch=1 \| echo \<CR>", "n") |
||||
endfunction "}}} |
||||
|
||||
" Initialize state for an :Ack* or :LAck* search |
||||
function! s:Init(cmd) "{{{ |
||||
let s:searching_filepaths = (a:cmd =~# '-g$') ? 1 : 0 |
||||
let s:using_loclist = (a:cmd =~# '^l') ? 1 : 0 |
||||
|
||||
if g:ack_use_dispatch && s:using_loclist |
||||
call s:Warn('Dispatch does not support location lists! Proceeding with quickfix...') |
||||
let s:using_loclist = 0 |
||||
endif |
||||
endfunction "}}} |
||||
|
||||
function! s:QuickHelp() "{{{ |
||||
execute 'edit' globpath(&rtp, 'doc/ack_quick_help.txt') |
||||
|
||||
silent normal gg |
||||
setlocal buftype=nofile bufhidden=hide nobuflisted |
||||
setlocal nomodifiable noswapfile |
||||
setlocal filetype=help |
||||
setlocal nonumber norelativenumber nowrap |
||||
setlocal foldmethod=diff foldlevel=20 |
||||
|
||||
nnoremap <buffer> <silent> ? :q!<CR>:call ack#ShowResults()<CR> |
||||
endfunction "}}} |
||||
|
||||
function! s:SearchWithDispatch(grepprg, grepargs, grepformat) "{{{ |
||||
let l:makeprg_bak = &l:makeprg |
||||
let l:errorformat_bak = &l:errorformat |
||||
|
||||
" We don't execute a :grep command for Dispatch, so add -g here instead |
||||
if s:SearchingFilepaths() |
||||
let l:grepprg = a:grepprg . ' -g' |
||||
else |
||||
let l:grepprg = a:grepprg |
||||
endif |
||||
|
||||
try |
||||
let &l:makeprg = l:grepprg . ' ' . a:grepargs |
||||
let &l:errorformat = a:grepformat |
||||
|
||||
Make |
||||
finally |
||||
let &l:makeprg = l:makeprg_bak |
||||
let &l:errorformat = l:errorformat_bak |
||||
endtry |
||||
endfunction "}}} |
||||
|
||||
function! s:SearchWithGrep(grepcmd, grepprg, grepargs, grepformat) "{{{ |
||||
let l:grepprg_bak = &l:grepprg |
||||
let l:grepformat_bak = &grepformat |
||||
|
||||
try |
||||
let &l:grepprg = a:grepprg |
||||
let &grepformat = a:grepformat |
||||
|
||||
silent execute a:grepcmd a:grepargs |
||||
finally |
||||
let &l:grepprg = l:grepprg_bak |
||||
let &grepformat = l:grepformat_bak |
||||
endtry |
||||
endfunction "}}} |
||||
|
||||
" Are we finding matching files, not lines? (the -g option -- :AckFile) |
||||
function! s:SearchingFilepaths() "{{{ |
||||
return get(s:, 'searching_filepaths', 0) |
||||
endfunction "}}} |
||||
|
||||
" Predicate for whether mappings are enabled for list type of current search. |
||||
function! s:UsingListMappings() "{{{ |
||||
if s:UsingLocList() |
||||
return g:ack_apply_lmappings |
||||
else |
||||
return g:ack_apply_qmappings |
||||
endif |
||||
endfunction "}}} |
||||
|
||||
" Were we invoked with a :LAck command? |
||||
function! s:UsingLocList() "{{{ |
||||
return get(s:, 'using_loclist', 0) |
||||
endfunction "}}} |
||||
|
||||
function! s:Warn(msg) "{{{ |
||||
echohl WarningMsg | echomsg 'Ack: ' . a:msg | echohl None |
||||
endf "}}} |
||||
|
||||
let g:autoloaded_ack = 1 |
||||
" vim:set et sw=2 ts=2 tw=78 fdm=marker |
@ -0,0 +1,315 @@ |
||||
*ack.txt* Plugin that integrates ack with Vim |
||||
|
||||
============================================================================== |
||||
Author: Antoine Imbert <antoine.imbert+ackvim@gmail.com> *ack-author* |
||||
License: Same terms as Vim itself (see |license|) |
||||
|
||||
This plugin is only available if 'compatible' is not set. |
||||
|
||||
{Vi does not have any of this} |
||||
|
||||
============================================================================== |
||||
INTRODUCTION *ack* |
||||
|
||||
This plugin is a front for the Perl module App::Ack. Ack can be used as a |
||||
replacement for grep. This plugin will allow you to run ack from vim, and |
||||
shows the results in a split window. |
||||
|
||||
:Ack[!] [options] {pattern} [{directory}] *:Ack* |
||||
|
||||
Search recursively in {directory} (which defaults to the current |
||||
directory) for the {pattern}. Behaves just like the |:grep| command, but |
||||
will open the |Quickfix| window for you. If [!] is not given the first |
||||
occurrence is jumped to. |
||||
|
||||
:AckAdd [options] {pattern} [{directory}] *:AckAdd* |
||||
|
||||
Just like |:Ack|, but instead of making a new list, the matches are |
||||
appended to the current |quickfix| list. |
||||
|
||||
:AckFromSearch [{directory}] *:AckFromSearch* |
||||
|
||||
Just like |:Ack| but the pattern is from previous search. |
||||
|
||||
:LAck [options] {pattern} [{directory}] *:LAck* |
||||
|
||||
Just like |:Ack| but instead of the |quickfix| list, matches are placed in |
||||
the current |location-list|. |
||||
|
||||
:LAckAdd [options] {pattern} [{directory}] *:LAckAdd* |
||||
|
||||
Just like |:AckAdd| but instead of the |quickfix| list, matches are added |
||||
to the current |location-list| |
||||
|
||||
:AckFile [options] {pattern} [{directory}] *:AckFile* |
||||
|
||||
Search recursively in {directory} (which defaults to the current |
||||
directory) for filenames matching the {pattern}. Behaves just like the |
||||
|:grep| command, but will open the |Quickfix| window for you. |
||||
|
||||
:AckHelp[!] [options] {pattern} *:AckHelp* |
||||
|
||||
Search vim documentation files for the {pattern}. Behaves just like the |
||||
|:Ack| command, but searches only vim documentation .txt files |
||||
|
||||
:LAckHelp [options] {pattern} *:LAckHelp* |
||||
|
||||
Just like |:AckHelp| but instead of the |quickfix| list, matches are placed |
||||
in the current |location-list|. |
||||
|
||||
:AckWindow[!] [options] {pattern} *:AckWindow* |
||||
|
||||
Search all buffers visible in the screen (current tab page only) files for |
||||
the {pattern}. |
||||
|
||||
:LAckWindow [options] {pattern} *:LAckWindow* |
||||
|
||||
Just like |:AckWindow| but instead of the |quickfix| list, matches are |
||||
placed in the current |location-list|. |
||||
|
||||
Files containing the search term will be listed in the split window, along |
||||
with the line number of the occurrence, once for each occurrence. <Enter> on |
||||
a line in this window will open the file, and place the cursor on the matching |
||||
line. |
||||
|
||||
Note that if you are using Dispatch.vim with |g:ack_use_dispatch|, location |
||||
lists are not supported, because Dispatch does not support them at this time. |
||||
`:LAck` versions of commands above will give a warning and proceed to use the |
||||
quickfix list instead. |
||||
|
||||
See http://beyondgrep.com/ for more information on searching with ack. |
||||
|
||||
|
||||
============================================================================== |
||||
CONFIGURATION *ack-configuration* |
||||
|
||||
*g:ackprg* |
||||
g:ackprg |
||||
Default for ubuntu: "ack-grep" |
||||
Default for other systems: "ack" |
||||
|
||||
Use this option to specify the search command and its default arguments. |
||||
|
||||
Example: |
||||
> |
||||
let g:ackprg = "ag --vimgrep" |
||||
< |
||||
*g:ack_default_options* |
||||
g:ack_default_options |
||||
Default: " -s -H --nocolor --nogroup --column" |
||||
|
||||
Use this option to specify the default arguments given to `ack`. This is only |
||||
used if |g:ackprg| has not been customized from the default--if you are using |
||||
a custom search program instead of Ack, set your preferred options in |
||||
|g:ackprg|. |
||||
|
||||
NOTE: This option may be deprecated in the future. ~ |
||||
|
||||
Example: |
||||
> |
||||
let g:ack_default_options = |
||||
\ " -s -H --nocolor --nogroup --column --smart-case --follow" |
||||
< |
||||
*g:ack_apply_qmappings* |
||||
g:ack_apply_qmappings |
||||
Default: 1 |
||||
|
||||
This option enables mappings on the |quickfix| window. |
||||
|
||||
*g:ack_apply_lmappings* |
||||
g:ack_apply_lmappings |
||||
Default: 1 |
||||
|
||||
This option enables mappings on |location-list| windows. |
||||
|
||||
*g:ack_mappings* |
||||
g:ack_mappings |
||||
Default: { |
||||
\ "t": "<C-W><CR><C-W>T", |
||||
\ "T": "<C-W><CR><C-W>TgT<C-W>j", |
||||
\ "o": "<CR>", |
||||
\ "O": "<CR><C-W><C-W>:ccl<CR>", |
||||
\ "go": "<CR><C-W>j", |
||||
\ "h": "<C-W><CR><C-W>K", |
||||
\ "H": "<C-W><CR><C-W>K<C-W>b", |
||||
\ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", |
||||
\ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } |
||||
|
||||
This option list all maps create on quickfix/Location list window. |
||||
|
||||
Example, if you want to open the result in the middle of the screen: |
||||
> |
||||
let g:ack_mappings = { "o": "<CR>zz" } |
||||
< |
||||
*g:ack_qhandler* |
||||
g:ack_qhandler |
||||
Default: "botright copen" |
||||
|
||||
Command to open the quickview window. |
||||
|
||||
If you want to open a quickview window with 30 lines you can do: |
||||
> |
||||
let g:ack_qhandler = "botright copen 30" |
||||
< |
||||
*g:ack_lhandler* |
||||
g:ack_lhandler |
||||
Default: "botright lopen" |
||||
|
||||
Command to open the Location list window. |
||||
|
||||
If you want to open a Location list window with 30 lines you can do: |
||||
> |
||||
let g:ack_lhandler = "botright lopen 30" |
||||
< |
||||
*g:ackhighlight* |
||||
g:ackhighlight |
||||
Default: 0 |
||||
|
||||
Use this option to highlight the searched term. |
||||
|
||||
Example: |
||||
> |
||||
let g:ackhighlight = 1 |
||||
< |
||||
*g:ack_autoclose* |
||||
g:ack_autoclose |
||||
Default: 0 |
||||
|
||||
Use this option to specify whether to close the quickfix window after |
||||
using any of the shortcuts. |
||||
|
||||
Example: |
||||
> |
||||
let g:ack_autoclose = 1 |
||||
< |
||||
*g:ack_autofold_results* |
||||
g:ack_autofold_results |
||||
Default: 0 |
||||
|
||||
Use this option to fold the results in quickfix by file name. Only the current |
||||
fold will be open by default and while you press 'j' and 'k' to move between the |
||||
results if you hit other fold the last one will be closed and the current will |
||||
be open. |
||||
|
||||
Example: |
||||
> |
||||
let g:ack_autofold_results = 1 |
||||
< |
||||
*g:ackpreview* |
||||
g:ackpreview |
||||
Default: 0 |
||||
|
||||
Use this option to automagically open the file with 'j' or 'k'. |
||||
|
||||
Example: |
||||
> |
||||
let g:ackpreview = 1 |
||||
< |
||||
*g:ack_use_dispatch* |
||||
g:ack_use_dispatch |
||||
Default: 0 |
||||
|
||||
Use this option to use vim-dispatch to run searches in the background, with a |
||||
variety of execution backends for different systems. |
||||
|
||||
Due to limitations in Dispatch at this time, location lists are unsupported |
||||
and result windows will appear before results are ready. Still, these may be |
||||
acceptable tradeoffs for very large projects where searches are slow. |
||||
|
||||
Example: |
||||
> |
||||
let g:ack_use_dispatch = 1 |
||||
< |
||||
*g:ack_use_cword_for_empty_search* |
||||
g:ack_use_cword_for_empty_search |
||||
Default: 1 |
||||
|
||||
Use this option to enable blank searches to run against the word under the |
||||
cursor. When this option is not set, blank searches will only output an error |
||||
message. |
||||
|
||||
Example: |
||||
> |
||||
let g:ack_use_cword_for_empty_search = 0 |
||||
< |
||||
============================================================================== |
||||
MAPPINGS *ack-mappings* |
||||
|
||||
The following keyboard shortcuts are available in the |quickfix| and |
||||
|location-list| windows: |
||||
|
||||
? display a quick summary of these mappings. |
||||
|
||||
o open file (same as Enter). |
||||
|
||||
O open file and close the quickfix window. |
||||
|
||||
go preview file (open but maintain focus on ack.vim results). |
||||
|
||||
t open in a new tab. |
||||
|
||||
T open in new tab without moving to it. |
||||
|
||||
h open in horizontal split. |
||||
|
||||
H open in horizontal split, keeping focus on the results. |
||||
|
||||
v open in vertical split. |
||||
|
||||
gv open in vertical split, keeping focus on the results. |
||||
|
||||
q close the quickfix window. |
||||
|
||||
To adjust these, see |g:ack_mappings|. |
||||
|
||||
============================================================================== |
||||
Ignoring files *ack-ignore* |
||||
|
||||
If you're using this plugin with ag, The Silver Searcher, bear in mind that: |
||||
|
||||
- It ignores file patterns from your .gitignore and .hgignore. |
||||
|
||||
- If there are other files in your source repository you don't wish to |
||||
search, you can add their patterns to an .agignore file. |
||||
|
||||
============================================================================== |
||||
ISSUES AND FAQ *ack-issues-and-faq* |
||||
|
||||
I don't want to jump to the first result automatically.~ |
||||
|
||||
Use `:Ack!`, with bang. If you want this behavior most of the time, you |
||||
might like an abbreviation or mapping in your personal config, something |
||||
like these: |
||||
> |
||||
cnoreabbrev Ack Ack! |
||||
nnoremap <Leader>a :Ack!<Space> |
||||
< |
||||
Most of the `:[L]Ack*` commands support this. Note that this behavior |
||||
follows the convention of Vim's built-in |:grep| and |:make| commands. |
||||
|
||||
I use NERDTree and opening ack.vim results in a vertical split displacing it.~ |
||||
|
||||
You are probably using NERDTree with its default alignment at the left |
||||
side of the window. Set these custom mappings in your vimrc to work around |
||||
this: |
||||
> |
||||
let g:ack_mappings = { |
||||
\ 'v': '<C-W><CR><C-W>L<C-W>p<C-W>J<C-W>p', |
||||
\ 'gv': '<C-W><CR><C-W>L<C-W>p<C-W>J' } |
||||
< |
||||
This solution will be improved in the future. |
||||
|
||||
Results show a mix of relative and absolute paths, making them hard to read.~ |
||||
|
||||
This is a quirk of Vim that can happen with plain |:vimgrep| too. You can |
||||
try this in your vimrc to work around it: |
||||
> |
||||
autocmd BufAdd * exe "cd" fnameescape(getcwd()) |
||||
< |
||||
but for some users this may be disruptive to their Vim workflow. For more |
||||
details, see: |
||||
|
||||
http://vi.stackexchange.com/a/4816/7174 |
||||
https://github.com/mileszs/ack.vim/issues/143 |
||||
|
||||
vim:set et sw=4 ts=4 tw=78: |
@ -0,0 +1,15 @@ |
||||
==== ack.vim quick help =============== |
||||
|
||||
*?:* a quick summary of these keys, repeat to close |
||||
*o:* to open (same as Enter) |
||||
*O:* to open and close the quickfix window |
||||
*go:* to preview file, open but maintain focus on ack.vim results |
||||
*t:* to open in new tab |
||||
*T:* to open in new tab without moving to it |
||||
*h:* to open in horizontal split |
||||
*H:* to open in horizontal split, keeping focus on the results |
||||
*v:* to open in vertical split |
||||
*gv:* to open in vertical split, keeping focus on the results |
||||
*q:* to close the quickfix window |
||||
|
||||
======================================== |
@ -0,0 +1,9 @@ |
||||
if exists("g:ack_autofold_results") && g:ack_autofold_results |
||||
setlocal foldlevel=0 |
||||
setlocal foldmethod=expr |
||||
setlocal foldexpr=matchstr(getline(v:lnum),'^[^\|]\\+')==#matchstr(getline(v:lnum+1),'^[^\|]\\+')?1:'<1' |
||||
setlocal foldenable |
||||
setlocal foldclose=all |
||||
setlocal foldopen=all |
||||
nnoremap <buffer> j jzz |
||||
endif |
@ -0,0 +1,83 @@ |
||||
if exists('g:loaded_ack') || &cp |
||||
finish |
||||
endif |
||||
|
||||
if !exists("g:ack_default_options") |
||||
let g:ack_default_options = " -s -H --nopager --nocolor --nogroup --column" |
||||
endif |
||||
|
||||
" Location of the ack utility |
||||
if !exists("g:ackprg") |
||||
if executable('ack-grep') |
||||
let g:ackprg = "ack-grep" |
||||
elseif executable('ack') |
||||
let g:ackprg = "ack" |
||||
else |
||||
finish |
||||
endif |
||||
let g:ackprg .= g:ack_default_options |
||||
endif |
||||
|
||||
if !exists("g:ack_apply_qmappings") |
||||
let g:ack_apply_qmappings = !exists("g:ack_qhandler") |
||||
endif |
||||
|
||||
if !exists("g:ack_apply_lmappings") |
||||
let g:ack_apply_lmappings = !exists("g:ack_lhandler") |
||||
endif |
||||
|
||||
let s:ack_mappings = { |
||||
\ "t": "<C-W><CR><C-W>T", |
||||
\ "T": "<C-W><CR><C-W>TgT<C-W>j", |
||||
\ "o": "<CR>", |
||||
\ "O": "<CR><C-W>p<C-W>c", |
||||
\ "go": "<CR><C-W>p", |
||||
\ "h": "<C-W><CR><C-W>K", |
||||
\ "H": "<C-W><CR><C-W>K<C-W>b", |
||||
\ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", |
||||
\ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } |
||||
|
||||
if exists("g:ack_mappings") |
||||
let g:ack_mappings = extend(s:ack_mappings, g:ack_mappings) |
||||
else |
||||
let g:ack_mappings = s:ack_mappings |
||||
endif |
||||
|
||||
if !exists("g:ack_qhandler") |
||||
let g:ack_qhandler = "botright copen" |
||||
endif |
||||
|
||||
if !exists("g:ack_lhandler") |
||||
let g:ack_lhandler = "botright lopen" |
||||
endif |
||||
|
||||
if !exists("g:ackhighlight") |
||||
let g:ackhighlight = 0 |
||||
endif |
||||
|
||||
if !exists("g:ack_autoclose") |
||||
let g:ack_autoclose = 0 |
||||
endif |
||||
|
||||
if !exists("g:ack_autofold_results") |
||||
let g:ack_autofold_results = 0 |
||||
endif |
||||
|
||||
if !exists("g:ack_use_cword_for_empty_search") |
||||
let g:ack_use_cword_for_empty_search = 1 |
||||
endif |
||||
|
||||
command! -bang -nargs=* -complete=file Ack call ack#Ack('grep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file AckAdd call ack#Ack('grepadd<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file AckFromSearch call ack#AckFromSearch('grep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file LAck call ack#Ack('lgrep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file LAckAdd call ack#Ack('lgrepadd<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file AckFile call ack#Ack('grep<bang> -g', <q-args>) |
||||
command! -bang -nargs=* -complete=help AckHelp call ack#AckHelp('grep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=help LAckHelp call ack#AckHelp('lgrep<bang>', <q-args>) |
||||
command! -bang -nargs=* AckWindow call ack#AckWindow('grep<bang>', <q-args>) |
||||
command! -bang -nargs=* LAckWindow call ack#AckWindow('lgrep<bang>', <q-args>) |
||||
|
||||
let g:loaded_ack = 1 |
||||
|
||||
" vim:set et sw=2 ts=2 tw=78 fdm=marker |
@ -1,2 +0,0 @@ |
||||
tags |
||||
ag-vim.tgz |
@ -1,81 +0,0 @@ |
||||
# ag.vim # |
||||
|
||||
## Deprecated: See [this comment](https://github.com/rking/ag.vim/issues/124#issuecomment-227038003) for more info. Maybe try [ack.vim](https://github.com/mileszs/ack.vim#can-i-use-ag-the-silver-searcher-with-this) as an alternative. ## |
||||
|
||||
This plugin is a front for ag, A.K.A. |
||||
[the_silver_searcher](https://github.com/ggreer/the_silver_searcher). Ag can |
||||
be used as a replacement for 153% of the uses of `ack`. This plugin will allow |
||||
you to run ag from vim, and shows the results in a split window. |
||||
|
||||
## Installation ## |
||||
|
||||
See [the_silver_searcher's README](https://github.com/ggreer/the_silver_searcher#installing) for its installation instructions (if you haven't installed it already). |
||||
|
||||
You have to first install [ag](https://github.com/ggreer/the_silver_searcher), itself. On Mac+Homebrew, Gentoo Linux, several others, there's package named `the_silver_searcher`, but if your OS/distro don't have one, the GitHub repo installs fine: |
||||
|
||||
Vim has various ways of installing plugins, the standard way is in [the documentation](http://vimdoc.sourceforge.net/htmldoc/usr_05.html#plugin), but most people use a plugin to manage their plugins. If you don't already have a preferred plugin manager plugin, why not try one of the following? |
||||
- [vim-plug](https://github.com/junegunn/vim-plug#readme) |
||||
- [vim-pathogen](https://github.com/tpope/vim-pathogen#readme) |
||||
- [Vundle.vim](https://github.com/gmarik/Vundle.vim#readme) |
||||
- Or, if you don't use any sort of Vim plugin management: |
||||
|
||||
```sh |
||||
cd ~/.vim/bundle && git clone https://github.com/rking/ag.vim ag && echo "set runtimepath^=~/.vim/bundle/ag" >> ~/.vimrc |
||||
``` |
||||
|
||||
Then open vim and run `:helptags ~/.vim/bundle/ag/doc`. |
||||
|
||||
### Configuration ### |
||||
|
||||
You can specify a custom ag name and path in your .vimrc like so: |
||||
|
||||
let g:ag_prg="<custom-ag-path-goes-here> --vimgrep" |
||||
|
||||
You can configure ag.vim to always start searching from your project root |
||||
instead of the cwd |
||||
|
||||
let g:ag_working_path_mode="r" |
||||
|
||||
## Usage ## |
||||
|
||||
:Ag [options] {pattern} [{directory}] |
||||
|
||||
Search recursively in {directory} (which defaults to the current directory) for the {pattern}. |
||||
|
||||
Files containing the search term will be listed in the split window, along with |
||||
the line number of the occurrence, once for each occurrence. [Enter] on a line |
||||
in this window will open the file, and place the cursor on the matching line. |
||||
|
||||
Just like where you use :grep, :grepadd, :lgrep, and :lgrepadd, you can use `:Ag`, `:AgAdd`, `:LAg`, and `:LAgAdd` respectively. (See `doc/ag.txt`, or install and `:h Ag` for more information.) |
||||
|
||||
### Gotchas ### |
||||
|
||||
Some characters have special meaning, and need to be escaped your search pattern. For instance, '#'. You have to escape it like this `:Ag '\\\#define foo'` to search for `#define foo`. (From [blueyed in issue #5](https://github.com/mileszs/ack.vim/issues/5).) |
||||
|
||||
Sometimes `git grep` is even faster, though in my experience it's not noticeably so. |
||||
|
||||
### Keyboard Shortcuts ### |
||||
|
||||
In the quickfix window, you can use: |
||||
|
||||
e to open file and close the quickfix window |
||||
o to open (same as enter) |
||||
go to preview file (open but maintain focus on ag.vim results) |
||||
t to open in new tab |
||||
T to open in new tab silently |
||||
h to open in horizontal split |
||||
H to open in horizontal split silently |
||||
v to open in vertical split |
||||
gv to open in vertical split silently |
||||
q to close the quickfix window |
||||
|
||||
### Related Plugin ### |
||||
[vim-ag-anything](https://github.com/Chun-Yang/vim-ag-anything) adds an 'ga' action to search any text object. |
||||
|
||||
### Acknowledgements ### |
||||
|
||||
This Vim plugin is derived (and by derived, I mean copied, almost entirely) |
||||
from [milesz's ack.vim](https://github.com/mileszs/ack.vim), which I also |
||||
recommend installing since you might be in a situation where you have ack but |
||||
not ag, and don't want to stop to install ag. Also, ack supports `--type`, and |
||||
a few other features. |
@ -1,3 +0,0 @@ |
||||
task :tgz do |
||||
sh 'cd ..; tar czvf ag/ag-vim.tgz ag/{plugin,autoload,doc}' |
||||
end |
@ -1,234 +0,0 @@ |
||||
" NOTE: You must, of course, install ag / the_silver_searcher |
||||
|
||||
" FIXME: Delete deprecated options below on or after 2016-4 (6 months from when the deprecation warning was added) {{{ |
||||
|
||||
if exists("g:agprg") |
||||
let g:ag_prg = g:agprg |
||||
echohl WarningMsg |
||||
call input('g:agprg is deprecated and will be removed. Please use g:ag_prg') |
||||
echohl None |
||||
endif |
||||
|
||||
if exists("g:aghighlight") |
||||
let g:ag_highlight = g:aghighlight |
||||
echohl WarningMsg |
||||
call input('g:aghighlight is deprecated and will be removed. Please use g:ag_highlight') |
||||
echohl None |
||||
endif |
||||
|
||||
if exists("g:agformat") |
||||
let g:ag_format = g:agformat |
||||
echohl WarningMsg |
||||
call input('g:agformat is deprecated and will be removed. Please use g:ag_format') |
||||
echohl None |
||||
endif |
||||
|
||||
" }}} FIXME: Delete the deprecated options above on or after 15-7 (6 months from when they were changed) |
||||
|
||||
" Location of the ag utility |
||||
if !exists("g:ag_prg") |
||||
" --vimgrep (consistent output we can parse) is available from version 0.25.0+ |
||||
if split(system("ag --version"), "[ \n\r\t]")[2] =~ '\d\+.\(\(2[5-9]\)\|\([3-9][0-9]\)\)\(.\d\+\)\?' |
||||
let g:ag_prg="ag --vimgrep" |
||||
else |
||||
" --noheading seems odd here, but see https://github.com/ggreer/the_silver_searcher/issues/361 |
||||
let g:ag_prg="ag --column --nogroup --noheading" |
||||
endif |
||||
endif |
||||
|
||||
if !exists("g:ag_apply_qmappings") |
||||
let g:ag_apply_qmappings=1 |
||||
endif |
||||
|
||||
if !exists("g:ag_apply_lmappings") |
||||
let g:ag_apply_lmappings=1 |
||||
endif |
||||
|
||||
if !exists("g:ag_qhandler") |
||||
let g:ag_qhandler="botright copen" |
||||
endif |
||||
|
||||
if !exists("g:ag_lhandler") |
||||
let g:ag_lhandler="botright lopen" |
||||
endif |
||||
|
||||
if !exists("g:ag_mapping_message") |
||||
let g:ag_mapping_message=1 |
||||
endif |
||||
|
||||
if !exists("g:ag_working_path_mode") |
||||
let g:ag_working_path_mode = 'c' |
||||
endif |
||||
|
||||
function! ag#AgBuffer(cmd, args) |
||||
let l:bufs = filter(range(1, bufnr('$')), 'buflisted(v:val)') |
||||
let l:files = [] |
||||
for buf in l:bufs |
||||
let l:file = fnamemodify(bufname(buf), ':p') |
||||
if !isdirectory(l:file) |
||||
call add(l:files, l:file) |
||||
endif |
||||
endfor |
||||
call ag#Ag(a:cmd, a:args . ' ' . join(l:files, ' ')) |
||||
endfunction |
||||
|
||||
function! ag#Ag(cmd, args) |
||||
let l:ag_executable = get(split(g:ag_prg, " "), 0) |
||||
|
||||
" Ensure that `ag` is installed |
||||
if !executable(l:ag_executable) |
||||
echoe "Ag command '" . l:ag_executable . "' was not found. Is the silver searcher installed and on your $PATH?" |
||||
return |
||||
endif |
||||
|
||||
" If no pattern is provided, search for the word under the cursor |
||||
if empty(a:args) |
||||
let l:grepargs = expand("<cword>") |
||||
else |
||||
let l:grepargs = a:args . join(a:000, ' ') |
||||
end |
||||
|
||||
if empty(l:grepargs) |
||||
echo "Usage: ':Ag {pattern}' (or just :Ag to search for the word under the cursor). See ':help :Ag' for more information." |
||||
return |
||||
endif |
||||
|
||||
" Format, used to manage column jump |
||||
if a:cmd =~# '-g$' |
||||
let s:ag_format_backup=g:ag_format |
||||
let g:ag_format="%f" |
||||
elseif exists("s:ag_format_backup") |
||||
let g:ag_format=s:ag_format_backup |
||||
elseif !exists("g:ag_format") |
||||
let g:ag_format="%f:%l:%c:%m" |
||||
endif |
||||
|
||||
let l:grepprg_bak=&grepprg |
||||
let l:grepformat_bak=&grepformat |
||||
let l:t_ti_bak=&t_ti |
||||
let l:t_te_bak=&t_te |
||||
try |
||||
let &grepprg=g:ag_prg |
||||
let &grepformat=g:ag_format |
||||
set t_ti= |
||||
set t_te= |
||||
if g:ag_working_path_mode ==? 'r' " Try to find the projectroot for current buffer |
||||
let l:cwd_back = getcwd() |
||||
let l:cwd = s:guessProjectRoot() |
||||
try |
||||
exe "lcd ".l:cwd |
||||
catch |
||||
echom 'Failed to change directory to:'.l:cwd |
||||
finally |
||||
silent! execute a:cmd . " " . escape(l:grepargs, '|') |
||||
exe "lcd ".l:cwd_back |
||||
endtry |
||||
else " Someone chose an undefined value or 'c' so we revert to the default |
||||
silent! execute a:cmd . " " . escape(l:grepargs, '|') |
||||
endif |
||||
finally |
||||
let &grepprg=l:grepprg_bak |
||||
let &grepformat=l:grepformat_bak |
||||
let &t_ti=l:t_ti_bak |
||||
let &t_te=l:t_te_bak |
||||
endtry |
||||
|
||||
if a:cmd =~# '^l' |
||||
let l:match_count = len(getloclist(winnr())) |
||||
else |
||||
let l:match_count = len(getqflist()) |
||||
endif |
||||
|
||||
if a:cmd =~# '^l' && l:match_count |
||||
exe g:ag_lhandler |
||||
let l:apply_mappings = g:ag_apply_lmappings |
||||
let l:matches_window_prefix = 'l' " we're using the location list |
||||
elseif l:match_count |
||||
exe g:ag_qhandler |
||||
let l:apply_mappings = g:ag_apply_qmappings |
||||
let l:matches_window_prefix = 'c' " we're using the quickfix window |
||||
endif |
||||
|
||||
" If highlighting is on, highlight the search keyword. |
||||
if exists('g:ag_highlight') |
||||
let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]") |
||||
call feedkeys(":let &hlsearch=1 \| echo \<CR>", 'n') |
||||
end |
||||
|
||||
redraw! |
||||
|
||||
if l:match_count |
||||
if l:apply_mappings |
||||
nnoremap <silent> <buffer> h <C-W><CR><C-w>K |
||||
nnoremap <silent> <buffer> H <C-W><CR><C-w>K<C-w>b |
||||
nnoremap <silent> <buffer> o <CR> |
||||
nnoremap <silent> <buffer> t <C-w><CR><C-w>T |
||||
nnoremap <silent> <buffer> T <C-w><CR><C-w>TgT<C-W><C-W> |
||||
nnoremap <silent> <buffer> v <C-w><CR><C-w>H<C-W>b<C-W>J<C-W>t |
||||
|
||||
exe 'nnoremap <silent> <buffer> e <CR><C-w><C-w>:' . l:matches_window_prefix .'close<CR>' |
||||
exe 'nnoremap <silent> <buffer> go <CR>:' . l:matches_window_prefix . 'open<CR>' |
||||
exe 'nnoremap <silent> <buffer> q :' . l:matches_window_prefix . 'close<CR>' |
||||
|
||||
exe 'nnoremap <silent> <buffer> gv :let b:height=winheight(0)<CR><C-w><CR><C-w>H:' . l:matches_window_prefix . 'open<CR><C-w>J:exe printf(":normal %d\<lt>c-w>_", b:height)<CR>' |
||||
" Interpretation: |
||||
" :let b:height=winheight(0)<CR> Get the height of the quickfix/location list window |
||||
" <CR><C-w> Open the current item in a new split |
||||
" <C-w>H Slam the newly opened window against the left edge |
||||
" :copen<CR> -or- :lopen<CR> Open either the quickfix window or the location list (whichever we were using) |
||||
" <C-w>J Slam the quickfix/location list window against the bottom edge |
||||
" :exe printf(":normal %d\<lt>c-w>_", b:height)<CR> Restore the quickfix/location list window's height from before we opened the match |
||||
|
||||
if g:ag_mapping_message && l:apply_mappings |
||||
echom "ag.vim keys: q=quit <cr>/e/t/h/v=enter/edit/tab/split/vsplit go/T/H/gv=preview versions of same" |
||||
endif |
||||
endif |
||||
else " Close the split window automatically: |
||||
cclose |
||||
lclose |
||||
echohl WarningMsg |
||||
echom 'No matches for "'.a:args.'"' |
||||
echohl None |
||||
endif |
||||
endfunction |
||||
|
||||
function! ag#AgFromSearch(cmd, args) |
||||
let search = getreg('/') |
||||
" translate vim regular expression to perl regular expression. |
||||
let search = substitute(search,'\(\\<\|\\>\)','\\b','g') |
||||
call ag#Ag(a:cmd, '"' . search .'" '. a:args) |
||||
endfunction |
||||
|
||||
function! ag#GetDocLocations() |
||||
let dp = '' |
||||
for p in split(&runtimepath,',') |
||||
let p = p.'doc/' |
||||
if isdirectory(p) |
||||
let dp = p.'*.txt '.dp |
||||
endif |
||||
endfor |
||||
return dp |
||||
endfunction |
||||
|
||||
function! ag#AgHelp(cmd,args) |
||||
let args = a:args.' '.ag#GetDocLocations() |
||||
call ag#Ag(a:cmd,args) |
||||
endfunction |
||||
|
||||
function! s:guessProjectRoot() |
||||
let l:splitsearchdir = split(getcwd(), "/") |
||||
|
||||
while len(l:splitsearchdir) > 2 |
||||
let l:searchdir = '/'.join(l:splitsearchdir, '/').'/' |
||||
for l:marker in ['.rootdir', '.git', '.hg', '.svn', 'bzr', '_darcs', 'build.xml'] |
||||
" found it! Return the dir |
||||
if filereadable(l:searchdir.l:marker) || isdirectory(l:searchdir.l:marker) |
||||
return l:searchdir |
||||
endif |
||||
endfor |
||||
let l:splitsearchdir = l:splitsearchdir[0:-2] " Splice the list to get rid of the tail directory |
||||
endwhile |
||||
|
||||
" Nothing found, fallback to current working dir |
||||
return getcwd() |
||||
endfunction |
@ -1,174 +0,0 @@ |
||||
*ag.txt* Plugin that integrates ag with Vim |
||||
|
||||
============================================================================== |
||||
INTRODUCTION *ag* |
||||
|
||||
This plugin is a front for the_silver_searcher: ag. Ag can be used as a |
||||
replacement for ack. This plugin will allow you to run ag from vim, and shows |
||||
the results in a split window. |
||||
|
||||
:Ag[!] [options] {pattern} [{directory}] *:Ag* |
||||
|
||||
Search recursively in {directory} (which defaults to the current |
||||
directory) for the {pattern}. Behaves just like the |:grep| command, but |
||||
will open the |Quickfix| window for you. If [!] is not given the first |
||||
error is jumped to. |
||||
|
||||
:AgBuffer[!] [options] {pattern} *:AgBuffer* |
||||
|
||||
Search for {pattern} in all open buffers. Behaves just like the |:grep| |
||||
command, but will open the |Quickfix| window for you. If [!] is not given |
||||
the first error is jumped to. |
||||
|
||||
Note: this will not find changes in modified buffers, since ag can only |
||||
find what is on disk! You can save buffers automatically when searching |
||||
with the 'autowrite' option. A buffer will be ignored if it is a directory |
||||
(an explorer, like netrw). |
||||
|
||||
:AgAdd [options] {pattern} [{directory}] *:AgAdd* |
||||
|
||||
Just like |:Ag|, but instead of making a new list, the matches are |
||||
appended to the current |quickfix| list. |
||||
|
||||
:AgFromSearch [{directory}] *:AgFromSearch* |
||||
|
||||
Just like |:Ag| but the pattern is from previous search. |
||||
|
||||
:LAg [options] {pattern} [{directory}] *:LAg* |
||||
|
||||
Just like |:Ag| but instead of the |quickfix| list, matches are placed in |
||||
the current |location-list|. |
||||
|
||||
:LAgBuffer [options] {pattern} *:LAgBuffer* |
||||
|
||||
Just like |:AgBuffer| but instead of the |quickfix| list, matches are |
||||
placed in the current |location-list|. |
||||
|
||||
:LAgAdd [options] {pattern} [{directory}] *:LAgAdd* |
||||
|
||||
Just like |:AgAdd| but instead of the |quickfix| list, matches are added |
||||
to the current |location-list| |
||||
|
||||
:AgFile [options] {pattern} [{directory}] *:AgFile* |
||||
|
||||
Search recursively in {directory} (which defaults to the current |
||||
directory) for filenames matching the {pattern}. Behaves just like the |
||||
|:grep| command, but will open the |Quickfix| window for you. |
||||
|
||||
:AgHelp[!] [options] {pattern} *:AgHelp* |
||||
|
||||
Search vim documentation files for the {pattern}. Behaves just like the |
||||
|:Ag| command, but searches only vim documentation .txt files |
||||
|
||||
:LAgHelp [options] {pattern} *:LAgHelp* |
||||
|
||||
Just like |:AgHelp| but instead of the |quickfix| list, matches are placed |
||||
in the current |location-list|. |
||||
|
||||
Files containing the search term will be listed in the split window, along |
||||
with the line number of the occurrence, once for each occurrence. <Enter> on a |
||||
line in this window will open the file, and place the cursor on the matching |
||||
line. |
||||
|
||||
See http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/ for |
||||
more information. |
||||
|
||||
============================================================================== |
||||
OPTIONS *ag-options* |
||||
|
||||
*g:ag_prg* |
||||
The location of the Ag program, and any options you want passed to it before |
||||
searching. Default: "ag --vimgrep" (for parsable output). Example: > |
||||
let g:ag_prg="ag --vimgrep --smart-case" |
||||
< |
||||
Note: the `--vimgrep` option was added in Ag 0.25.0. If ag.vim detects that |
||||
you're using a lower version, the following default will be used instead: > |
||||
let g:ag_prg="ag --column --nogroup --noheading" |
||||
< |
||||
This works around inconsistent behaviors in earlier Ag versions, but it is |
||||
recommended that you upgrade if possible for a better experience. `--vimgrep` |
||||
supports multiple matches on the same line of text, for example. |
||||
|
||||
For background, see: https://github.com/rking/ag.vim/pull/88 |
||||
|
||||
*g:ag_working_path_mode* |
||||
A mapping that describes where ag will be run. Default is the current working |
||||
directory. Specifying 'r' as the argument will tell it to run from the project |
||||
rootdirectory. For now any other mapping will result to the default. |
||||
Example: |
||||
let g:ag_working_path_mode='r' |
||||
|
||||
*g:ag_highlight* |
||||
If 1, highlight the search terms after searching. Default: 0. Example: > |
||||
let g:ag_highlight=1 |
||||
< |
||||
|
||||
*g:ag_format* |
||||
Format to recognize the matches. See 'errorformat' for more info. Default: |
||||
"%f" when searching for files, "%f:%l:%c:%m" if not otherwise set. For |
||||
example, if your `g:ag_prg` is set to just "ag" (no column numbers in the |
||||
output, so when you jump to a match your cursor will be on the start of the |
||||
line): > |
||||
let g:ag_format="%f:%l:%m" |
||||
< |
||||
|
||||
*g:ag_apply_lmappings* |
||||
Whether or not to add custom mappings to location list windows opened by this |
||||
plugin. Only applies if you're using the location list. Default 1. Example: > |
||||
let g:ag_apply_lmappings=0 |
||||
< |
||||
|
||||
*g:ag_apply_qmappings* |
||||
Whether or not to add custom mappings to quickfix windows opened by this |
||||
plugin. Only applies if you're using the error list. Default 1. Example: > |
||||
let g:ag_apply_qmappings=0 |
||||
< |
||||
|
||||
*g:ag_lhandler* |
||||
A custom command used to open the location list after it's populated. |
||||
Default: "botright lopen". You might want to set this to change where the |
||||
location list is opened, or what size it is. Example: > |
||||
let g:ag_lhandler="topleft lopen" |
||||
< |
||||
|
||||
*g:ag_qhandler* |
||||
A custom command used to open the error list after it's populated. Default: |
||||
"botright copen". You might want to set this to change where the quickfix |
||||
window is opened, or what size it is. Example: > |
||||
let g:ag_qhandler="copen 20" |
||||
< |
||||
|
||||
*g:ag_mapping_message* |
||||
Whether or not to show the message explaining the extra mappings that are |
||||
added to the results list this plugin populates. This message is not shown if |
||||
the mappings are not applied (see |g:ag_apply_qmappings| and |
||||
|g:ag_apply_lmappings| for more info. Default 1. Example: > |
||||
let g:ag_mapping_message=0 |
||||
< |
||||
|
||||
============================================================================== |
||||
MAPPINGS *ag-mappings* |
||||
|
||||
The following keyboard shortcuts are available in the quickfix window: |
||||
|
||||
e open file and close the quickfix window. |
||||
|
||||
o open file (same as enter). |
||||
|
||||
go preview file (open but maintain focus on ag.vim results). |
||||
|
||||
t open in a new tab. |
||||
|
||||
T open in new tab silently. |
||||
|
||||
h open in horizontal split. |
||||
|
||||
H open in horizontal split silently. |
||||
|
||||
v open in vertical split. |
||||
|
||||
gv open in vertical split silently. |
||||
|
||||
q close the quickfix window. |
||||
|
||||
vim:tw=78:fo=tcq2:ft=help:norl: |
@ -1,11 +0,0 @@ |
||||
" NOTE: You must, of course, install ag / the_silver_searcher |
||||
command! -bang -nargs=* -complete=file Ag call ag#Ag('grep<bang>',<q-args>) |
||||
command! -bang -nargs=* -complete=file AgBuffer call ag#AgBuffer('grep<bang>',<q-args>) |
||||
command! -bang -nargs=* -complete=file AgAdd call ag#Ag('grepadd<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file AgFromSearch call ag#AgFromSearch('grep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file LAg call ag#Ag('lgrep<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file LAgBuffer call ag#AgBuffer('lgrep<bang>',<q-args>) |
||||
command! -bang -nargs=* -complete=file LAgAdd call ag#Ag('lgrepadd<bang>', <q-args>) |
||||
command! -bang -nargs=* -complete=file AgFile call ag#Ag('grep<bang> -g', <q-args>) |
||||
command! -bang -nargs=* -complete=help AgHelp call ag#AgHelp('grep<bang>',<q-args>) |
||||
command! -bang -nargs=* -complete=help LAgHelp call ag#AgHelp('lgrep<bang>',<q-args>) |