Рабочее решение для FZF последних файлов в Vim?

у меня проблема с поиском правильного решения для последних файлов в FZF vim plugin.

этот плагин должен иметь такие функции, как:

  • показать файлы, открытые в текущем сеансе 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, чтобы получить текущий буфер.

вы нашли рабочее решение для FZFMru в VIM?

3 ответов


Я нашел последний плагин Junegunn.

Plug 'junegunn/fzf.vim'

оно покрывает случай.

просто добавить

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

Спасибо Junegunn :)


одним из возможных решений является использование neomru плагин, который сохранит ваши последние файлы в кэш, расположенный по адресу ~/.cache/neomru/file.

после установки neomru плагин с вашим предпочтительным менеджером плагинов, вы можете определить отображение для поиска файла кэша, например:

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

проверить https://github.com/junegunn/fzf/wiki/Examples - (ВИМ). Там много интересных вещей, включая MRU, поиск тегов и многое другое. Junegunn реализовал MRU просто как:

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