ВВим, когда я нахожусь в режиме вставки и хочу использовать автодополнение имени файла, я хочу, чтобы путь поиска был относительным к текущему файлу, а не к текущему рабочему каталогу. Например, если в режиме вставки я ввожу следующее:
./
^X^F
Меню завершения показывает мне файлы в:pwd
, но я бы предпочел увидеть файлы в%:p:h
перечислены.
Есть ли возможность исправить это, и если нет, то что вы можете предложить в качестве обходного пути?
решение1
Если вы
:set autochdir
вы получите желаемое поведение. Однако, если вам нужно сохранить рабочий каталог (например, чтобы легко открывать другие файлы проекта), вам придется сохранить / восстановить CWD с помощью autocmds:
:autocmd InsertEnter * let save_cwd = getcwd() | set autochdir
:autocmd InsertLeave * set noautochdir | execute 'cd' fnameescape(save_cwd)
решение2
@Инго Каркат'sотвечатьэто хорошо, но я немного колеблюсь, стоит ли это вставлятьмой vimrc, потому что дажестраница помощи для'autochdir'
предупреждает, что его использование приведет к поломке некоторых плагинов.
Я придумал собственное решение, которое может оказаться весьма узким для моих вариантов использования:
Я планирую извлечь его в функцию и установить переменную для pwd до того, как будет выдана команда lcs, а затем сбросить ее в какой-то момент времени. Было бы неплохо, если бы было меню autocmd.
Я могу использовать это или нет, но я подумал, что стоит предложить другое решение.
решение3
У меня в .vimrc
:
" [relative autocomplete]
" ==============================================================================
" Vim's file autocomplete (C-X C-F) works only in an absolute path (using the
" current working directory) as base. But in most languages, you want to use
" relative imports, and file autocomplete doesn't work there. For that, I use
" <C-X><C-X><C-F>:
function! s:EnableRelativeAutocomplete() abort
let b:relative_autocomplete_cleanup_pending = 1
lcd %:p:h
endfunction
function! s:DisableRelativeAutocomplete() abort
if exists('b:relative_autocomplete_cleanup_pending') && b:relative_autocomplete_cleanup_pending
lcd -
let b:relative_autocomplete_cleanup_pending = 0
endif
endfunction
inoremap <C-x><C-x><C-f> <C-o>:call <SID>EnableRelativeAutocomplete()<CR><C-x><C-f>
augroup relative_file_autocomplete
autocmd!
autocmd InsertLeave * call s:DisableRelativeAutocomplete()
augroup END
При необходимости он изменит рабочий каталог на каталог текущего файла при использовании <C-x><C-x><C-f>
и вернется к предыдущему каталогу при выходе из режима вставки.