Update 2024-08-18 20:19 OpenBSD/amd64-x13
This commit is contained in:
parent
223d3fa4cf
commit
47cf6e96c5
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2021 Nabendu Maiti
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -1,78 +0,0 @@
|
|||||||
# fzf_cscope.vim
|
|
||||||
|
|
||||||
CSCOPE settings for vim using popup and preview window
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This file contains settings for vim's cscope interface to fzf (can use vim* >8 advanced popup feature), " plus some keyboard mappings that I've found useful.
|
|
||||||
|
|
||||||
### Prerequisites :
|
|
||||||
|
|
||||||
1. cscope -- install using 'sudo apt install cscope' on ubuntu
|
|
||||||
2. https://github.com/junegunn/fzf
|
|
||||||
3. https://github.com/junegunn/fzf.vim
|
|
||||||
|
|
||||||
### Installation:
|
|
||||||
|
|
||||||
Install fzf & fzf.vim before installing fzf_csope.vim and using it
|
|
||||||
|
|
||||||
`Using` [pathogen.vim](https://github.com/tpope/vim-pathogen), and then simply copy and paste:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
mkdir -p ~/.vim/bundle
|
|
||||||
cd ~/.vim/bundle
|
|
||||||
git clone https://github.com/nmaiti/fzf_cscope.vim.git
|
|
||||||
```
|
|
||||||
|
|
||||||
using [vim Plug](https://github.com/junegunn/vim-plug) add following in your ~/.vimrc
|
|
||||||
|
|
||||||
```sh
|
|
||||||
Plug 'nmaiti/fzf_cscope.vim'
|
|
||||||
```
|
|
||||||
|
|
||||||
### **key mappings**
|
|
||||||
|
|
||||||
Search options -
|
|
||||||
```sh
|
|
||||||
's' symbol: find all references to the token under cursor.
|
|
||||||
'g' global: find global definition(s) of the token under cursor
|
|
||||||
'c' calls: find all calls to the function name under cursor.
|
|
||||||
't' text: find all instances of the text under cursor.
|
|
||||||
'e' egrep: egrep search for the word under cursor.
|
|
||||||
'f' file: open the filename under cursor.
|
|
||||||
'i' includes: find files that include the filename under cursor.
|
|
||||||
'd' called: find functions that function under cursor calls.
|
|
||||||
'a' Assigned: Assigned to this symbol.
|
|
||||||
```
|
|
||||||
|
|
||||||
```shell
|
|
||||||
<Leader>k<search option key> ------- search word/file under the current cursor
|
|
||||||
e.g.sc
|
|
||||||
<Leader>kc - find callers of current keyword/symbol
|
|
||||||
```
|
|
||||||
|
|
||||||
// Interactive cscope search
|
|
||||||
|
|
||||||
```sh
|
|
||||||
<Leader><Leader>k<search option key> ------- search something
|
|
||||||
e.g.
|
|
||||||
<Leader><Leader>ks - find symbol
|
|
||||||
```
|
|
||||||
|
|
||||||
**NOTE**:
|
|
||||||
|
|
||||||
1. These key maps use multiple keystrokes (2 or 3 keys). If you find that vim
|
|
||||||
" keeps timing you out before you can complete them, try changing your timeout
|
|
||||||
" settings, as explained below
|
|
||||||
2. cscope_map.vim can also be used independently with it's own key mappings. If not csope_maps.vim is not present fzf_cscope.vim can use csope_maps.vim's keyboard shortcuts for convenience of programmers.
|
|
||||||
In that case instead of '<Leader>k', '<Ctrl - \>' can be used.
|
|
||||||
|
|
||||||
**Self promotion**:
|
|
||||||
|
|
||||||
Try [zsh_vim config](https://github.com/nmaiti/zsh-vim-config/tree/to_plug) to_plug branch for latest vim features and plugins
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
|||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" CSCOPE settings for vim using popup and preview window
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
"
|
|
||||||
" This file contains fzf shortcut for vim's cscope interface,
|
|
||||||
" with keyboard mappings.
|
|
||||||
" Prerequiites
|
|
||||||
" USAGE:
|
|
||||||
" -- vim 6: Stick this file in your ~/.vim/plugin directory (or in a
|
|
||||||
" 'plugin' directory in some other directory that is in your
|
|
||||||
" 'runtimepath'.
|
|
||||||
"
|
|
||||||
" NOTE:
|
|
||||||
" These key maps use multiple keystrokes (2 or 3 keys). If you find that vim
|
|
||||||
" keeps timing you out before you can complete them, try changing your timeout
|
|
||||||
" settings, as explained below.
|
|
||||||
"
|
|
||||||
" Happy cscoping,
|
|
||||||
"
|
|
||||||
" Nabendu Maiti nbmaiti83@gmail.com 2021/3/14
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
function! Cscope(option, query, fullscreen)
|
|
||||||
let color = '{ x = $1; $1 = ""; z = $3; $3 = ""; p = $2; $2 = ""; printf "\033[35m%s\033[0m:\033[32m%s\033[0m:\033[33;1m%s\033[0m:\033[34m%s\033[0m\n", x,z,p,$0;}'
|
|
||||||
let command_fmt = "cscope -dL -%s %s %s %s '"
|
|
||||||
|
|
||||||
let initial_command = printf(command_fmt, a:option, shellescape(a:query)," | awk '", color)
|
|
||||||
let reload_command = printf(command_fmt, a:option, '{q}', " | awk '", color)
|
|
||||||
let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]}
|
|
||||||
call fzf#vim#grep(initial_command, 0, fzf#vim#with_preview(spec), a:fullscreen)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! CscopeQuery(option)
|
|
||||||
call inputsave()
|
|
||||||
if a:option == '0'
|
|
||||||
let query = input('C Symbol: ')
|
|
||||||
elseif a:option == '1'
|
|
||||||
let query = input('Definition: ')
|
|
||||||
elseif a:option == '2'
|
|
||||||
let query = input('Functions calling: ')
|
|
||||||
elseif a:option == '3'
|
|
||||||
let query = input('Functions called by: ')
|
|
||||||
elseif a:option == '4'
|
|
||||||
let query = input('Text: ')
|
|
||||||
elseif a:option == '6'
|
|
||||||
let query = input('Egrep: ')
|
|
||||||
elseif a:option == '7'
|
|
||||||
let query = input('File: ')
|
|
||||||
elseif a:option == '8'
|
|
||||||
let query = input('Files #including: ')
|
|
||||||
elseif a:option == '9'
|
|
||||||
let query = input('Assignments to: ')
|
|
||||||
else
|
|
||||||
echo "Invalid option!"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
call inputrestore()
|
|
||||||
if query != ""
|
|
||||||
call Cscope(a:option, query , 0)
|
|
||||||
else
|
|
||||||
echom "Cancelled Search!"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if mapcheck('<C-\>g') == ""
|
|
||||||
"'s' symbol: find all references to the token under cursor
|
|
||||||
"'g' global: find global definition(s) of the token under cursor
|
|
||||||
"'c' calls: find all calls to the function name under cursor
|
|
||||||
"'t' text: find all instances of the text under cursor
|
|
||||||
"'e' egrep: egrep search for the word under cursor
|
|
||||||
"'f' file: open the filename under cursor
|
|
||||||
"'i' includes: find files that include the filename under cursor
|
|
||||||
"'d' called: find functions that function under cursor calls
|
|
||||||
"'a' Assigned: Assigned to this symbol
|
|
||||||
|
|
||||||
nnoremap <C-\>s :call Cscope('0', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>g :call Cscope('1', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>d :call Cscope('2', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>c :call Cscope('3', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>t :call Cscope('4', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>e :call Cscope('6', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <C-\>f :call Cscope('7', expand('<cfile>'), 0)<CR>
|
|
||||||
nnoremap <C-\>i :call Cscope('8', expand('<cfile>'), 0)<CR>
|
|
||||||
nnoremap <C-\>a :call Cscope('9', expand('<cword>'), 0)<CR>
|
|
||||||
|
|
||||||
nnoremap <C-\><C-\>s :call CscopeQuery('0')<CR>
|
|
||||||
nnoremap <C-\><C-\>g :call CscopeQuery('1')<CR>
|
|
||||||
nnoremap <C-\><C-\>d :call CscopeQuery('2')<CR>
|
|
||||||
nnoremap <C-\><C-\>c :call CscopeQuery('3')<CR>
|
|
||||||
nnoremap <C-\><C-\>t :call CscopeQuery('4')<CR>
|
|
||||||
nnoremap <C-\><C-\>e :call CscopeQuery('6')<CR>
|
|
||||||
nnoremap <C-\><C-\>f :call CscopeQuery('7')<CR>
|
|
||||||
nnoremap <C-\><C-\>i :call CscopeQuery('8')<CR>
|
|
||||||
nnoremap <C-\><C-\>a :call CscopeQuery('9')<CR>
|
|
||||||
endif
|
|
||||||
|
|
||||||
" default and permanent key apping
|
|
||||||
nnoremap <silent> <Leader>ks :call Cscope('0', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>kg :call Cscope('1', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>kd :call Cscope('2', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>kc :call Cscope('3', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>kt :call Cscope('4', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>ke :call Cscope('6', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>kf :call Cscope('7', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>ki :call Cscope('8', expand('<cword>'), 0)<CR>
|
|
||||||
nnoremap <silent> <Leader>ka :call Cscope('9', expand('<cword>'), 0)<CR>
|
|
||||||
|
|
||||||
nnoremap <silent> <Leader><Leader>ks :call CscopeQuery('0')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>kg :call CscopeQuery('1')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>kd :call CscopeQuery('2')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>kc :call CscopeQuery('3')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>kt :call CscopeQuery('4')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>ke :call CscopeQuery('6')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>kf :call CscopeQuery('7')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>ki :call CscopeQuery('8')<CR>
|
|
||||||
nnoremap <silent> <Leader><Leader>ka :call CscopeQuery('9')<CR>
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 184 KiB |
@ -1,66 +0,0 @@
|
|||||||
fzf-tags
|
|
||||||
========
|
|
||||||
|
|
||||||
`fzf-tags` bridges the gap between tags and fzf.vim.
|
|
||||||
|
|
||||||
It combines `:tag` and `:tselect` into a single improved command.
|
|
||||||
|
|
||||||
`:FZFTags` looks up the identifier under the cursor.
|
|
||||||
- If there are 0 or 1 definitions, the behavior is same as `:tag`.
|
|
||||||
- When there are multiple definitions, the results are piped to fzf for
|
|
||||||
interactive filtering (https://github.com/junegunn/fzf#search-syntax).
|
|
||||||
|
|
||||||
`:FZFTselect` behaves just like `:tselect`.
|
|
||||||
- Loads the tags matching the argument into an FZF window.
|
|
||||||
- If no argument is provided, the last tag on the tag-stack is used.
|
|
||||||
|
|
||||||
This plugin uses the built-in `:tag` command under the hood, which
|
|
||||||
yields a couple benefits.
|
|
||||||
|
|
||||||
- Tag stack management works as expected (CTRL-T or `:pop` return you
|
|
||||||
to your previous location).
|
|
||||||
- Tag priority works as expected (`:help tag-priority`).
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
```vim
|
|
||||||
Plug 'zackhsi/fzf-tags'
|
|
||||||
```
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
-------------
|
|
||||||
|
|
||||||
### Mappings
|
|
||||||
|
|
||||||
`fzf-tags` exposes the `<Plug>(fzf_tags)` mapping.
|
|
||||||
|
|
||||||
To override the default jump-to-tag binding:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
nmap <C-]> <Plug>(fzf_tags)
|
|
||||||
```
|
|
||||||
|
|
||||||
Additionally, `fzf-tags` exposes a fuzzy `:tselect`. To replace the default `:ts`:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
noreabbrev <expr> ts getcmdtype() == ":" && getcmdline() == 'ts' ? 'FZFTselect' : 'ts'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Prompt
|
|
||||||
|
|
||||||
To replace the default prompt `🔎`:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:fzf_tags_prompt = "Gd "
|
|
||||||
```
|
|
||||||
|
|
||||||
### Layout
|
|
||||||
|
|
||||||
`fzf-tags` respects the global
|
|
||||||
[`g:fzf_layout`](https://github.com/junegunn/fzf/blob/master/README-VIM.md#configuration)
|
|
||||||
setting. For example:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'highlight': 'Comment' } }
|
|
||||||
```
|
|
@ -1,128 +0,0 @@
|
|||||||
scriptencoding utf-8
|
|
||||||
|
|
||||||
let s:default_fzf_tags_prompt = ' 🔎 '
|
|
||||||
let s:fzf_tags_prompt = get(g:, 'fzf_tags_prompt', s:default_fzf_tags_prompt)
|
|
||||||
|
|
||||||
let s:default_fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
|
|
||||||
let s:fzf_layout = get(g:, 'fzf_layout', s:default_fzf_layout)
|
|
||||||
|
|
||||||
let s:actions = {
|
|
||||||
\ 'ctrl-t': 'tab split',
|
|
||||||
\ 'ctrl-x': 'split',
|
|
||||||
\ 'ctrl-v': 'vsplit' }
|
|
||||||
|
|
||||||
function! fzf_tags#SelectCommand(identifier)
|
|
||||||
let identifier = empty(a:identifier) ? s:tagstack_head() : a:identifier
|
|
||||||
if empty(identifier)
|
|
||||||
echohl Error
|
|
||||||
echo "Tag stack empty"
|
|
||||||
echohl None
|
|
||||||
else
|
|
||||||
call fzf_tags#Find(identifier)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf_tags#FindCommand(identifier)
|
|
||||||
return fzf_tags#Find(empty(a:identifier) ? expand('<cword>') : a:identifier)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf_tags#Find(identifier)
|
|
||||||
let identifier = s:strip_leading_bangs(a:identifier)
|
|
||||||
let source_lines = s:source_lines(identifier)
|
|
||||||
|
|
||||||
if len(source_lines) == 0
|
|
||||||
echohl WarningMsg
|
|
||||||
echo 'Tag not found: ' . identifier
|
|
||||||
echohl None
|
|
||||||
elseif len(source_lines) == 1
|
|
||||||
execute 'tag' identifier
|
|
||||||
else
|
|
||||||
let expect_keys = join(keys(s:actions), ',')
|
|
||||||
let run_spec = {
|
|
||||||
\ 'source': source_lines,
|
|
||||||
\ 'sink*': function('s:sink', [identifier]),
|
|
||||||
\ 'options': '--expect=' . expect_keys . ' --ansi --no-sort --tiebreak index --prompt "' . s:fzf_tags_prompt . '\"' . identifier . '\" > "',
|
|
||||||
\ }
|
|
||||||
let final_run_spec = extend(run_spec, s:fzf_layout)
|
|
||||||
call fzf#run(final_run_spec)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:tagstack_head()
|
|
||||||
let stack = gettagstack()
|
|
||||||
return stack.length != 0 ? stack.items[-1].tagname : ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:tagsearch_string(identifier)
|
|
||||||
return '^' . a:identifier . '$'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:strip_leading_bangs(identifier)
|
|
||||||
if (a:identifier[0] !=# '!')
|
|
||||||
return a:identifier
|
|
||||||
else
|
|
||||||
return s:strip_leading_bangs(a:identifier[1:])
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:source_lines(identifier)
|
|
||||||
let tagstring = s:tagsearch_string(a:identifier)
|
|
||||||
let relevant_fields = map(
|
|
||||||
\ taglist(tagstring, expand('%:p')),
|
|
||||||
\ function('s:tag_to_string')
|
|
||||||
\ )
|
|
||||||
return map(s:align_lists(relevant_fields), 'join(v:val, " ")')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:tag_to_string(index, tag_dict)
|
|
||||||
let components = [a:index + 1]
|
|
||||||
if has_key(a:tag_dict, 'filename')
|
|
||||||
call add(components, s:magenta(a:tag_dict['filename']))
|
|
||||||
endif
|
|
||||||
if has_key(a:tag_dict, 'class')
|
|
||||||
call add(components, s:green(a:tag_dict['class']))
|
|
||||||
endif
|
|
||||||
if has_key(a:tag_dict, 'cmd')
|
|
||||||
call add(components, s:red(a:tag_dict['cmd']))
|
|
||||||
endif
|
|
||||||
return components
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:align_lists(lists)
|
|
||||||
let maxes = {}
|
|
||||||
for list in a:lists
|
|
||||||
let i = 0
|
|
||||||
while i < len(list)
|
|
||||||
let maxes[i] = max([get(maxes, i, 0), len(list[i])])
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
endfor
|
|
||||||
for list in a:lists
|
|
||||||
call map(list, "printf('%-'.maxes[v:key].'s', v:val)")
|
|
||||||
endfor
|
|
||||||
return a:lists
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:sink(identifier, selection)
|
|
||||||
let selected_with_key = a:selection[0]
|
|
||||||
let selected_text = a:selection[1]
|
|
||||||
|
|
||||||
" Open new split or tab.
|
|
||||||
if has_key(s:actions, selected_with_key)
|
|
||||||
execute 'silent' s:actions[selected_with_key]
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Go to tag!
|
|
||||||
let l:count = split(selected_text)[0]
|
|
||||||
execute l:count . 'tag /' . s:tagsearch_string(a:identifier)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:green(s)
|
|
||||||
return "\033[32m" . a:s . "\033[m"
|
|
||||||
endfunction
|
|
||||||
function! s:magenta(s)
|
|
||||||
return "\033[35m" . a:s . "\033[m"
|
|
||||||
endfunction
|
|
||||||
function! s:red(s)
|
|
||||||
return "\033[31m" . a:s . "\033[m"
|
|
||||||
endfunction
|
|
@ -1,3 +0,0 @@
|
|||||||
command! -nargs=? -bar FZFTags :call fzf_tags#FindCommand(<q-args>)
|
|
||||||
command! -nargs=? -bar FZFTselect :call fzf_tags#SelectCommand(<q-args>)
|
|
||||||
nnoremap <silent> <Plug>(fzf_tags) :FZFTags<Return>
|
|
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2021 Junegunn Choi
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -1,443 +0,0 @@
|
|||||||
fzf :heart: vim
|
|
||||||
===============
|
|
||||||
|
|
||||||
Things you can do with [fzf][fzf] and Vim.
|
|
||||||
|
|
||||||
Rationale
|
|
||||||
---------
|
|
||||||
|
|
||||||
[fzf][fzf] itself is not a Vim plugin, and the official repository only
|
|
||||||
provides the [basic wrapper function][run] for Vim. It's up to the users to
|
|
||||||
write their own Vim commands with it. However, I've learned that many users of
|
|
||||||
fzf are not familiar with Vimscript and are looking for the "default"
|
|
||||||
implementation of the features they can find in the alternative Vim plugins.
|
|
||||||
|
|
||||||
Why you should use fzf on Vim
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
Because you can and you love fzf.
|
|
||||||
|
|
||||||
fzf runs asynchronously and can be orders of magnitude faster than similar Vim
|
|
||||||
plugins. However, the benefit may not be noticeable if the size of the input
|
|
||||||
is small, which is the case for many of the commands provided here.
|
|
||||||
Nevertheless I wrote them anyway since it's really easy to implement custom
|
|
||||||
selector with fzf.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
fzf.vim depends on the basic Vim plugin of [the main fzf
|
|
||||||
repository][fzf-main], which means you need to **set up both "fzf" and
|
|
||||||
"fzf.vim" on Vim**. To learn more about fzf/Vim integration, see
|
|
||||||
[README-VIM][README-VIM].
|
|
||||||
|
|
||||||
[fzf-main]: https://github.com/junegunn/fzf
|
|
||||||
[README-VIM]: https://github.com/junegunn/fzf/blob/master/README-VIM.md
|
|
||||||
|
|
||||||
### Using [vim-plug](https://github.com/junegunn/vim-plug)
|
|
||||||
|
|
||||||
```vim
|
|
||||||
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
|
|
||||||
Plug 'junegunn/fzf.vim'
|
|
||||||
```
|
|
||||||
|
|
||||||
`fzf#install()` makes sure that you have the latest binary, but it's optional,
|
|
||||||
so you can omit it if you use a plugin manager that doesn't support hooks.
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
|
|
||||||
- [fzf][fzf-main] 0.41.1 or above
|
|
||||||
- For syntax-highlighted preview, install [bat](https://github.com/sharkdp/bat)
|
|
||||||
- If [delta](https://github.com/dandavison/delta) is available, `GF?`,
|
|
||||||
`Commits` and `BCommits` will use it to format `git diff` output.
|
|
||||||
- `Ag` requires [The Silver Searcher (ag)][ag]
|
|
||||||
- `Rg` requires [ripgrep (rg)][rg]
|
|
||||||
- `Tags` and `Helptags` require Perl
|
|
||||||
|
|
||||||
Commands
|
|
||||||
--------
|
|
||||||
|
|
||||||
| Command | List |
|
|
||||||
| --- | --- |
|
|
||||||
| `:Files [PATH]` | Files (runs `$FZF_DEFAULT_COMMAND` if defined) |
|
|
||||||
| `:GFiles [OPTS]` | Git files (`git ls-files`) |
|
|
||||||
| `:GFiles?` | Git files (`git status`) |
|
|
||||||
| `:Buffers` | Open buffers |
|
|
||||||
| `:Colors` | Color schemes |
|
|
||||||
| `:Ag [PATTERN]` | [ag][ag] search result (`ALT-A` to select all, `ALT-D` to deselect all) |
|
|
||||||
| `:Rg [PATTERN]` | [rg][rg] search result (`ALT-A` to select all, `ALT-D` to deselect all) |
|
|
||||||
| `:RG [PATTERN]` | [rg][rg] search result; relaunch ripgrep on every keystroke |
|
|
||||||
| `:Lines [QUERY]` | Lines in loaded buffers |
|
|
||||||
| `:BLines [QUERY]` | Lines in the current buffer |
|
|
||||||
| `:Tags [QUERY]` | Tags in the project (`ctags -R`) |
|
|
||||||
| `:BTags [QUERY]` | Tags in the current buffer |
|
|
||||||
| `:Changes` | Changelist across all open buffers |
|
|
||||||
| `:Marks` | Marks |
|
|
||||||
| `:Jumps` | Jumps |
|
|
||||||
| `:Windows` | Windows |
|
|
||||||
| `:Locate PATTERN` | `locate` command output |
|
|
||||||
| `:History` | `v:oldfiles` and open buffers |
|
|
||||||
| `:History:` | Command history |
|
|
||||||
| `:History/` | Search history |
|
|
||||||
| `:Snippets` | Snippets ([UltiSnips][us]) |
|
|
||||||
| `:Commits [LOG_OPTS]` | Git commits (requires [fugitive.vim][f]) |
|
|
||||||
| `:BCommits [LOG_OPTS]` | Git commits for the current buffer; visual-select lines to track changes in the range |
|
|
||||||
| `:Commands` | Commands |
|
|
||||||
| `:Maps` | Normal mode mappings |
|
|
||||||
| `:Helptags` | Help tags <sup id="a1">[1](#helptags)</sup> |
|
|
||||||
| `:Filetypes` | File types
|
|
||||||
|
|
||||||
- Most commands support `CTRL-T` / `CTRL-X` / `CTRL-V` key
|
|
||||||
bindings to open in a new tab, a new split, or in a new vertical split
|
|
||||||
- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen
|
|
||||||
- You can set `g:fzf_vim.command_prefix` to give the same prefix to the commands
|
|
||||||
- e.g. `let g:fzf_vim.command_prefix = 'Fzf'` and you have `FzfFiles`, etc.
|
|
||||||
|
|
||||||
(<a name="helptags">1</a>: `Helptags` will shadow the command of the same name
|
|
||||||
from [pathogen][pat]. But its functionality is still available via `call
|
|
||||||
pathogen#helptags()`. [↩](#a1))
|
|
||||||
|
|
||||||
[pat]: https://github.com/tpope/vim-pathogen
|
|
||||||
[f]: https://github.com/tpope/vim-fugitive
|
|
||||||
|
|
||||||
Customization
|
|
||||||
-------------
|
|
||||||
|
|
||||||
### Configuration options of the base plugin
|
|
||||||
|
|
||||||
Every command in fzf.vim internally calls `fzf#wrap` function of the main
|
|
||||||
repository which supports a set of global option variables. So please read
|
|
||||||
through [README-VIM][README-VIM] to learn more about them.
|
|
||||||
|
|
||||||
### Configuration options for fzf.vim
|
|
||||||
|
|
||||||
All configuration values for this plugin are stored in `g:fzf_vim` dictionary,
|
|
||||||
so **make sure to initialize it before assigning any configuration values to
|
|
||||||
it**.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Initialize configuration dictionary
|
|
||||||
let g:fzf_vim = {}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Preview window
|
|
||||||
|
|
||||||
Some commands will show the preview window on the right. You can customize the
|
|
||||||
behavior with `g:fzf_vim.preview_window`. Here are some examples:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" This is the default option:
|
|
||||||
" - Preview window on the right with 50% width
|
|
||||||
" - CTRL-/ will toggle preview window.
|
|
||||||
" - Note that this array is passed as arguments to fzf#vim#with_preview function.
|
|
||||||
" - To learn more about preview window options, see `--preview-window` section of `man fzf`.
|
|
||||||
let g:fzf_vim.preview_window = ['right,50%', 'ctrl-/']
|
|
||||||
|
|
||||||
" Preview window is hidden by default. You can toggle it with ctrl-/.
|
|
||||||
" It will show on the right with 50% width, but if the width is smaller
|
|
||||||
" than 70 columns, it will show above the candidate list
|
|
||||||
let g:fzf_vim.preview_window = ['hidden,right,50%,<70(up,40%)', 'ctrl-/']
|
|
||||||
|
|
||||||
" Empty value to disable preview window altogether
|
|
||||||
let g:fzf_vim.preview_window = []
|
|
||||||
|
|
||||||
" fzf.vim needs bash to display the preview window.
|
|
||||||
" On Windows, fzf.vim will first see if bash is in $PATH, then if
|
|
||||||
" Git bash (C:\Program Files\Git\bin\bash.exe) is available.
|
|
||||||
" If you want it to use a different bash, set this variable.
|
|
||||||
" let g:fzf_vim = {}
|
|
||||||
" let g:fzf_vim.preview_bash = 'C:\Git\bin\bash.exe'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Command-level options
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" [Buffers] Jump to the existing window if possible
|
|
||||||
let g:fzf_vim.buffers_jump = 1
|
|
||||||
|
|
||||||
" [[B]Commits] Customize the options used by 'git log':
|
|
||||||
let g:fzf_vim.commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
|
|
||||||
|
|
||||||
" [Tags] Command to generate tags file
|
|
||||||
let g:fzf_vim.tags_command = 'ctags -R'
|
|
||||||
|
|
||||||
" [Commands] --expect expression for directly executing the command
|
|
||||||
let g:fzf_vim.commands_expect = 'alt-enter,ctrl-x'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### List type to handle multiple selections
|
|
||||||
|
|
||||||
The following commands will fill the quickfix list when multiple entries are
|
|
||||||
selected.
|
|
||||||
|
|
||||||
* `Ag`
|
|
||||||
* `Rg` / `RG`
|
|
||||||
* `Lines` / `BLines`
|
|
||||||
* `Tags` / `BTags`
|
|
||||||
|
|
||||||
By setting `g:fzf_vim.listproc`, you can make them use location list instead.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Default: Use quickfix list
|
|
||||||
let g:fzf_vim.listproc = { list -> fzf#vim#listproc#quickfix(list) }
|
|
||||||
|
|
||||||
" Use location list instead of quickfix list
|
|
||||||
let g:fzf_vim.listproc = { list -> fzf#vim#listproc#location(list) }
|
|
||||||
```
|
|
||||||
|
|
||||||
You can customize the list type per command by defining variables named
|
|
||||||
`g:fzf_vim.listproc_{command_name_in_lowercase}`.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Command-wise customization
|
|
||||||
let g:fzf_vim.listproc_ag = { list -> fzf#vim#listproc#quickfix(list) }
|
|
||||||
let g:fzf_vim.listproc_rg = { list -> fzf#vim#listproc#location(list) }
|
|
||||||
```
|
|
||||||
|
|
||||||
You can further customize the behavior by providing a custom function to
|
|
||||||
process the list instead of using the predefined `fzf#vim#listproc#quickfix`
|
|
||||||
or `fzf#vim#listproc#location`.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" A customized version of fzf#vim#listproc#quickfix.
|
|
||||||
" The last two lines are commented out not to move to the first entry.
|
|
||||||
function! g:fzf_vim.listproc(list)
|
|
||||||
call setqflist(a:list)
|
|
||||||
copen
|
|
||||||
wincmd p
|
|
||||||
" cfirst
|
|
||||||
" normal! zvzz
|
|
||||||
endfunction
|
|
||||||
```
|
|
||||||
|
|
||||||
### Advanced customization
|
|
||||||
|
|
||||||
#### Vim functions
|
|
||||||
|
|
||||||
Each command in fzf.vim is backed by a Vim function. You can override
|
|
||||||
a command or define a variation of it by calling its corresponding function.
|
|
||||||
|
|
||||||
| Command | Vim function |
|
|
||||||
| --- | --- |
|
|
||||||
| `Files` | `fzf#vim#files(dir, [spec dict], [fullscreen bool])` |
|
|
||||||
| `GFiles` | `fzf#vim#gitfiles(git_options, [spec dict], [fullscreen bool])` |
|
|
||||||
| `GFiles?` | `fzf#vim#gitfiles('?', [spec dict], [fullscreen bool])` |
|
|
||||||
| `Buffers` | `fzf#vim#buffers([query string], [bufnrs list], [spec dict], [fullscreen bool])` |
|
|
||||||
| `Colors` | `fzf#vim#colors([spec dict], [fullscreen bool])` |
|
|
||||||
| `Rg` | `fzf#vim#grep(command, [spec dict], [fullscreen bool])` |
|
|
||||||
| `RG` | `fzf#vim#grep2(command_prefix, query, [spec dict], [fullscreen bool])` |
|
|
||||||
| ... | ... |
|
|
||||||
|
|
||||||
(We can see that the last two optional arguments of each function are
|
|
||||||
identical. They are directly passed to `fzf#wrap` function. If you haven't
|
|
||||||
read [README-VIM][README-VIM] already, please read it before proceeding.)
|
|
||||||
|
|
||||||
#### Example: Customizing `Files` command
|
|
||||||
|
|
||||||
This is the default definition of `Files` command:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files call fzf#vim#files(<q-args>, <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
Let's say you want to a variation of it called `ProjectFiles` that only
|
|
||||||
searches inside `~/projects` directory. Then you can do it like this:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang ProjectFiles call fzf#vim#files('~/projects', <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
Or, if you want to override the command with different fzf options, just pass
|
|
||||||
a custom spec to the function.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline']}, <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
Want a preview window?
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
It kind of works, but you probably want a nicer previewer program than `cat`.
|
|
||||||
fzf.vim ships [a versatile preview script](bin/preview.sh) you can readily
|
|
||||||
use. It internally executes [bat](https://github.com/sharkdp/bat) for syntax
|
|
||||||
highlighting, so make sure to install it.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', '~/.vim/plugged/fzf.vim/bin/preview.sh {}']}, <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
However, it's not ideal to hard-code the path to the script which can be
|
|
||||||
different in different circumstances. So in order to make it easier to set up
|
|
||||||
the previewer, fzf.vim provides `fzf#vim#with_preview` helper function.
|
|
||||||
Similarly to `fzf#wrap`, it takes a spec dictionary and returns a copy of it
|
|
||||||
with additional preview options.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
You can just omit the spec argument if you only want the previewer.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Example: `git grep` wrapper
|
|
||||||
|
|
||||||
The following example implements `GGrep` command that works similarly to
|
|
||||||
predefined `Ag` or `Rg` using `fzf#vim#grep`.
|
|
||||||
|
|
||||||
- We set the base directory to git root by setting `dir` attribute in spec
|
|
||||||
dictionary.
|
|
||||||
- [The preview script](bin/preview.sh) supports `grep` format
|
|
||||||
(`FILE_PATH:LINE_NO:...`), so we can just wrap the spec with
|
|
||||||
`fzf#vim#with_preview` as before to enable previewer.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
command! -bang -nargs=* GGrep
|
|
||||||
\ call fzf#vim#grep(
|
|
||||||
\ 'git grep --line-number -- '.fzf#shellescape(<q-args>),
|
|
||||||
\ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
|
|
||||||
```
|
|
||||||
|
|
||||||
Mappings
|
|
||||||
--------
|
|
||||||
|
|
||||||
| Mapping | Description |
|
|
||||||
| --- | --- |
|
|
||||||
| `<plug>(fzf-maps-n)` | Normal mode mappings |
|
|
||||||
| `<plug>(fzf-maps-i)` | Insert mode mappings |
|
|
||||||
| `<plug>(fzf-maps-x)` | Visual mode mappings |
|
|
||||||
| `<plug>(fzf-maps-o)` | Operator-pending mappings |
|
|
||||||
| `<plug>(fzf-complete-word)` | `cat /usr/share/dict/words` |
|
|
||||||
| `<plug>(fzf-complete-path)` | Path completion using `find` (file + dir) |
|
|
||||||
| `<plug>(fzf-complete-file)` | File completion using `find` |
|
|
||||||
| `<plug>(fzf-complete-line)` | Line completion (all open buffers) |
|
|
||||||
| `<plug>(fzf-complete-buffer-line)` | Line completion (current buffer only) |
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Mapping selecting mappings
|
|
||||||
nmap <leader><tab> <plug>(fzf-maps-n)
|
|
||||||
xmap <leader><tab> <plug>(fzf-maps-x)
|
|
||||||
omap <leader><tab> <plug>(fzf-maps-o)
|
|
||||||
|
|
||||||
" Insert mode completion
|
|
||||||
imap <c-x><c-k> <plug>(fzf-complete-word)
|
|
||||||
imap <c-x><c-f> <plug>(fzf-complete-path)
|
|
||||||
imap <c-x><c-l> <plug>(fzf-complete-line)
|
|
||||||
```
|
|
||||||
|
|
||||||
Completion functions
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
| Function | Description |
|
|
||||||
| --- | --- |
|
|
||||||
| `fzf#vim#complete#path(command, [spec])` | Path completion |
|
|
||||||
| `fzf#vim#complete#word([spec])` | Word completion |
|
|
||||||
| `fzf#vim#complete#line([spec])` | Line completion (all open buffers) |
|
|
||||||
| `fzf#vim#complete#buffer_line([spec])` | Line completion (current buffer only) |
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Path completion with custom source command
|
|
||||||
inoremap <expr> <c-x><c-f> fzf#vim#complete#path('fd')
|
|
||||||
inoremap <expr> <c-x><c-f> fzf#vim#complete#path('rg --files')
|
|
||||||
|
|
||||||
" Word completion with custom spec with popup layout option
|
|
||||||
inoremap <expr> <c-x><c-k> fzf#vim#complete#word({'window': { 'width': 0.2, 'height': 0.9, 'xoffset': 1 }})
|
|
||||||
```
|
|
||||||
|
|
||||||
Custom completion
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
`fzf#vim#complete` is a helper function for creating custom fuzzy completion
|
|
||||||
using fzf. If the first parameter is a command string or a Vim list, it will
|
|
||||||
be used as the source.
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Replace the default dictionary completion with fzf-based fuzzy completion
|
|
||||||
inoremap <expr> <c-x><c-k> fzf#vim#complete('cat /usr/share/dict/words')
|
|
||||||
```
|
|
||||||
|
|
||||||
For advanced uses, you can pass an options dictionary to the function. The set
|
|
||||||
of options is pretty much identical to that for `fzf#run` only with the
|
|
||||||
following exceptions:
|
|
||||||
|
|
||||||
- `reducer` (funcref)
|
|
||||||
- Reducer transforms the output lines of fzf into a single string value
|
|
||||||
- `prefix` (string or funcref; default: `\k*$`)
|
|
||||||
- Regular expression pattern to extract the completion prefix
|
|
||||||
- Or a function to extract completion prefix
|
|
||||||
- Both `source` and `options` can be given as funcrefs that take the
|
|
||||||
completion prefix as the argument and return the final value
|
|
||||||
- `sink` or `sink*` are ignored
|
|
||||||
|
|
||||||
```vim
|
|
||||||
" Global line completion (not just open buffers. ripgrep required.)
|
|
||||||
inoremap <expr> <c-x><c-l> fzf#vim#complete(fzf#wrap({
|
|
||||||
\ 'prefix': '^.*$',
|
|
||||||
\ 'source': 'rg -n ^ --color always',
|
|
||||||
\ 'options': '--ansi --delimiter : --nth 3..',
|
|
||||||
\ 'reducer': { lines -> join(split(lines[0], ':\zs')[2:], '') }}))
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reducer example
|
|
||||||
|
|
||||||
```vim
|
|
||||||
function! s:make_sentence(lines)
|
|
||||||
return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
inoremap <expr> <c-x><c-s> fzf#vim#complete({
|
|
||||||
\ 'source': 'cat /usr/share/dict/words',
|
|
||||||
\ 'reducer': function('<sid>make_sentence'),
|
|
||||||
\ 'options': '--multi --reverse --margin 15%,0',
|
|
||||||
\ 'left': 20})
|
|
||||||
```
|
|
||||||
|
|
||||||
Status line of terminal buffer
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
When fzf starts in a terminal buffer (see [fzf/README-VIM.md][termbuf]), you
|
|
||||||
may want to customize the statusline of the containing buffer.
|
|
||||||
|
|
||||||
[termbuf]: https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer
|
|
||||||
|
|
||||||
### Hide statusline
|
|
||||||
|
|
||||||
```vim
|
|
||||||
autocmd! FileType fzf set laststatus=0 noshowmode noruler
|
|
||||||
\| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom statusline
|
|
||||||
|
|
||||||
```vim
|
|
||||||
function! s:fzf_statusline()
|
|
||||||
" Override statusline as you like
|
|
||||||
highlight fzf1 ctermfg=161 ctermbg=251
|
|
||||||
highlight fzf2 ctermfg=23 ctermbg=251
|
|
||||||
highlight fzf3 ctermfg=237 ctermbg=251
|
|
||||||
setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
autocmd! User FzfStatusLine call <SID>fzf_statusline()
|
|
||||||
```
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|
||||||
[fzf]: https://github.com/junegunn/fzf
|
|
||||||
[run]: https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzfrun
|
|
||||||
[ag]: https://github.com/ggreer/the_silver_searcher
|
|
||||||
[rg]: https://github.com/BurntSushi/ripgrep
|
|
||||||
[us]: https://github.com/SirVer/ultisnips
|
|
File diff suppressed because it is too large
Load Diff
@ -1,164 +0,0 @@
|
|||||||
" Copyright (c) 2015 Junegunn Choi
|
|
||||||
"
|
|
||||||
" MIT License
|
|
||||||
"
|
|
||||||
" Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
" a copy of this software and associated documentation files (the
|
|
||||||
" "Software"), to deal in the Software without restriction, including
|
|
||||||
" without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
" distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
" permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
" the following conditions:
|
|
||||||
"
|
|
||||||
" The above copyright notice and this permission notice shall be
|
|
||||||
" included in all copies or substantial portions of the Software.
|
|
||||||
"
|
|
||||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
let s:is_win = has('win32') || has('win64')
|
|
||||||
|
|
||||||
function! s:extend(base, extra)
|
|
||||||
let base = copy(a:base)
|
|
||||||
if has_key(a:extra, 'options')
|
|
||||||
let extra = copy(a:extra)
|
|
||||||
let extra.extra_options = remove(extra, 'options')
|
|
||||||
return extend(base, extra)
|
|
||||||
endif
|
|
||||||
return extend(base, a:extra)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if v:version >= 704
|
|
||||||
function! s:function(name)
|
|
||||||
return function(a:name)
|
|
||||||
endfunction
|
|
||||||
else
|
|
||||||
function! s:function(name)
|
|
||||||
" By Ingo Karkat
|
|
||||||
return function(substitute(a:name, '^s:', matchstr(expand('<sfile>'), '<SNR>\d\+_\zefunction$'), ''))
|
|
||||||
endfunction
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! fzf#vim#complete#word(...)
|
|
||||||
let sources = empty(&dictionary) ? ['/usr/share/dict/words'] : split(&dictionary, ',')
|
|
||||||
return fzf#vim#complete(s:extend({
|
|
||||||
\ 'source': 'cat ' . join(map(sources, 'fzf#shellescape(v:val)'))},
|
|
||||||
\ get(a:000, 0, fzf#wrap())))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" <plug>(fzf-complete-path)
|
|
||||||
" <plug>(fzf-complete-file)
|
|
||||||
" <plug>(fzf-complete-file-ag)
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
function! s:file_split_prefix(prefix)
|
|
||||||
let expanded = expand(a:prefix)
|
|
||||||
let slash = (s:is_win && !&shellslash) ? '\\' : '/'
|
|
||||||
return isdirectory(expanded) ?
|
|
||||||
\ [expanded,
|
|
||||||
\ substitute(a:prefix, '[/\\]*$', slash, ''),
|
|
||||||
\ ''] :
|
|
||||||
\ [fnamemodify(expanded, ':h'),
|
|
||||||
\ substitute(fnamemodify(a:prefix, ':h'), '[/\\]*$', slash, ''),
|
|
||||||
\ fnamemodify(expanded, ':t')]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:file_source(prefix)
|
|
||||||
let [dir, head, tail] = s:file_split_prefix(a:prefix)
|
|
||||||
return printf(
|
|
||||||
\ "cd %s && ".s:file_cmd." | sed %s",
|
|
||||||
\ fzf#shellescape(dir), fzf#shellescape('s:^:'.(empty(a:prefix) || a:prefix == tail ? '' : head).':'))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:file_options(prefix)
|
|
||||||
let [_, head, tail] = s:file_split_prefix(a:prefix)
|
|
||||||
return ['--prompt', head, '--query', tail]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:fname_prefix(str)
|
|
||||||
let isf = &isfname
|
|
||||||
let white = []
|
|
||||||
let black = []
|
|
||||||
if isf =~ ',,,'
|
|
||||||
call add(white, ',')
|
|
||||||
let isf = substitute(isf, ',,,', ',', 'g')
|
|
||||||
endif
|
|
||||||
if isf =~ ',^,,'
|
|
||||||
call add(black, ',')
|
|
||||||
let isf = substitute(isf, ',^,,', ',', 'g')
|
|
||||||
endif
|
|
||||||
|
|
||||||
for token in split(isf, ',')
|
|
||||||
let target = white
|
|
||||||
if token[0] == '^'
|
|
||||||
let target = black
|
|
||||||
let token = token[1:]
|
|
||||||
endif
|
|
||||||
|
|
||||||
let ends = matchlist(token, '\(.\+\)-\(.\+\)')
|
|
||||||
if empty(ends)
|
|
||||||
call add(target, token)
|
|
||||||
else
|
|
||||||
let ends = map(ends[1:2], "len(v:val) == 1 ? char2nr(v:val) : str2nr(v:val)")
|
|
||||||
for i in range(ends[0], ends[1])
|
|
||||||
call add(target, nr2char(i))
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let prefix = a:str
|
|
||||||
for offset in range(1, len(a:str))
|
|
||||||
let char = a:str[len(a:str) - offset]
|
|
||||||
if (char =~ '\w' || index(white, char) >= 0) && index(black, char) < 0
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let prefix = strpart(a:str, len(a:str) - offset + 1)
|
|
||||||
break
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return prefix
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf#vim#complete#path(command, ...)
|
|
||||||
let s:file_cmd = a:command
|
|
||||||
return fzf#vim#complete(s:extend({
|
|
||||||
\ 'prefix': s:function('s:fname_prefix'),
|
|
||||||
\ 'source': s:function('s:file_source'),
|
|
||||||
\ 'options': s:function('s:file_options')}, get(a:000, 0, fzf#wrap())))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" <plug>(fzf-complete-line)
|
|
||||||
" <plug>(fzf-complete-buffer-line)
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
function! s:reduce_line(lines)
|
|
||||||
return join(split(a:lines[0], '\t\zs')[3:], '')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
function! fzf#vim#complete#line(...)
|
|
||||||
let [display_bufnames, lines] = fzf#vim#_lines(0)
|
|
||||||
let nth = display_bufnames ? 4 : 3
|
|
||||||
return fzf#vim#complete(s:extend({
|
|
||||||
\ 'prefix': '^.*$',
|
|
||||||
\ 'source': lines,
|
|
||||||
\ 'options': '--tiebreak=index --ansi --nth '.nth.'.. --tabstop=1',
|
|
||||||
\ 'reducer': s:function('s:reduce_line')}, get(a:000, 0, fzf#wrap())))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf#vim#complete#buffer_line(...)
|
|
||||||
return fzf#vim#complete(s:extend({
|
|
||||||
\ 'prefix': '^.*$',
|
|
||||||
\ 'source': fzf#vim#_uniq(getline(1, '$'))}, get(a:000, 0, fzf#wrap())))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
|
||||||
unlet s:cpo_save
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
" Copyright (c) 2023 Junegunn Choi
|
|
||||||
"
|
|
||||||
" MIT License
|
|
||||||
"
|
|
||||||
" Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
" a copy of this software and associated documentation files (the
|
|
||||||
" "Software"), to deal in the Software without restriction, including
|
|
||||||
" without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
" distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
" permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
" the following conditions:
|
|
||||||
"
|
|
||||||
" The above copyright notice and this permission notice shall be
|
|
||||||
" included in all copies or substantial portions of the Software.
|
|
||||||
"
|
|
||||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
function! fzf#vim#listproc#quickfix(list)
|
|
||||||
call setqflist(a:list)
|
|
||||||
copen
|
|
||||||
wincmd p
|
|
||||||
cfirst
|
|
||||||
normal! zvzz
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf#vim#listproc#location(list)
|
|
||||||
call setloclist(0, a:list)
|
|
||||||
lopen
|
|
||||||
wincmd p
|
|
||||||
lfirst
|
|
||||||
normal! zvzz
|
|
||||||
endfunction
|
|
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env ruby
|
|
||||||
|
|
||||||
puts 'preview.rb is deprecated. Use preview.sh instead.'
|
|
@ -1,86 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
REVERSE="\x1b[7m"
|
|
||||||
RESET="\x1b[m"
|
|
||||||
|
|
||||||
if [[ $# -lt 1 ]]; then
|
|
||||||
echo "usage: $0 [--tag] FILENAME[:LINENO][:IGNORED]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $1 = --tag ]]; then
|
|
||||||
shift
|
|
||||||
"$(dirname "${BASH_SOURCE[0]}")/tagpreview.sh" "$@"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ignore if an empty path is given
|
|
||||||
[[ -z $1 ]] && exit
|
|
||||||
|
|
||||||
IFS=':' read -r -a INPUT <<< "$1"
|
|
||||||
FILE=${INPUT[0]}
|
|
||||||
CENTER=${INPUT[1]}
|
|
||||||
|
|
||||||
if [[ "$1" =~ ^[A-Za-z]:\\ ]]; then
|
|
||||||
FILE=$FILE:${INPUT[1]}
|
|
||||||
CENTER=${INPUT[2]}
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$CENTER" && ! "$CENTER" =~ ^[0-9] ]]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
CENTER=${CENTER/[^0-9]*/}
|
|
||||||
|
|
||||||
# MS Win support
|
|
||||||
if [[ "$FILE" =~ '\' ]]; then
|
|
||||||
if [ -z "$MSWINHOME" ]; then
|
|
||||||
MSWINHOME="$HOMEDRIVE$HOMEPATH"
|
|
||||||
fi
|
|
||||||
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null ; then
|
|
||||||
MSWINHOME="${MSWINHOME//\\/\\\\}"
|
|
||||||
FILE="${FILE/#\~\\/$MSWINHOME\\}"
|
|
||||||
FILE=$(wslpath -u "$FILE")
|
|
||||||
elif [ -n "$MSWINHOME" ]; then
|
|
||||||
FILE="${FILE/#\~\\/$MSWINHOME\\}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
FILE="${FILE/#\~\//$HOME/}"
|
|
||||||
if [ ! -r "$FILE" ]; then
|
|
||||||
echo "File not found ${FILE}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$CENTER" ]; then
|
|
||||||
CENTER=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sometimes bat is installed as batcat.
|
|
||||||
if command -v batcat > /dev/null; then
|
|
||||||
BATNAME="batcat"
|
|
||||||
elif command -v bat > /dev/null; then
|
|
||||||
BATNAME="bat"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$FZF_PREVIEW_COMMAND" ] && [ "${BATNAME:+x}" ]; then
|
|
||||||
${BATNAME} --style="${BAT_STYLE:-numbers}" --color=always --pager=never \
|
|
||||||
--highlight-line=$CENTER -- "$FILE"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
FILE_LENGTH=${#FILE}
|
|
||||||
MIME=$(file --dereference --mime -- "$FILE")
|
|
||||||
if [[ "${MIME:FILE_LENGTH}" =~ binary ]]; then
|
|
||||||
echo "$MIME"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
DEFAULT_COMMAND="highlight -O ansi -l {} || coderay {} || rougify {} || cat {}"
|
|
||||||
CMD=${FZF_PREVIEW_COMMAND:-$DEFAULT_COMMAND}
|
|
||||||
CMD=${CMD//{\}/$(printf %q "$FILE")}
|
|
||||||
|
|
||||||
eval "$CMD" 2> /dev/null | awk "{ \
|
|
||||||
if (NR == $CENTER) \
|
|
||||||
{ gsub(/\x1b[[0-9;]*m/, \"&$REVERSE\"); printf(\"$REVERSE%s\n$RESET\", \$0); } \
|
|
||||||
else printf(\"$RESET%s\n\", \$0); \
|
|
||||||
}"
|
|
@ -1,73 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
REVERSE="\x1b[7m"
|
|
||||||
RESET="\x1b[m"
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "usage: $0 FILENAME:TAGFILE:EXCMD"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=':' read -r FILE TAGFILE EXCMD <<< "$*"
|
|
||||||
|
|
||||||
# Complete file paths which are relative to the given tag file
|
|
||||||
if [ "${FILE:0:1}" != "/" ]; then
|
|
||||||
FILE="$(dirname "${TAGFILE}")/${FILE}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -r "$FILE" ]; then
|
|
||||||
echo "File not found ${FILE}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If users aren't using vim, they are probably using neovim
|
|
||||||
if command -v vim > /dev/null; then
|
|
||||||
VIMNAME="vim"
|
|
||||||
elif command -v nvim > /dev/null; then
|
|
||||||
VIMNAME="nvim"
|
|
||||||
else
|
|
||||||
echo "Cannot preview tag: vim or nvim unavailable"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
CENTER="$("${VIMNAME}" -R -i NONE -u NONE -e -m -s "${FILE}" \
|
|
||||||
-c "set nomagic" \
|
|
||||||
-c "${EXCMD}" \
|
|
||||||
-c 'let l=line(".") | new | put =l | print | qa!')" || exit
|
|
||||||
|
|
||||||
START_LINE="$(( CENTER - FZF_PREVIEW_LINES / 2 ))"
|
|
||||||
if (( START_LINE <= 0 )); then
|
|
||||||
START_LINE=1
|
|
||||||
fi
|
|
||||||
END_LINE="$(( START_LINE + FZF_PREVIEW_LINES - 1 ))"
|
|
||||||
|
|
||||||
# Sometimes bat is installed as batcat.
|
|
||||||
if command -v batcat > /dev/null; then
|
|
||||||
BATNAME="batcat"
|
|
||||||
elif command -v bat > /dev/null; then
|
|
||||||
BATNAME="bat"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$FZF_PREVIEW_COMMAND" ] && [ "${BATNAME:+x}" ]; then
|
|
||||||
${BATNAME} --style="${BAT_STYLE:-numbers}" \
|
|
||||||
--color=always \
|
|
||||||
--pager=never \
|
|
||||||
--wrap=never \
|
|
||||||
--terminal-width="${FZF_PREVIEW_COLUMNS}" \
|
|
||||||
--line-range="${START_LINE}:${END_LINE}" \
|
|
||||||
--highlight-line="${CENTER}" \
|
|
||||||
"$FILE"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
DEFAULT_COMMAND="highlight -O ansi -l {} || coderay {} || rougify {} || cat {}"
|
|
||||||
CMD=${FZF_PREVIEW_COMMAND:-$DEFAULT_COMMAND}
|
|
||||||
CMD=${CMD//{\}/$(printf %q "$FILE")}
|
|
||||||
|
|
||||||
eval "$CMD" 2> /dev/null | awk "{ \
|
|
||||||
if (NR >= $START_LINE && NR <= $END_LINE) { \
|
|
||||||
if (NR == $CENTER) \
|
|
||||||
{ gsub(/\x1b[[0-9;]*m/, \"&$REVERSE\"); printf(\"$REVERSE%s\n$RESET\", \$0); } \
|
|
||||||
else printf(\"$RESET%s\n\", \$0); \
|
|
||||||
} \
|
|
||||||
}"
|
|
@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
foreach my $file (@ARGV) {
|
|
||||||
open my $lines, $file;
|
|
||||||
while (<$lines>) {
|
|
||||||
unless (/^\!/) {
|
|
||||||
s/^[^\t]*/sprintf("%-24s", $&)/e;
|
|
||||||
s/$/\t$file/;
|
|
||||||
print;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close $lines;
|
|
||||||
}
|
|
@ -1,515 +0,0 @@
|
|||||||
fzf-vim.txt fzf-vim Last change: October 14 2023
|
|
||||||
FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
fzf :heart: vim |fzf-vim-fzfheart-vim|
|
|
||||||
Rationale |fzf-vim-rationale|
|
|
||||||
Why you should use fzf on Vim |fzf-vim-why-you-should-use-fzf-on-vim|
|
|
||||||
Installation |fzf-vim-installation|
|
|
||||||
Using vim-plug |fzf-vim-using-vim-plug|
|
|
||||||
Dependencies |fzf-vim-dependencies|
|
|
||||||
Commands |fzf-vim-commands|
|
|
||||||
Customization |fzf-vim-customization|
|
|
||||||
Configuration options of the base plugin |fzf-vim-configuration-options-of-the-base-plugin|
|
|
||||||
Configuration options for fzf.vim |fzf-vim-configuration-options-for-fzf-vim|
|
|
||||||
Preview window |fzf-vim-preview-window|
|
|
||||||
Command-level options |fzf-vim-command-level-options|
|
|
||||||
List type to handle multiple selections |fzf-vim-list-type-to-handle-multiple-selections|
|
|
||||||
Advanced customization |fzf-vim-advanced-customization|
|
|
||||||
Vim functions |fzf-vim-vim-functions|
|
|
||||||
Example: Customizing Files command |fzf-vim-example-customizing-files-command|
|
|
||||||
Example: git grep wrapper |fzf-vim-example-git-grep-wrapper|
|
|
||||||
Mappings |fzf-vim-mappings|
|
|
||||||
Completion functions |fzf-vim-completion-functions|
|
|
||||||
Custom completion |fzf-vim-custom-completion|
|
|
||||||
Reducer example |fzf-vim-reducer-example|
|
|
||||||
Status line of terminal buffer |fzf-vim-status-line-of-terminal-buffer|
|
|
||||||
Hide statusline |fzf-vim-hide-statusline|
|
|
||||||
Custom statusline |fzf-vim-custom-statusline|
|
|
||||||
License |fzf-vim-license|
|
|
||||||
|
|
||||||
FZF :HEART: VIM *fzf-vim-fzfheart-vim*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
Things you can do with {fzf}{1} and Vim.
|
|
||||||
|
|
||||||
{1} https://github.com/junegunn/fzf
|
|
||||||
|
|
||||||
|
|
||||||
RATIONALE *fzf-vim-rationale*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
{fzf}{1} itself is not a Vim plugin, and the official repository only provides
|
|
||||||
the {basic wrapper function}{2} for Vim. It's up to the users to write their
|
|
||||||
own Vim commands with it. However, I've learned that many users of fzf are not
|
|
||||||
familiar with Vimscript and are looking for the "default" implementation of
|
|
||||||
the features they can find in the alternative Vim plugins.
|
|
||||||
|
|
||||||
{1} https://github.com/junegunn/fzf
|
|
||||||
{2} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzfrun
|
|
||||||
|
|
||||||
|
|
||||||
WHY YOU SHOULD USE FZF ON VIM *fzf-vim-why-you-should-use-fzf-on-vim*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
Because you can and you love fzf.
|
|
||||||
|
|
||||||
fzf runs asynchronously and can be orders of magnitude faster than similar Vim
|
|
||||||
plugins. However, the benefit may not be noticeable if the size of the input
|
|
||||||
is small, which is the case for many of the commands provided here.
|
|
||||||
Nevertheless I wrote them anyway since it's really easy to implement custom
|
|
||||||
selector with fzf.
|
|
||||||
|
|
||||||
|
|
||||||
INSTALLATION *fzf-vim-installation*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
fzf.vim depends on the basic Vim plugin of {the main fzf repository}{1}, which
|
|
||||||
means you need to set up both "fzf" and "fzf.vim" on Vim. To learn more about
|
|
||||||
fzf/Vim integration, see {README-VIM}{3}.
|
|
||||||
|
|
||||||
{1} https://github.com/junegunn/fzf
|
|
||||||
{3} https://github.com/junegunn/fzf/blob/master/README-VIM.md
|
|
||||||
|
|
||||||
|
|
||||||
< Using vim-plug >____________________________________________________________~
|
|
||||||
*fzf-vim-using-vim-plug*
|
|
||||||
>
|
|
||||||
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
|
|
||||||
Plug 'junegunn/fzf.vim'
|
|
||||||
<
|
|
||||||
`fzf#install()` makes sure that you have the latest binary, but it's optional,
|
|
||||||
so you can omit it if you use a plugin manager that doesn't support hooks.
|
|
||||||
|
|
||||||
|
|
||||||
< Dependencies >______________________________________________________________~
|
|
||||||
*fzf-vim-dependencies*
|
|
||||||
|
|
||||||
- {fzf}{1} 0.41.1 or above
|
|
||||||
- For syntax-highlighted preview, install {bat}{4}
|
|
||||||
- If {delta}{5} is available, `GF?`, `Commits` and `BCommits` will use it to
|
|
||||||
format `git diff` output.
|
|
||||||
- `Ag` requires {The Silver Searcher (ag)}{6}
|
|
||||||
- `Rg` requires {ripgrep (rg)}{7}
|
|
||||||
- `Tags` and `Helptags` require Perl
|
|
||||||
|
|
||||||
{1} https://github.com/junegunn/fzf
|
|
||||||
{4} https://github.com/sharkdp/bat
|
|
||||||
{5} https://github.com/dandavison/delta
|
|
||||||
{6} https://github.com/ggreer/the_silver_searcher
|
|
||||||
{7} https://github.com/BurntSushi/ripgrep
|
|
||||||
|
|
||||||
|
|
||||||
COMMANDS *fzf-vim-commands*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
*:Files* *:GFiles* *:Buffers* *:Colors* *:Ag* *:Rg* *:RG* *:Lines* *:BLines* *:Tags* *:BTags*
|
|
||||||
*:Changes* *:Marks* *:Jumps* *:Windows* *:Locate* *:History* *:Snippets* *:Commits* *:BCommits*
|
|
||||||
*:Commands* *:Maps* *:Helptags* *:Filetypes*
|
|
||||||
|
|
||||||
-----------------------+--------------------------------------------------------------------------------------
|
|
||||||
Command | List ~
|
|
||||||
-----------------------+--------------------------------------------------------------------------------------
|
|
||||||
`:Files [PATH]` | Files (runs `$FZF_DEFAULT_COMMAND` if defined)
|
|
||||||
`:GFiles [OPTS]` | Git files ( `git ls-files` )
|
|
||||||
`:GFiles?` | Git files ( `git status` )
|
|
||||||
`:Buffers` | Open buffers
|
|
||||||
`:Colors` | Color schemes
|
|
||||||
`:Ag [PATTERN]` | {ag}{6} search result ( `ALT-A` to select all, `ALT-D` to deselect all)
|
|
||||||
`:Rg [PATTERN]` | {rg}{7} search result ( `ALT-A` to select all, `ALT-D` to deselect all)
|
|
||||||
`:RG [PATTERN]` | {rg}{7} search result; relaunch ripgrep on every keystroke
|
|
||||||
`:Lines [QUERY]` | Lines in loaded buffers
|
|
||||||
`:BLines [QUERY]` | Lines in the current buffer
|
|
||||||
`:Tags [QUERY]` | Tags in the project ( `ctags -R` )
|
|
||||||
`:BTags [QUERY]` | Tags in the current buffer
|
|
||||||
`:Changes` | Changelist across all open buffers
|
|
||||||
`:Marks` | Marks
|
|
||||||
`:Jumps` | Jumps
|
|
||||||
`:Windows` | Windows
|
|
||||||
`:Locate PATTERN` | `locate` command output
|
|
||||||
`:History` | `v:oldfiles` and open buffers
|
|
||||||
`:History:` | Command history
|
|
||||||
`:History/` | Search history
|
|
||||||
`:Snippets` | Snippets ({UltiSnips}{8})
|
|
||||||
`:Commits [LOG_OPTS]` | Git commits (requires {fugitive.vim}{9})
|
|
||||||
`:BCommits [LOG_OPTS]` | Git commits for the current buffer; visual-select lines to track changes in the range
|
|
||||||
`:Commands` | Commands
|
|
||||||
`:Maps` | Normal mode mappings
|
|
||||||
`:Helptags` | Help tags [1]
|
|
||||||
`:Filetypes` | File types
|
|
||||||
-----------------------+--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
*g:fzf_vim.command_prefix*
|
|
||||||
|
|
||||||
- Most commands support CTRL-T / CTRL-X / CTRL-V key bindings to open in a new
|
|
||||||
tab, a new split, or in a new vertical split
|
|
||||||
- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen
|
|
||||||
- You can set `g:fzf_vim.command_prefix` to give the same prefix to the commands
|
|
||||||
- e.g. `let g:fzf_vim.command_prefix = 'Fzf'` and you have `FzfFiles`, etc.
|
|
||||||
|
|
||||||
(1: `Helptags` will shadow the command of the same name from {pathogen}{10}.
|
|
||||||
But its functionality is still available via `call pathogen#helptags()`. [↩])
|
|
||||||
|
|
||||||
{6} https://github.com/ggreer/the_silver_searcher
|
|
||||||
{7} https://github.com/BurntSushi/ripgrep
|
|
||||||
{7} https://github.com/BurntSushi/ripgrep
|
|
||||||
{8} https://github.com/SirVer/ultisnips
|
|
||||||
{9} https://github.com/tpope/vim-fugitive
|
|
||||||
{10} https://github.com/tpope/vim-pathogen
|
|
||||||
|
|
||||||
|
|
||||||
CUSTOMIZATION *fzf-vim-customization*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
< Configuration options of the base plugin >__________________________________~
|
|
||||||
*fzf-vim-configuration-options-of-the-base-plugin*
|
|
||||||
|
|
||||||
Every command in fzf.vim internally calls `fzf#wrap` function of the main
|
|
||||||
repository which supports a set of global option variables. So please read
|
|
||||||
through {README-VIM}{3} to learn more about them.
|
|
||||||
|
|
||||||
{3} https://github.com/junegunn/fzf/blob/master/README-VIM.md
|
|
||||||
|
|
||||||
|
|
||||||
< Configuration options for fzf.vim >_________________________________________~
|
|
||||||
*fzf-vim-configuration-options-for-fzf-vim*
|
|
||||||
|
|
||||||
*g:fzf_vim*
|
|
||||||
|
|
||||||
All configuration values for this plugin are stored in `g:fzf_vim` dictionary,
|
|
||||||
so make sure to initialize it before assigning any configuration values to it.
|
|
||||||
>
|
|
||||||
" Initialize configuration dictionary
|
|
||||||
let g:fzf_vim = {}
|
|
||||||
<
|
|
||||||
|
|
||||||
Preview window~
|
|
||||||
*fzf-vim-preview-window*
|
|
||||||
|
|
||||||
*g:fzf_vim.preview_window*
|
|
||||||
|
|
||||||
Some commands will show the preview window on the right. You can customize the
|
|
||||||
behavior with `g:fzf_vim.preview_window`. Here are some examples:
|
|
||||||
|
|
||||||
*g:fzf_vim.preview_bash*
|
|
||||||
>
|
|
||||||
" This is the default option:
|
|
||||||
" - Preview window on the right with 50% width
|
|
||||||
" - CTRL-/ will toggle preview window.
|
|
||||||
" - Note that this array is passed as arguments to fzf#vim#with_preview function.
|
|
||||||
" - To learn more about preview window options, see `--preview-window` section of `man fzf`.
|
|
||||||
let g:fzf_vim.preview_window = ['right,50%', 'ctrl-/']
|
|
||||||
|
|
||||||
" Preview window is hidden by default. You can toggle it with ctrl-/.
|
|
||||||
" It will show on the right with 50% width, but if the width is smaller
|
|
||||||
" than 70 columns, it will show above the candidate list
|
|
||||||
let g:fzf_vim.preview_window = ['hidden,right,50%,<70(up,40%)', 'ctrl-/']
|
|
||||||
|
|
||||||
" Empty value to disable preview window altogether
|
|
||||||
let g:fzf_vim.preview_window = []
|
|
||||||
|
|
||||||
" fzf.vim needs bash to display the preview window.
|
|
||||||
" On Windows, fzf.vim will first see if bash is in $PATH, then if
|
|
||||||
" Git bash (C:\Program Files\Git\bin\bash.exe) is available.
|
|
||||||
" If you want it to use a different bash, set this variable.
|
|
||||||
" let g:fzf_vim = {}
|
|
||||||
" let g:fzf_vim.preview_bash = 'C:\Git\bin\bash.exe'
|
|
||||||
<
|
|
||||||
|
|
||||||
Command-level options~
|
|
||||||
*fzf-vim-command-level-options*
|
|
||||||
|
|
||||||
*g:fzf_vim.commands_expect* *g:fzf_vim.tags_command* *g:fzf_vim.commits_log_options*
|
|
||||||
*g:fzf_vim.buffers_jump*
|
|
||||||
>
|
|
||||||
" [Buffers] Jump to the existing window if possible
|
|
||||||
let g:fzf_vim.buffers_jump = 1
|
|
||||||
|
|
||||||
" [[B]Commits] Customize the options used by 'git log':
|
|
||||||
let g:fzf_vim.commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
|
|
||||||
|
|
||||||
" [Tags] Command to generate tags file
|
|
||||||
let g:fzf_vim.tags_command = 'ctags -R'
|
|
||||||
|
|
||||||
" [Commands] --expect expression for directly executing the command
|
|
||||||
let g:fzf_vim.commands_expect = 'alt-enter,ctrl-x'
|
|
||||||
<
|
|
||||||
|
|
||||||
List type to handle multiple selections~
|
|
||||||
*fzf-vim-list-type-to-handle-multiple-selections*
|
|
||||||
|
|
||||||
The following commands will fill the quickfix list when multiple entries are
|
|
||||||
selected.
|
|
||||||
|
|
||||||
- `Ag`
|
|
||||||
- `Rg` / `RG`
|
|
||||||
- `Lines` / `BLines`
|
|
||||||
- `Tags` / `BTags`
|
|
||||||
|
|
||||||
*g:fzf_vim.listproc*
|
|
||||||
|
|
||||||
By setting `g:fzf_vim.listproc`, you can make them use location list instead.
|
|
||||||
>
|
|
||||||
" Default: Use quickfix list
|
|
||||||
let g:fzf_vim.listproc = { list -> fzf#vim#listproc#quickfix(list) }
|
|
||||||
|
|
||||||
" Use location list instead of quickfix list
|
|
||||||
let g:fzf_vim.listproc = { list -> fzf#vim#listproc#location(list) }
|
|
||||||
<
|
|
||||||
You can customize the list type per command by defining variables named
|
|
||||||
`g:fzf_vim.listproc_{command_name_in_lowercase}`.
|
|
||||||
|
|
||||||
*g:fzf_vim.listproc_rg* *g:fzf_vim.listproc_ag*
|
|
||||||
>
|
|
||||||
" Command-wise customization
|
|
||||||
let g:fzf_vim.listproc_ag = { list -> fzf#vim#listproc#quickfix(list) }
|
|
||||||
let g:fzf_vim.listproc_rg = { list -> fzf#vim#listproc#location(list) }
|
|
||||||
<
|
|
||||||
You can further customize the behavior by providing a custom function to
|
|
||||||
process the list instead of using the predefined `fzf#vim#listproc#quickfix`
|
|
||||||
or `fzf#vim#listproc#location`.
|
|
||||||
>
|
|
||||||
" A customized version of fzf#vim#listproc#quickfix.
|
|
||||||
" The last two lines are commented out not to move to the first entry.
|
|
||||||
function! g:fzf_vim.listproc(list)
|
|
||||||
call setqflist(a:list)
|
|
||||||
copen
|
|
||||||
wincmd p
|
|
||||||
" cfirst
|
|
||||||
" normal! zvzz
|
|
||||||
endfunction
|
|
||||||
<
|
|
||||||
|
|
||||||
< Advanced customization >____________________________________________________~
|
|
||||||
*fzf-vim-advanced-customization*
|
|
||||||
|
|
||||||
|
|
||||||
Vim functions~
|
|
||||||
*fzf-vim-vim-functions*
|
|
||||||
|
|
||||||
Each command in fzf.vim is backed by a Vim function. You can override a
|
|
||||||
command or define a variation of it by calling its corresponding function.
|
|
||||||
|
|
||||||
----------+---------------------------------------------------------------------------------
|
|
||||||
Command | Vim function ~
|
|
||||||
----------+---------------------------------------------------------------------------------
|
|
||||||
`Files` | `fzf#vim#files(dir, [spec dict], [fullscreen bool])`
|
|
||||||
`GFiles` | `fzf#vim#gitfiles(git_options, [spec dict], [fullscreen bool])`
|
|
||||||
`GFiles?` | `fzf#vim#gitfiles('?', [spec dict], [fullscreen bool])`
|
|
||||||
`Buffers` | `fzf#vim#buffers([query string], [bufnrs list], [spec dict], [fullscreen bool])`
|
|
||||||
`Colors` | `fzf#vim#colors([spec dict], [fullscreen bool])`
|
|
||||||
`Rg` | `fzf#vim#grep(command, [spec dict], [fullscreen bool])`
|
|
||||||
`RG` | `fzf#vim#grep2(command_prefix, query, [spec dict], [fullscreen bool])`
|
|
||||||
... | ...
|
|
||||||
----------+---------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(We can see that the last two optional arguments of each function are
|
|
||||||
identical. They are directly passed to `fzf#wrap` function. If you haven't
|
|
||||||
read {README-VIM}{3} already, please read it before proceeding.)
|
|
||||||
|
|
||||||
{3} https://github.com/junegunn/fzf/blob/master/README-VIM.md
|
|
||||||
|
|
||||||
|
|
||||||
Example: Customizing Files command~
|
|
||||||
*fzf-vim-example-customizing-files-command*
|
|
||||||
|
|
||||||
This is the default definition of `Files` command:
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files call fzf#vim#files(<q-args>, <bang>0)
|
|
||||||
<
|
|
||||||
Let's say you want to a variation of it called `ProjectFiles` that only
|
|
||||||
searches inside `~/projects` directory. Then you can do it like this:
|
|
||||||
>
|
|
||||||
command! -bang ProjectFiles call fzf#vim#files('~/projects', <bang>0)
|
|
||||||
<
|
|
||||||
Or, if you want to override the command with different fzf options, just pass
|
|
||||||
a custom spec to the function.
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline']}, <bang>0)
|
|
||||||
<
|
|
||||||
Want a preview window?
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, <bang>0)
|
|
||||||
<
|
|
||||||
It kind of works, but you probably want a nicer previewer program than `cat`.
|
|
||||||
fzf.vim ships {a versatile preview script}{11} you can readily use. It
|
|
||||||
internally executes {bat}{4} for syntax highlighting, so make sure to install
|
|
||||||
it.
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, {'options': ['--layout=reverse', '--info=inline', '--preview', '~/.vim/plugged/fzf.vim/bin/preview.sh {}']}, <bang>0)
|
|
||||||
<
|
|
||||||
However, it's not ideal to hard-code the path to the script which can be
|
|
||||||
different in different circumstances. So in order to make it easier to set up
|
|
||||||
the previewer, fzf.vim provides `fzf#vim#with_preview` helper function.
|
|
||||||
Similarly to `fzf#wrap`, it takes a spec dictionary and returns a copy of it
|
|
||||||
with additional preview options.
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), <bang>0)
|
|
||||||
<
|
|
||||||
You can just omit the spec argument if you only want the previewer.
|
|
||||||
>
|
|
||||||
command! -bang -nargs=? -complete=dir Files
|
|
||||||
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
|
|
||||||
<
|
|
||||||
{11} bin/preview.sh
|
|
||||||
{4} https://github.com/sharkdp/bat
|
|
||||||
|
|
||||||
|
|
||||||
Example: git grep wrapper~
|
|
||||||
*fzf-vim-example-git-grep-wrapper*
|
|
||||||
|
|
||||||
The following example implements `GGrep` command that works similarly to
|
|
||||||
predefined `Ag` or `Rg` using `fzf#vim#grep`.
|
|
||||||
|
|
||||||
*:LINE*
|
|
||||||
|
|
||||||
- We set the base directory to git root by setting `dir` attribute in spec
|
|
||||||
dictionary.
|
|
||||||
- {The preview script}{11} supports `grep` format (`FILE_PATH:LINE_NO:...`), so
|
|
||||||
we can just wrap the spec with `fzf#vim#with_preview` as before to enable
|
|
||||||
previewer.
|
|
||||||
>
|
|
||||||
command! -bang -nargs=* GGrep
|
|
||||||
\ call fzf#vim#grep(
|
|
||||||
\ 'git grep --line-number -- '.fzf#shellescape(<q-args>),
|
|
||||||
\ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
|
|
||||||
<
|
|
||||||
{11} bin/preview.sh
|
|
||||||
|
|
||||||
|
|
||||||
MAPPINGS *fzf-vim-mappings*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
---------------------------------+------------------------------------------
|
|
||||||
Mapping | Description ~
|
|
||||||
---------------------------------+------------------------------------------
|
|
||||||
<plug>(fzf-maps-n) | Normal mode mappings
|
|
||||||
<plug>(fzf-maps-i) | Insert mode mappings
|
|
||||||
<plug>(fzf-maps-x) | Visual mode mappings
|
|
||||||
<plug>(fzf-maps-o) | Operator-pending mappings
|
|
||||||
<plug>(fzf-complete-word) | `cat /usr/share/dict/words`
|
|
||||||
<plug>(fzf-complete-path) | Path completion using `find` (file + dir)
|
|
||||||
<plug>(fzf-complete-file) | File completion using `find`
|
|
||||||
<plug>(fzf-complete-line) | Line completion (all open buffers)
|
|
||||||
<plug>(fzf-complete-buffer-line) | Line completion (current buffer only)
|
|
||||||
---------------------------------+------------------------------------------
|
|
||||||
>
|
|
||||||
" Mapping selecting mappings
|
|
||||||
nmap <leader><tab> <plug>(fzf-maps-n)
|
|
||||||
xmap <leader><tab> <plug>(fzf-maps-x)
|
|
||||||
omap <leader><tab> <plug>(fzf-maps-o)
|
|
||||||
|
|
||||||
" Insert mode completion
|
|
||||||
imap <c-x><c-k> <plug>(fzf-complete-word)
|
|
||||||
imap <c-x><c-f> <plug>(fzf-complete-path)
|
|
||||||
imap <c-x><c-l> <plug>(fzf-complete-line)
|
|
||||||
<
|
|
||||||
|
|
||||||
COMPLETION FUNCTIONS *fzf-vim-completion-functions*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
-----------------------------------------+--------------------------------------
|
|
||||||
Function | Description ~
|
|
||||||
-----------------------------------------+--------------------------------------
|
|
||||||
`fzf#vim#complete#path(command, [spec])` | Path completion
|
|
||||||
`fzf#vim#complete#word([spec])` | Word completion
|
|
||||||
`fzf#vim#complete#line([spec])` | Line completion (all open buffers)
|
|
||||||
`fzf#vim#complete#buffer_line([spec])` | Line completion (current buffer only)
|
|
||||||
-----------------------------------------+--------------------------------------
|
|
||||||
>
|
|
||||||
" Path completion with custom source command
|
|
||||||
inoremap <expr> <c-x><c-f> fzf#vim#complete#path('fd')
|
|
||||||
inoremap <expr> <c-x><c-f> fzf#vim#complete#path('rg --files')
|
|
||||||
|
|
||||||
" Word completion with custom spec with popup layout option
|
|
||||||
inoremap <expr> <c-x><c-k> fzf#vim#complete#word({'window': { 'width': 0.2, 'height': 0.9, 'xoffset': 1 }})
|
|
||||||
<
|
|
||||||
|
|
||||||
CUSTOM COMPLETION *fzf-vim-custom-completion*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
`fzf#vim#complete` is a helper function for creating custom fuzzy completion
|
|
||||||
using fzf. If the first parameter is a command string or a Vim list, it will
|
|
||||||
be used as the source.
|
|
||||||
>
|
|
||||||
" Replace the default dictionary completion with fzf-based fuzzy completion
|
|
||||||
inoremap <expr> <c-x><c-k> fzf#vim#complete('cat /usr/share/dict/words')
|
|
||||||
<
|
|
||||||
For advanced uses, you can pass an options dictionary to the function. The set
|
|
||||||
of options is pretty much identical to that for `fzf#run` only with the
|
|
||||||
following exceptions:
|
|
||||||
|
|
||||||
- `reducer` (funcref)
|
|
||||||
- Reducer transforms the output lines of fzf into a single string value
|
|
||||||
- `prefix` (string or funcref; default: `\k*$`)
|
|
||||||
- Regular expression pattern to extract the completion prefix
|
|
||||||
- Or a function to extract completion prefix
|
|
||||||
- Both `source` and `options` can be given as funcrefs that take the completion
|
|
||||||
prefix as the argument and return the final value
|
|
||||||
- `sink` or `sink*` are ignored
|
|
||||||
>
|
|
||||||
" Global line completion (not just open buffers. ripgrep required.)
|
|
||||||
inoremap <expr> <c-x><c-l> fzf#vim#complete(fzf#wrap({
|
|
||||||
\ 'prefix': '^.*$',
|
|
||||||
\ 'source': 'rg -n ^ --color always',
|
|
||||||
\ 'options': '--ansi --delimiter : --nth 3..',
|
|
||||||
\ 'reducer': { lines -> join(split(lines[0], ':\zs')[2:], '') }}))
|
|
||||||
<
|
|
||||||
|
|
||||||
< Reducer example >___________________________________________________________~
|
|
||||||
*fzf-vim-reducer-example*
|
|
||||||
>
|
|
||||||
function! s:make_sentence(lines)
|
|
||||||
return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
inoremap <expr> <c-x><c-s> fzf#vim#complete({
|
|
||||||
\ 'source': 'cat /usr/share/dict/words',
|
|
||||||
\ 'reducer': function('<sid>make_sentence'),
|
|
||||||
\ 'options': '--multi --reverse --margin 15%,0',
|
|
||||||
\ 'left': 20})
|
|
||||||
<
|
|
||||||
|
|
||||||
STATUS LINE OF TERMINAL BUFFER *fzf-vim-status-line-of-terminal-buffer*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
When fzf starts in a terminal buffer (see {fzf/README-VIM.md}{12}), you may
|
|
||||||
want to customize the statusline of the containing buffer.
|
|
||||||
|
|
||||||
{12} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer
|
|
||||||
|
|
||||||
|
|
||||||
< Hide statusline >___________________________________________________________~
|
|
||||||
*fzf-vim-hide-statusline*
|
|
||||||
>
|
|
||||||
autocmd! FileType fzf set laststatus=0 noshowmode noruler
|
|
||||||
\| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
|
|
||||||
<
|
|
||||||
|
|
||||||
< Custom statusline >_________________________________________________________~
|
|
||||||
*fzf-vim-custom-statusline*
|
|
||||||
>
|
|
||||||
function! s:fzf_statusline()
|
|
||||||
" Override statusline as you like
|
|
||||||
highlight fzf1 ctermfg=161 ctermbg=251
|
|
||||||
highlight fzf2 ctermfg=23 ctermbg=251
|
|
||||||
highlight fzf3 ctermfg=237 ctermbg=251
|
|
||||||
setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
autocmd! User FzfStatusLine call <SID>fzf_statusline()
|
|
||||||
<
|
|
||||||
|
|
||||||
LICENSE *fzf-vim-license*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap:
|
|
@ -1,63 +0,0 @@
|
|||||||
:Ag fzf-vim.txt /*:Ag*
|
|
||||||
:BCommits fzf-vim.txt /*:BCommits*
|
|
||||||
:BLines fzf-vim.txt /*:BLines*
|
|
||||||
:BTags fzf-vim.txt /*:BTags*
|
|
||||||
:Buffers fzf-vim.txt /*:Buffers*
|
|
||||||
:Changes fzf-vim.txt /*:Changes*
|
|
||||||
:Colors fzf-vim.txt /*:Colors*
|
|
||||||
:Commands fzf-vim.txt /*:Commands*
|
|
||||||
:Commits fzf-vim.txt /*:Commits*
|
|
||||||
:Files fzf-vim.txt /*:Files*
|
|
||||||
:Filetypes fzf-vim.txt /*:Filetypes*
|
|
||||||
:GFiles fzf-vim.txt /*:GFiles*
|
|
||||||
:Helptags fzf-vim.txt /*:Helptags*
|
|
||||||
:History fzf-vim.txt /*:History*
|
|
||||||
:Jumps fzf-vim.txt /*:Jumps*
|
|
||||||
:LINE fzf-vim.txt /*:LINE*
|
|
||||||
:Lines fzf-vim.txt /*:Lines*
|
|
||||||
:Locate fzf-vim.txt /*:Locate*
|
|
||||||
:Maps fzf-vim.txt /*:Maps*
|
|
||||||
:Marks fzf-vim.txt /*:Marks*
|
|
||||||
:RG fzf-vim.txt /*:RG*
|
|
||||||
:Rg fzf-vim.txt /*:Rg*
|
|
||||||
:Snippets fzf-vim.txt /*:Snippets*
|
|
||||||
:Tags fzf-vim.txt /*:Tags*
|
|
||||||
:Windows fzf-vim.txt /*:Windows*
|
|
||||||
fzf-vim fzf-vim.txt /*fzf-vim*
|
|
||||||
fzf-vim-advanced-customization fzf-vim.txt /*fzf-vim-advanced-customization*
|
|
||||||
fzf-vim-command-level-options fzf-vim.txt /*fzf-vim-command-level-options*
|
|
||||||
fzf-vim-commands fzf-vim.txt /*fzf-vim-commands*
|
|
||||||
fzf-vim-completion-functions fzf-vim.txt /*fzf-vim-completion-functions*
|
|
||||||
fzf-vim-configuration-options-for-fzf-vim fzf-vim.txt /*fzf-vim-configuration-options-for-fzf-vim*
|
|
||||||
fzf-vim-configuration-options-of-the-base-plugin fzf-vim.txt /*fzf-vim-configuration-options-of-the-base-plugin*
|
|
||||||
fzf-vim-custom-completion fzf-vim.txt /*fzf-vim-custom-completion*
|
|
||||||
fzf-vim-custom-statusline fzf-vim.txt /*fzf-vim-custom-statusline*
|
|
||||||
fzf-vim-customization fzf-vim.txt /*fzf-vim-customization*
|
|
||||||
fzf-vim-dependencies fzf-vim.txt /*fzf-vim-dependencies*
|
|
||||||
fzf-vim-example-customizing-files-command fzf-vim.txt /*fzf-vim-example-customizing-files-command*
|
|
||||||
fzf-vim-example-git-grep-wrapper fzf-vim.txt /*fzf-vim-example-git-grep-wrapper*
|
|
||||||
fzf-vim-fzfheart-vim fzf-vim.txt /*fzf-vim-fzfheart-vim*
|
|
||||||
fzf-vim-hide-statusline fzf-vim.txt /*fzf-vim-hide-statusline*
|
|
||||||
fzf-vim-installation fzf-vim.txt /*fzf-vim-installation*
|
|
||||||
fzf-vim-license fzf-vim.txt /*fzf-vim-license*
|
|
||||||
fzf-vim-list-type-to-handle-multiple-selections fzf-vim.txt /*fzf-vim-list-type-to-handle-multiple-selections*
|
|
||||||
fzf-vim-mappings fzf-vim.txt /*fzf-vim-mappings*
|
|
||||||
fzf-vim-preview-window fzf-vim.txt /*fzf-vim-preview-window*
|
|
||||||
fzf-vim-rationale fzf-vim.txt /*fzf-vim-rationale*
|
|
||||||
fzf-vim-reducer-example fzf-vim.txt /*fzf-vim-reducer-example*
|
|
||||||
fzf-vim-status-line-of-terminal-buffer fzf-vim.txt /*fzf-vim-status-line-of-terminal-buffer*
|
|
||||||
fzf-vim-toc fzf-vim.txt /*fzf-vim-toc*
|
|
||||||
fzf-vim-using-vim-plug fzf-vim.txt /*fzf-vim-using-vim-plug*
|
|
||||||
fzf-vim-vim-functions fzf-vim.txt /*fzf-vim-vim-functions*
|
|
||||||
fzf-vim-why-you-should-use-fzf-on-vim fzf-vim.txt /*fzf-vim-why-you-should-use-fzf-on-vim*
|
|
||||||
g:fzf_vim fzf-vim.txt /*g:fzf_vim*
|
|
||||||
g:fzf_vim.buffers_jump fzf-vim.txt /*g:fzf_vim.buffers_jump*
|
|
||||||
g:fzf_vim.command_prefix fzf-vim.txt /*g:fzf_vim.command_prefix*
|
|
||||||
g:fzf_vim.commands_expect fzf-vim.txt /*g:fzf_vim.commands_expect*
|
|
||||||
g:fzf_vim.commits_log_options fzf-vim.txt /*g:fzf_vim.commits_log_options*
|
|
||||||
g:fzf_vim.listproc fzf-vim.txt /*g:fzf_vim.listproc*
|
|
||||||
g:fzf_vim.listproc_ag fzf-vim.txt /*g:fzf_vim.listproc_ag*
|
|
||||||
g:fzf_vim.listproc_rg fzf-vim.txt /*g:fzf_vim.listproc_rg*
|
|
||||||
g:fzf_vim.preview_bash fzf-vim.txt /*g:fzf_vim.preview_bash*
|
|
||||||
g:fzf_vim.preview_window fzf-vim.txt /*g:fzf_vim.preview_window*
|
|
||||||
g:fzf_vim.tags_command fzf-vim.txt /*g:fzf_vim.tags_command*
|
|
@ -1,163 +0,0 @@
|
|||||||
" Copyright (c) 2015 Junegunn Choi
|
|
||||||
"
|
|
||||||
" MIT License
|
|
||||||
"
|
|
||||||
" Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
" a copy of this software and associated documentation files (the
|
|
||||||
" "Software"), to deal in the Software without restriction, including
|
|
||||||
" without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
" distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
" permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
" the following conditions:
|
|
||||||
"
|
|
||||||
" The above copyright notice and this permission notice shall be
|
|
||||||
" included in all copies or substantial portions of the Software.
|
|
||||||
"
|
|
||||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
if exists('g:loaded_fzf_vim')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_fzf_vim = 1
|
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
let s:is_win = has('win32') || has('win64')
|
|
||||||
|
|
||||||
function! s:conf(name, default)
|
|
||||||
let conf = get(g:, 'fzf_vim', {})
|
|
||||||
let val = get(conf, a:name, get(g:, 'fzf_' . a:name, a:default))
|
|
||||||
return val
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:defs(commands)
|
|
||||||
let prefix = s:conf('command_prefix', '')
|
|
||||||
if prefix =~# '^[^A-Z]'
|
|
||||||
echoerr 'g:fzf_command_prefix must start with an uppercase letter'
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
for command in a:commands
|
|
||||||
let name = ':'.prefix.matchstr(command, '\C[A-Z]\S\+')
|
|
||||||
if 2 != exists(name)
|
|
||||||
execute substitute(command, '\ze\C[A-Z]', prefix, '')
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:defs([
|
|
||||||
\'command! -bang -nargs=? -complete=dir Files call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)',
|
|
||||||
\'command! -bang -nargs=? GitFiles call fzf#vim#gitfiles(<q-args>, fzf#vim#with_preview(<q-args> == "?" ? { "placeholder": "" } : {}), <bang>0)',
|
|
||||||
\'command! -bang -nargs=? GFiles call fzf#vim#gitfiles(<q-args>, fzf#vim#with_preview(<q-args> == "?" ? { "placeholder": "" } : {}), <bang>0)',
|
|
||||||
\'command! -bar -bang -nargs=? -complete=buffer Buffers call fzf#vim#buffers(<q-args>, fzf#vim#with_preview({ "placeholder": "{1}" }), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* Lines call fzf#vim#lines(<q-args>, <bang>0)',
|
|
||||||
\'command! -bang -nargs=* BLines call fzf#vim#buffer_lines(<q-args>, <bang>0)',
|
|
||||||
\'command! -bar -bang Colors call fzf#vim#colors(<bang>0)',
|
|
||||||
\'command! -bang -nargs=+ -complete=dir Locate call fzf#vim#locate(<q-args>, fzf#vim#with_preview(), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* Ag call fzf#vim#ag(<q-args>, fzf#vim#with_preview(), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* Rg call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case -- ".fzf#shellescape(<q-args>), fzf#vim#with_preview(), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* RG call fzf#vim#grep2("rg --column --line-number --no-heading --color=always --smart-case -- ", <q-args>, fzf#vim#with_preview(), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* Tags call fzf#vim#tags(<q-args>, fzf#vim#with_preview({ "placeholder": "--tag {2}:{-1}:{3..}" }), <bang>0)',
|
|
||||||
\'command! -bang -nargs=* BTags call fzf#vim#buffer_tags(<q-args>, fzf#vim#with_preview({ "placeholder": "{2}:{3..}" }), <bang>0)',
|
|
||||||
\'command! -bar -bang Snippets call fzf#vim#snippets(<bang>0)',
|
|
||||||
\'command! -bar -bang Commands call fzf#vim#commands(<bang>0)',
|
|
||||||
\'command! -bar -bang Jumps call fzf#vim#jumps(<bang>0)',
|
|
||||||
\'command! -bar -bang Marks call fzf#vim#marks(<bang>0)',
|
|
||||||
\'command! -bar -bang Changes call fzf#vim#changes(<bang>0)',
|
|
||||||
\'command! -bar -bang Helptags call fzf#vim#helptags(fzf#vim#with_preview({ "placeholder": "--tag {2}:{3}:{4}" }), <bang>0)',
|
|
||||||
\'command! -bar -bang Windows call fzf#vim#windows(fzf#vim#with_preview({ "placeholder": "{2}" }), <bang>0)',
|
|
||||||
\'command! -bar -bang -nargs=* -range=% -complete=file Commits let b:fzf_winview = winsaveview() | <line1>,<line2>call fzf#vim#commits(<q-args>, fzf#vim#with_preview({ "placeholder": "" }), <bang>0)',
|
|
||||||
\'command! -bar -bang -nargs=* -range=% BCommits let b:fzf_winview = winsaveview() | <line1>,<line2>call fzf#vim#buffer_commits(<q-args>, fzf#vim#with_preview({ "placeholder": "" }), <bang>0)',
|
|
||||||
\'command! -bar -bang Maps call fzf#vim#maps("n", <bang>0)',
|
|
||||||
\'command! -bar -bang Filetypes call fzf#vim#filetypes(<bang>0)',
|
|
||||||
\'command! -bang -nargs=* History call s:history(<q-args>, fzf#vim#with_preview(), <bang>0)'])
|
|
||||||
|
|
||||||
function! s:history(arg, extra, bang)
|
|
||||||
let bang = a:bang || a:arg[len(a:arg)-1] == '!'
|
|
||||||
if a:arg[0] == ':'
|
|
||||||
call fzf#vim#command_history(bang)
|
|
||||||
elseif a:arg[0] == '/'
|
|
||||||
call fzf#vim#search_history(bang)
|
|
||||||
else
|
|
||||||
call fzf#vim#history(a:extra, bang)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! fzf#complete(...)
|
|
||||||
return call('fzf#vim#complete', a:000)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if (has('nvim') || has('terminal') && has('patch-8.0.995')) && (s:conf('statusline', 1) || s:conf('nvim_statusline', 1))
|
|
||||||
function! s:fzf_restore_colors()
|
|
||||||
if exists('#User#FzfStatusLine')
|
|
||||||
doautocmd User FzfStatusLine
|
|
||||||
else
|
|
||||||
if $TERM !~ "256color"
|
|
||||||
highlight default fzf1 ctermfg=1 ctermbg=8 guifg=#E12672 guibg=#565656
|
|
||||||
highlight default fzf2 ctermfg=2 ctermbg=8 guifg=#BCDDBD guibg=#565656
|
|
||||||
highlight default fzf3 ctermfg=7 ctermbg=8 guifg=#D9D9D9 guibg=#565656
|
|
||||||
else
|
|
||||||
highlight default fzf1 ctermfg=161 ctermbg=238 guifg=#E12672 guibg=#565656
|
|
||||||
highlight default fzf2 ctermfg=151 ctermbg=238 guifg=#BCDDBD guibg=#565656
|
|
||||||
highlight default fzf3 ctermfg=252 ctermbg=238 guifg=#D9D9D9 guibg=#565656
|
|
||||||
endif
|
|
||||||
setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:fzf_vim_term()
|
|
||||||
if get(w:, 'airline_active', 0)
|
|
||||||
let w:airline_disabled = 1
|
|
||||||
autocmd BufWinLeave <buffer> let w:airline_disabled = 0
|
|
||||||
endif
|
|
||||||
autocmd WinEnter,ColorScheme <buffer> call s:fzf_restore_colors()
|
|
||||||
|
|
||||||
setlocal nospell
|
|
||||||
call s:fzf_restore_colors()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
augroup _fzf_statusline
|
|
||||||
autocmd!
|
|
||||||
autocmd FileType fzf call s:fzf_vim_term()
|
|
||||||
augroup END
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:fzf#vim#buffers')
|
|
||||||
let g:fzf#vim#buffers = {}
|
|
||||||
endif
|
|
||||||
|
|
||||||
augroup fzf_buffers
|
|
||||||
autocmd!
|
|
||||||
if exists('*reltimefloat')
|
|
||||||
autocmd BufWinEnter,WinEnter * let g:fzf#vim#buffers[bufnr('')] = reltimefloat(reltime())
|
|
||||||
else
|
|
||||||
autocmd BufWinEnter,WinEnter * let g:fzf#vim#buffers[bufnr('')] = localtime()
|
|
||||||
endif
|
|
||||||
autocmd BufDelete * silent! call remove(g:fzf#vim#buffers, expand('<abuf>'))
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
inoremap <expr> <plug>(fzf-complete-word) fzf#vim#complete#word()
|
|
||||||
if s:is_win
|
|
||||||
inoremap <expr> <plug>(fzf-complete-path) fzf#vim#complete#path('dir /s/b')
|
|
||||||
inoremap <expr> <plug>(fzf-complete-file) fzf#vim#complete#path('dir /s/b/a:-d')
|
|
||||||
else
|
|
||||||
inoremap <expr> <plug>(fzf-complete-path) fzf#vim#complete#path("find . -path '*/\.*' -prune -o -print \| sed '1d;s:^..::'")
|
|
||||||
inoremap <expr> <plug>(fzf-complete-file) fzf#vim#complete#path("find . -path '*/\.*' -prune -o -type f -print -o -type l -print \| sed 's:^..::'")
|
|
||||||
endif
|
|
||||||
inoremap <expr> <plug>(fzf-complete-file-ag) fzf#vim#complete#path('ag -l -g ""')
|
|
||||||
inoremap <expr> <plug>(fzf-complete-line) fzf#vim#complete#line()
|
|
||||||
inoremap <expr> <plug>(fzf-complete-buffer-line) fzf#vim#complete#buffer_line()
|
|
||||||
|
|
||||||
nnoremap <silent> <plug>(fzf-maps-n) :<c-u>call fzf#vim#maps('n', 0)<cr>
|
|
||||||
inoremap <silent> <plug>(fzf-maps-i) <c-o>:call fzf#vim#maps('i', 0)<cr>
|
|
||||||
xnoremap <silent> <plug>(fzf-maps-x) :<c-u>call fzf#vim#maps('x', 0)<cr>
|
|
||||||
onoremap <silent> <plug>(fzf-maps-o) <c-c>:<c-u>call fzf#vim#maps('o', 0)<cr>
|
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
|
||||||
unlet s:cpo_save
|
|
||||||
|
|
15
.vim/vimrc
15
.vim/vimrc
@ -120,21 +120,6 @@ inoremap <tab> <C-R>=CleverTab()<CR>
|
|||||||
"packadd termdebug
|
"packadd termdebug
|
||||||
"let g:termdebugger = "egdb"
|
"let g:termdebugger = "egdb"
|
||||||
|
|
||||||
" ###########################################
|
|
||||||
" # VIM FZF
|
|
||||||
" ###########################################
|
|
||||||
let g:fzf_layout = { 'down': '60%' }
|
|
||||||
let g:fzf_action = { 'ctrl-t': 'tab split', 'ctrl-x': 'vsplit' }
|
|
||||||
|
|
||||||
noreabbrev <expr> ts getcmdtype() == ":" && getcmdline() == 'ts' ? 'FZFTselect' : 'ts'
|
|
||||||
nmap gt <Plug>(fzf_tags)
|
|
||||||
|
|
||||||
nnoremap <leader>g :RG <C-R>=expand("<cword>")<CR><CR>
|
|
||||||
nnoremap <leader>f :Files<CR>
|
|
||||||
nnoremap <leader>b :Buffers<CR>
|
|
||||||
nnoremap <leader>t :Tags<CR>
|
|
||||||
nnoremap <leader>h :History<CR>
|
|
||||||
|
|
||||||
" ###########################################
|
" ###########################################
|
||||||
" # TAGBAR
|
" # TAGBAR
|
||||||
" ###########################################
|
" ###########################################
|
||||||
|
Loading…
Reference in New Issue
Block a user