mirror of https://github.com/amix/vimrc.git
parent
9a2843c2a5
commit
d7752b59ae
@ -1,6 +0,0 @@ |
||||
[submodule "sources_non_forked/vim-gitgutter"] |
||||
path = sources_non_forked/vim-gitgutter |
||||
url = git://github.com/airblade/vim-gitgutter.git |
||||
[submodule "sources_non_forked/gruvbox"] |
||||
path = sources_non_forked/gruvbox |
||||
url = git@github.com:morhetz/gruvbox.git |
@ -0,0 +1,2 @@ |
||||
tags |
||||
ag-vim.tgz |
@ -0,0 +1,76 @@ |
||||
# ag.vim # |
||||
|
||||
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 rum `:helptags ~/.vim/bundle/ag/doc`. |
||||
|
||||
### Configuration ### |
||||
|
||||
You can specify a custom ag name and path in your .vimrc like so: |
||||
|
||||
let g:agprg="<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 |
||||
|
||||
### 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. |
@ -0,0 +1,3 @@ |
||||
task :tgz do |
||||
sh 'cd ..; tar czvf ag/ag-vim.tgz ag/{plugin,autoload,doc}' |
||||
end |
@ -0,0 +1,216 @@ |
||||
" NOTE: You must, of course, install ag / the_silver_searcher |
||||
|
||||
" FIXME: Delete deprecated options below on or after 15-7 (6 months from when they were changed) {{{ |
||||
|
||||
if exists("g:agprg") |
||||
let g:ag_prg = g:agprg |
||||
endif |
||||
|
||||
if exists("g:aghighlight") |
||||
let g:ag_highlight = g:aghighlight |
||||
endif |
||||
|
||||
if exists("g:agformat") |
||||
let g:ag_format = g:agformat |
||||
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 |
||||
|
||||
" 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 |
||||
echom 'No matches for "'.a:args.'"' |
||||
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 |
@ -0,0 +1,174 @@ |
||||
*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: |
@ -0,0 +1,11 @@ |
||||
" 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>) |