summary refs log tree commit diff
path: root/.vim/autoload/fuzz.vim
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2020-01-26 17:16:07 +0100
committerRobert Günzler <r@gnzler.io>2020-01-26 18:00:59 +0100
commitf5d56602df70950de6b7d40966b00c9939c81763 (patch)
treeb50ffeb5496fe3525cc1bab2629389ced95435b7 /.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.vim140
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