【问题标题】:vim sbuffer with fuzzy search带有模糊搜索的vim sbuffer
【发布时间】:2020-05-06 14:24:37
【问题描述】:

我通常在 vim(或 neovim)的不同窗口和选项卡中打开大量文件。要跳转到打开文件的窗口,我使用 :sbuffer。为此,我输入了文件名的请求并使用 .我想以模糊搜索的方式找到文件的名称。

我怎么看,按 ,输入文件名的一部分,直到看到模糊搜索找到的文件,然后按 。如果文件已经在任何选项卡的窗口中打开,vim 会移动到那里而不是在实际窗口中打开它。

您知道如何使用任何模糊搜索插件来实现这一目标吗?我不担心文件未打开时的行为,因为通常我在打开文件时会手动处理拆分。

谢谢!

【问题讨论】:

    标签: vim fuzzy-search


    【解决方案1】:

    Fzf 可能是您最好的选择之一。 你需要fzf.vim 和fzf。

    另外,在 fzf 主仓库中有一个用于 fzf vim 的 readme(是的......)。

    我不记得我在哪里找到的,但这是我从某处的 Fzf 手册中复制的配置(它只是稍微调整了一下):

    let g:fzf_command_prefix = 'Fzf'
    let g:fzf_buffers_jump = 1      " [Buffers] to existing split
    
    function! s:build_location_list(lines) abort
        call setloclist(0, map(copy(a:lines), '{ "filename": v:val }'))
        lopen
    endfunction
    
    function! s:build_quickfix_list(lines) abort
        call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
        copen
    endfunction
    
    " An action can be a reference to a function that processes selected lines
    let g:fzf_action = {
                \ 'ctrl-l': function('s:build_quickfix_list'),
                \ 'ctrl-r': function('s:build_location_list'),
                \ 'ctrl-t': 'tab split',
                \ 'ctrl-x': 'split',
                \ 'ctrl-v': 'vsplit'}
    " \ 'ctrl-o': '<S-tab>',
    " \ 'ctrl-i': 'insert_match',
    
    " function! s:insert_match(lines) abort
    "   <c-r>=echo('a:lines')<cr>
    " endfunction
    
    nnoremap <leader>ff :FzfFiles $HOME<cr>
    nnoremap <leader><c-f> :FzfFiles .<cr>
    nnoremap <leader>F :FzfFiles /<cr>
    nnoremap <leader>fb :FzfBuffers<cr>
    nnoremap <leader>b :FzfBuffers<cr>
    nnoremap <leader>fw :FzfWindows<cr>
    nnoremap <leader>ft :FzfTags<cr>
    nnoremap <leader>f<c-t> :FzfBTags<cr>
    nnoremap <leader>fc :FzfCommit<cr>
    nnoremap <leader>f<c-c> :FzfBCommit<cr>
    nnoremap <leader>fg :FzfGFiles?<cr>
    nnoremap <leader>f<c-g> :FzfGFiles<cr>
    nnoremap <leader>fl :FzfLines<cr>
    nnoremap <leader>f<c-l> :FzfBLines<cr>
    nnoremap <leader>f; :FzfHistory:<cr>
    nnoremap <leader>f/ :FzfHistory/<cr>
    nnoremap <leader>fh :FzfHistory<cr>
    nnoremap <leader>fm :FzfHelptags<cr>
    nnoremap <leader>fs <esc>:FzfSnippets<cr>
    nnoremap <leader>fr <esc>:Rg<cr>
    inoremap <c-x><c-s> <c-o>:FzfSnippets<cr>
    
    " Enable per-command history.
    " CTRL-N and CTRL-P will be automatically bound to next-history and
    " previous-history instead of down and up. If you don't like the change,
    " explicitly bind the keys to down and up in your $FZF_DEFAULT_OPTS.
    let g:fzf_history_dir = '~/.local/share/fzf-history'
    
    let g:fzf_tags_command = 'ctags -R'
    " Border color
    let g:fzf_layout = {'up':'~90%', 'window': { 'width': 0.8, 'height': 0.8,'yoffset':0.5,'xoffset': 0.5, 'highlight': 'Todo', 'border': 'rounded' } }
    
    let $FZF_DEFAULT_OPTS = '--layout=reverse --info=inline --bind "ctrl-o:toggle+up,ctrl-space:toggle-preview"'
    let $FZF_DEFAULT_COMMAND="rg --files --hidden --glob '!.git/**'"
    "-g '!{node_modules,.git}'
    
    " Customize fzf colors to match your color scheme
    let g:fzf_colors =
    \ { 'fg':      ['fg', 'Normal'],
        \ 'bg':      ['bg', 'Normal'],
        \ 'gutter':  ['bg', 'Normal'],
        \ 'hl':      ['fg', 'Comment'],
        \ 'fg+':     ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
        \ 'bg+':     ['bg', 'Visual', 'CursorColumn'],
        \ 'hl+':     ['fg', 'Statement'],
        \ 'info':    ['fg', 'PreProc'],
        \ 'border':  ['fg', 'vertsplit'],
        \ 'prompt':  ['fg', 'Conditional'],
        \ 'pointer': ['fg', 'Exception'],
        \ 'marker':  ['fg', 'Keyword'],
        \ 'spinner': ['fg', 'Label'],
        \ 'header':  ['fg', 'Comment'] }
        " \ 'border':  ['fg', 'Conditional'],
    
    "Get Files
    command! -bang -nargs=? -complete=dir Files
            \ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), <bang>0)
    
    " Get text in files with Rg
    command! -bang -nargs=* Rg
        \ call fzf#vim#grep(
        \   "rg --column --line-number --no-heading --color=always --smart-case --glob '!.git/**' ".shellescape(<q-args>), 1,
        \   fzf#vim#with_preview(), <bang>0)
    
    " Ripgrep advanced
    function! RipgrepFzf(query, fullscreen) abort
        let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case %s || true'
        let initial_command = printf(command_fmt, shellescape(a:query))
        let reload_command = printf(command_fmt, '{q}')
        let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]}
        call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen)
    endfunction
    
    command! -nargs=* -bang RG call RipgrepFzf(<q-args>, <bang>0)
    
    " Git grep
    command! -bang -nargs=* GGrep
        \ call fzf#vim#grep(
        \   'git grep --line-number '.shellescape(<q-args>), 0,
        \   fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
    

    我只对它进行了一点微调,但有了一些你可能会喜欢的东西,因为它是 set switchbuf=usetab(或 useopen)的 fzf 范例。它让 Vim 使用缓冲区已经打开的窗口,而不是在当前窗口中打开它。

    let g:fzf_buffers_jump = 1      " [Buffers] to existing split
    

    希望对你有帮助!

    【讨论】:

    • 嗨,谢谢,这行得通(我必须更新到 vim 8.2 才能弹出窗口),我可以用 :FzfBuffers 做我想要的事情
    • 太棒了!如果它解决了您的问题,请考虑接受此答案。
    • 现在已经完成了,抱歉没有标记它,我是新来的(发帖)这里。
    • 没关系,别担心...谢谢你这样做:)
    【解决方案2】:

    我个人使用FZF plugin 进行所有模糊搜索。

    这是一段归档您所问内容的代码:

    set switchbuf=useopen,usetab
    function! HandleFZFSink(filename)
        echo a:filename
        try 
            exe "sbuffer " . a:filename
        catch
            exe "edit " . a:filename
        endtry
    endfunction
    function! FZFTmp()
        let cmd = 'ls --color=never 2> /dev/null'
        silent! exe fzf#run({'source': cmd, 'sink': function('HandleFZFSink'), 'down':'40%'})
    endfunction
    nnoremap <silent> , :<C-u>call FZFTmp()<CR>
    

    【讨论】:

    • 感谢您的回复。我安装了 FZF 插件并尝试了你的脚本。我不得不将重映射修改为“nnoremap :call FZFTmp()”,这会打开文件搜索,但是当按下回车键时没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2021-07-09
    • 2014-06-11
    相关资源
    最近更新 更多