Vim 中 FZF 最新文件的工作解决方案?
Working solution for FZF most recent files in Vim?
我在使用 FZF Vim 插件为最近使用的文件找到合适的解决方案时遇到问题。
此插件应具有以下功能:
- 显示在当前 vim 会话中打开的文件(如缓冲区)
- 过滤文件,例如 NERD_tree、逃亡者
我尝试了两种解决方案
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 的有效解决方案?
一种可能的解决方案是利用 neomru 插件,它将您最近访问的文件保存到位于 ~/.cache/neomru/file
.
的缓存中
使用您喜欢的插件管理器安装 neomru
插件后,您可以定义一个映射来搜索缓存文件,例如:
nnoremap <silent> <Leader>m :call fzf#run({
\ 'source': 'sed "1d" $HOME/.cache/neomru/file',
\ 'sink': 'e '
\ })<CR>
我找到了一个最新的 Jugunn 插件。
Plug 'junegunn/fzf.vim'
涵盖一个案例。
只需添加
nmap <silent> <leader>m :History<CR>
谢谢朱古恩 :)
查看 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%'})
我在使用 FZF Vim 插件为最近使用的文件找到合适的解决方案时遇到问题。
此插件应具有以下功能:
- 显示在当前 vim 会话中打开的文件(如缓冲区)
- 过滤文件,例如 NERD_tree、逃亡者
我尝试了两种解决方案
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 的有效解决方案?
一种可能的解决方案是利用 neomru 插件,它将您最近访问的文件保存到位于 ~/.cache/neomru/file
.
使用您喜欢的插件管理器安装 neomru
插件后,您可以定义一个映射来搜索缓存文件,例如:
nnoremap <silent> <Leader>m :call fzf#run({
\ 'source': 'sed "1d" $HOME/.cache/neomru/file',
\ 'sink': 'e '
\ })<CR>
我找到了一个最新的 Jugunn 插件。
Plug 'junegunn/fzf.vim'
涵盖一个案例。
只需添加
nmap <silent> <leader>m :History<CR>
谢谢朱古恩 :)
查看 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%'})