FZF最新文件的工作解决方案在Vim?

时间:2015-07-28 14:50:09

标签: vim vim-plugin mru neovim fzf

我在为FZF vim插件中的最新文件找到合适的解决方案时遇到问题。

此插件应具有以下功能:

  • 显示在当前vim会话中打开的文件(如缓冲区)
  • 过滤NERD_tree,fugitive等文件

我尝试了两种解决方案

command! FZFMru call fzf#run({
\ 'source':  reverse(s:all_files()),
\ 'sink':    'edit',
\ 'options': '-m --no-sort -x',
\ 'down':    '40%' })

function! s:all_files()
  return extend(
  \ filter(copy(v:oldfiles),
  \        "v:val !~ 'fugitive:\\|\\.svg|NERD_tree\\|^/tmp/\\|.git/'"),
  \ map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), 'bufname(v:val)'))
endfunction

这个在开放会话期间有效,但是当我重新启动vim时,我看不到所有上次打开的文件。

command! FZFMru call s:fzf_wrap({
    \'source':  'bash -c "'.
    \               'echo -e \"'.s:old_files().'\";'.
    \               'ag -l -g \"\"'.
    \           '"',
    \})

function! s:fzf_wrap(dict)
    let defaults = {
    \'sink' : 'edit',
    \'options' : '+s -e -m',
    \'tmux_height': '40%',
    \}
    call extend(a:dict, defaults, 'keep')
    call fzf#run(a:dict)
endfunction

function! s:old_files()
    let oldfiles = copy(v:oldfiles)
    call filter(oldfiles, 'v:val !~ "fugitive"')
    call filter(oldfiles, 'v:val !~ "NERD_tree"')
    call filter(oldfiles, 'v:val !~ "^/tmp/"')
    call filter(oldfiles, 'v:val !~ ".git/"')
    call filter(oldfiles, 'v:val !~ ".svg"')
    return join(oldfiles, '\n')
endfunction

此解决方案可正确过滤文件,但仅适用于在上一个会话中打开的文件。所以我需要重新启动vim以获取当前缓冲区。

您是否在VIM中找到了FZFMru的工作解决方案?

3 个答案:

答案 0 :(得分:24)

我找到了最新的Junegunn插件。

Plug 'junegunn/fzf.vim'

它涵盖了一个案例。

添加

nmap <silent> <leader>m :History<CR>

感谢Junegunn:)

答案 1 :(得分:7)

一种可能的解决方案是利用neomru插件,该插件会将您最近访问过的文件保存到位于~/.cache/neomru/file的缓存中。

使用首选插件管理器安装neomru插件后,您可以定义搜索缓存文件的映射,例如:

nnoremap <silent> <Leader>m :call fzf#run({
\   'source': 'sed "1d" $HOME/.cache/neomru/file',
\   'sink': 'e '
\ })<CR>

答案 2 :(得分:1)

结帐https://github.com/junegunn/fzf/wiki/Examples-(vim)。那里有很多很酷的东西,包括MRU,标签搜索等等。 Junegunn将MRU简化为:

command! FZFMru call fzf#run({
\  'source':  v:oldfiles,
\  'sink':    'e',
\  'options': '-m -x +s',
\  'down':    '40%'})