Дополнение имени файла Vim относительно текущего файла

Дополнение имени файла Vim относительно текущего файла

ВВим, когда я нахожусь в режиме вставки и хочу использовать автодополнение имени файла, я хочу, чтобы путь поиска был относительным к текущему файлу, а не к текущему рабочему каталогу. Например, если в режиме вставки я ввожу следующее:

./^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'предупреждает, что его использование приведет к поломке некоторых плагинов.

Я придумал собственное решение, которое может оказаться весьма узким для моих вариантов использования:

inoremap./<СХ><СF> <КО>:ЖК-дисплей %:р:ч<CR><СХ><СF>

Я планирую извлечь его в функцию и установить переменную для 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>и вернется к предыдущему каталогу при выходе из режима вставки.

Связанный контент