Рабочий каталог с нечетким набором из закладок в vim
Иногда мне нужно изменить текущий рабочий каталог в другое место (например, для поиска в другом проекте). Это может быть достигнуто, например, с помощьюlcd /path/to/dir
. Однако написание путей часто происходит слишком медленно, и я часто использую одни и те же места. В идеале у меня был бы нечеткий поисковик, такой как fzf, с предустановленным списком закладок каталогов на выбор. Нечеткий поиск позволит быстро выбрать и изменить рабочий каталог (очевидно, без изменения текущего файла, из которого он был вызван).
Вскоре я ищу аналог инструмента fzf-mark для vim.
2 ответа
Сделав еще несколько чтения, я нашел на самом деле способ интеграции в fzf-метки Into Vim, (которые также работают хорошо без fzf-меток).
Все, что вам нужно, это список файлов, содержащих каталоги с закладками, с указывающей на них переменной, например 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-Mark, и сделать его нечетким поиском для быстрого доступа, определяя функцию.FM
:
command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$/\1/" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0))
Вызов :FM
теперь появляется окно fzf с каталогами, отмеченными закладками, для выбора.
Вариант использования (который я часто нахожу сам):
Скажем, я где-то начал редактировать файл (скажем, в ~/myproject
), но нужно было искать (:grep
) для предложения, содержащего слово foo
который, как я знаю, находится в файле внутри /home/user/project1/code
. Я никогда не могу вспомнить путь project1, просто онcode
на своем пути. По этой причине я добавил его в закладки (см. Выше).
Раньше приходилось где-то искать путь и вводить его в vim, т.е. набирать :grep foo /home/user/project1/code
. Теперь это работает быстрее:
:FM
в vim, вызывая список каталогов с закладками, набирая биты code
, например co
быстро ограничивает поиск:
выбор первой строки устанавливает текущий каталог на project1
(что может быть подтверждено :pwd
), но оставив отредактированный файл как есть. Сейчас же,:grep! foo
действительно выполняет рекурсивный поиск в project1.
Завершив поиск, я могу сбросить рабочий каталог до текущего каталога файлов :cd %:h
или это рут с рутером::Rooter
.
Моя ctrlp conf, особенно для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