从 vim 中的书签目录模糊设置工作目录
Fuzzy set working directory from bookmarked directories in vim
有时我需要将当前工作目录更改到不同的位置(例如在不同的项目中搜索)。例如,这可以通过 lcd /path/to/dir
来实现。
然而,写出路径通常太慢,而且我经常发现自己使用相同的位置。
理想情况下,我会有一个模糊查找器,例如 fzf 弹出一个带有书签目录的预设列表供您选择。模糊搜索将允许快速 select 并更改工作目录(显然无需更改调用它的当前文件)。
不久,我正在寻找 vim 的 fzf-marks 工具的等效项。
我的 ctrlp 会议,特别是 cache_dir
和 let g:ctrlp_cmd = 'CtrlPMixed'
" Open buffer here
let g:ctrlp_switch_buffer = ''
" Cache
let g:ctrlp_cache_dir ='$h/.cache/ctrlp'
" replace $home by ~ in cache
let g:ctrlp_tilde_homedir = 1
let g:ctrlp_mruf_max = 50000
" Use ag <- grep
" if executable('ag')
" let g:ctrl_user_command = 'ag %s -l --nocolor -g ""'
" endif
" Ignore
let g:ctrlp_cutom_ignore = {
\ 'dir': '\.git$,undo/',
\ 'file': 'log'
\ }
if $os !=? 'termux'
" E like edit and closer to ctrl + <c-p> used to paste
let g:ctrlp_map = '<C-E>'
vnoremap <C-E> :<C-u>CtrlPMixed<CR>
else
" Because move up gives c-e
let g:ctrlp_map = ',e'
endif
" Keep cache
let g:ctrlp_clear_cache_on_exit = 0
" Mixed to search in MRU, FIles, Buffers
let g:ctrlp_types = ['buf', 'mru', 'fil']
let g:ctrlp_cmd = 'CtrlPMixed'
" Faster listing <- vim.globpath
if $os ==? 'windows'
let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d'
else
let g:ctrlp_user_command = 'find %s -type f'
endif
在做了更多 reading 之后,我实际上找到了一种将 fzf-marks 集成到 vim 中的方法(在没有 fzf-marks 的情况下也能很好地工作)。
您只需要一个列出书签目录的文件,并用一个变量指向它,例如FZF_MARKS_FILE="${HOME}/.fzf-marks
此文件格式如下,cat $FZF_MARKS_FILE
:
project1 : /home/user/project1/code
project2 : /home/user/project2/code
vimswapdir : /home/user/.local/share/nvim/swap
rlibsloc : /home/user/R/x86_64-pc-linux-gnu-library
trash : /home/user/.local/share/Trash/files
vim-plugins : /home/user/.config/nvim/plugged
现在的想法是像在 fzf-marks jump function 中那样加载和解析它,并使其模糊搜索以便快速访问定义函数 FM
:
command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$//" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0))
现在调用 :FM
会弹出一个 fzf window,其中的书签目录来自 select。
用例(我自己经常发现):
假设我已经开始在某处编辑一个文件(比如在 ~/myproject
中),但需要搜索 (:grep
) 包含单词 foo
的句子,我知道它是在 /home/user/project1/code
内的一个文件中。我一直不太记得 project1 的路径,只是它的路径中有 code
。出于这个原因,我已将其加入书签(见上文)。
以前,必须在某处查找路径并将其输入 vim,即输入 :grep foo /home/user/project1/code
。现在这个工作更快,如下所示:
:FM
in vim,调出书签目录列表,键入 code
,例如co
快速限定搜索:
select第一行确实将当前目录设置为project1
(可以通过:pwd
确认),但将编辑后的文件保持原样。现在,:grep! foo
确实在 project1 中进行了递归搜索。
完成搜索后,我可以将工作目录重置为当前文件目录 :cd %:h
或者它的根目录 rooter: :Rooter
。
有时我需要将当前工作目录更改到不同的位置(例如在不同的项目中搜索)。例如,这可以通过 lcd /path/to/dir
来实现。
然而,写出路径通常太慢,而且我经常发现自己使用相同的位置。
理想情况下,我会有一个模糊查找器,例如 fzf 弹出一个带有书签目录的预设列表供您选择。模糊搜索将允许快速 select 并更改工作目录(显然无需更改调用它的当前文件)。
不久,我正在寻找 vim 的 fzf-marks 工具的等效项。
我的 ctrlp 会议,特别是 cache_dir
和 let g:ctrlp_cmd = 'CtrlPMixed'
" Open buffer here
let g:ctrlp_switch_buffer = ''
" Cache
let g:ctrlp_cache_dir ='$h/.cache/ctrlp'
" replace $home by ~ in cache
let g:ctrlp_tilde_homedir = 1
let g:ctrlp_mruf_max = 50000
" Use ag <- grep
" if executable('ag')
" let g:ctrl_user_command = 'ag %s -l --nocolor -g ""'
" endif
" Ignore
let g:ctrlp_cutom_ignore = {
\ 'dir': '\.git$,undo/',
\ 'file': 'log'
\ }
if $os !=? 'termux'
" E like edit and closer to ctrl + <c-p> used to paste
let g:ctrlp_map = '<C-E>'
vnoremap <C-E> :<C-u>CtrlPMixed<CR>
else
" Because move up gives c-e
let g:ctrlp_map = ',e'
endif
" Keep cache
let g:ctrlp_clear_cache_on_exit = 0
" Mixed to search in MRU, FIles, Buffers
let g:ctrlp_types = ['buf', 'mru', 'fil']
let g:ctrlp_cmd = 'CtrlPMixed'
" Faster listing <- vim.globpath
if $os ==? 'windows'
let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d'
else
let g:ctrlp_user_command = 'find %s -type f'
endif
在做了更多 reading 之后,我实际上找到了一种将 fzf-marks 集成到 vim 中的方法(在没有 fzf-marks 的情况下也能很好地工作)。
您只需要一个列出书签目录的文件,并用一个变量指向它,例如FZF_MARKS_FILE="${HOME}/.fzf-marks
此文件格式如下,cat $FZF_MARKS_FILE
:
project1 : /home/user/project1/code
project2 : /home/user/project2/code
vimswapdir : /home/user/.local/share/nvim/swap
rlibsloc : /home/user/R/x86_64-pc-linux-gnu-library
trash : /home/user/.local/share/Trash/files
vim-plugins : /home/user/.config/nvim/plugged
现在的想法是像在 fzf-marks jump function 中那样加载和解析它,并使其模糊搜索以便快速访问定义函数 FM
:
command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$//" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0))
现在调用 :FM
会弹出一个 fzf window,其中的书签目录来自 select。
用例(我自己经常发现):
假设我已经开始在某处编辑一个文件(比如在 ~/myproject
中),但需要搜索 (:grep
) 包含单词 foo
的句子,我知道它是在 /home/user/project1/code
内的一个文件中。我一直不太记得 project1 的路径,只是它的路径中有 code
。出于这个原因,我已将其加入书签(见上文)。
以前,必须在某处查找路径并将其输入 vim,即输入 :grep foo /home/user/project1/code
。现在这个工作更快,如下所示:
:FM
in vim,调出书签目录列表,键入 code
,例如co
快速限定搜索:
select第一行确实将当前目录设置为project1
(可以通过:pwd
确认),但将编辑后的文件保持原样。现在,:grep! foo
确实在 project1 中进行了递归搜索。
完成搜索后,我可以将工作目录重置为当前文件目录 :cd %:h
或者它的根目录 rooter: :Rooter
。