diff options
| author | Robert Günzler <r@gnzler.io> | 2020-01-26 17:16:07 +0100 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2020-01-26 18:00:59 +0100 |
| commit | f5d56602df70950de6b7d40966b00c9939c81763 (patch) | |
| tree | b50ffeb5496fe3525cc1bab2629389ced95435b7 /.vim/autoload/fuzz.vim | |
Intial commit of v2
See https://drewdevault.com/2019/12/30/dotfiles.html
Diffstat (limited to '')
| -rw-r--r-- | .vim/autoload/fuzz.vim | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/.vim/autoload/fuzz.vim b/.vim/autoload/fuzz.vim new file mode 100644 index 0000000..39d02f1 --- /dev/null +++ b/.vim/autoload/fuzz.vim @@ -0,0 +1,140 @@ +function! s:prompt(str) + return a:str . g:fuzz_prompt . ' ' +endfunction + +function! s:fuzz(name, opts) + " call skim#run(skim#wrap(a:name, a:opts, 0)) + call fzf#run(fzf#wrap(a:name, a:opts, 0)) +endfunction + +function! s:strip(str) + return substitute(a:str, '^\s*\|\s*$', '', 'g') +endfunction + +function! s:open(cmd, target) + if stridx('edit', a:cmd) == 0 && fnamemodify(a:target, ':p') ==# expand('%:p') + return + endif + execute a:cmd fnameescape(a:target) +endfunction + + +" rg {{{ +function s:map_rg_output(line) + let parts = split(a:line, ':') + return {'filename': &acd ? fnamemodify(parts[0], ':p') : parts[0], 'lnum': parts[1], 'text': join(parts[2:], ':')} +endfunction + +function s:rg_handler(lines) + if len(a:lines) < 1 + return + endif + let first = map(filter(a:lines, 'len(v:val)'), 's:map_rg_output(v:val)')[0] + call s:open('edit', first.filename) + execute first.lnum + normal! zz +endfunction + +function s:rg(prompt, ...) + if !executable('rg') + echoerr 'rg not found' + return + endif + if len(a:000) < 1 || len(a:000[0]) < 1 + echoerr 'no arguments' + return + endif + + call s:fuzz(!empty(a:prompt) ? tolower(a:prompt) : 'rg', { + \ 'source': 'rg --line-number --no-heading --color=always --smart-case '.join(a:000[0], ' '), + \ 'sink*': function('s:rg_handler'), + \ 'options': ['--prompt', s:prompt(!empty(a:prompt) ? a:prompt : 'Rg'), + \ '--ansi', '--multi'] + \ }) +endfunction + +function! fuzz#rg(args) abort + call s:rg('', a:args) +endfunction +" }}} + +" files {{{ +function! fuzz#files() abort + call s:fuzz('files', { + \ 'options': ['--prompt', s:prompt('Fs')] + \ }) +endfunction +" }}} + +" buffers {{{ +function! s:buffers_list() + function! s:buflisted() + return filter(range(1, bufnr('$')), 'buflisted(v:val) && getbufvar(v:val, "&filetype") != "qf"') + endfunction + + function! s:format_buffer(b) + let name = bufname(a:b) + let name = empty(name) ? '[No Name]' : fnamemodify(name, ":p:~:.") + let flag = a:b == bufnr('') ? '%' : + \ (a:b == bufnr('#') ? '#' : ' ') + let modified = getbufvar(a:b, '&modified') ? ' [+]' : '' + let readonly = getbufvar(a:b, '&modifiable') ? '' : ' [RO]' + let extra = join(filter([modified, readonly], '!empty(v:val)'), '') + return s:strip(printf("[%s] %s\t%s\t%s", a:b, flag, name, extra)) + endfunction + + return map(sort(s:buflisted()), 's:format_buffer(v:val)') +endfunction + +function! s:buffers_handler(lines) + if len(a:lines) < 1 + return + endif + let b = matchstr(a:lines[0], '\[\zs[0-9]*\ze\]') + execute 'buffer' b +endfunction + +function! fuzz#buffers() abort + call s:fuzz('buffers', { + \ 'source': s:buffers_list(), + \ 'sink*': function('s:buffers_handler'), + \ 'options': ['--prompt', s:prompt('Buf')] + \ }) +endfunction +" }}} + +" commands {{{ +function! s:command_handler(lines) + if len(a:lines) < 1 + return + endif + call feedkeys(':'.a:lines[0]) +endfunction + +function! fuzz#commands() abort + call s:fuzz('commands', { + \ 'source': sort(getcompletion('', 'command')), + \ 'sink*': function('s:command_handler'), + \ 'options': ['--prompt', s:prompt('Cmd')] + \ }) +endfunction +" }}} + +function! fuzz#cmdoptions(...) abort + let opts = sort(['files', 'buffers', 'commands', 'rg']) + return join(opts, "\n") +endfunction + +function! fuzz#exec(cmd, ...) abort + if a:cmd == 'files' + call fuzz#files() + elseif a:cmd == 'buffers' + call fuzz#buffers() + elseif a:cmd == 'commands' + call fuzz#commands() + elseif a:cmd == 'rg' + call fuzz#rg(a:000) + else + echoerr 'Unknown command ' . a:cmd + endif +endfunction |