Finalización del nombre del archivo Vim en relación con el archivo actual

Finalización del nombre del archivo Vim en relación con el archivo actual

EnEmpuje, cuando estoy en modo de inserción y quiero utilizar la función de finalización de nombre de archivo, quiero que la ruta de búsqueda sea relativa al archivo actual, no al directorio de trabajo actual. Por ejemplo, si en modo insertar escribo lo siguiente:

./^X^F

El menú de finalización me muestra archivos en el:pwd, pero prefiero ver los archivos en%:p:hlistado.

¿Existe alguna opción que pueda configurar para solucionar este problema? Si no, ¿qué sugieres como solución alternativa?

Respuesta1

Si usted

:set autochdir

obtendrá el comportamiento que desea. Sin embargo, si necesita conservar el directorio de trabajo (por ejemplo, para abrir fácilmente otros archivos de proyecto), deberá guardar/restaurar el CWD con autocmds:

:autocmd InsertEnter * let save_cwd = getcwd() | set autochdir
:autocmd InsertLeave * set noautochdir | execute 'cd' fnameescape(save_cwd)

Respuesta2

@Ingo Karkat'srespuestaEstá bien, pero dudo un poco en ponerlo.mi vimrc, porque incluso elpágina de ayuda para'autochdir'da una nota de que su uso dañará algunos complementos.

Se me ocurrió mi propia solución que puede ser muy específica para mis casos de uso:

mapa interior./<CX><CF> <CO>: pantalla LCD %:p:h<CR><CX><CF>

Planeo extraerlo en una función y configurar una variable para pwd antes de que se emita el comando lcs y luego restablecerlo en algún momento. Sería bueno si hubiera un menú automático.

Puedo usar esto o no, pero pensé en descartar otra solución.

Respuesta3

Tengo esto en mi .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

Cambiará el directorio de trabajo al del archivo actual cuando lo use <C-x><C-x><C-f>y volverá al directorio anterior cuando salga del modo de inserción, si es necesario.

información relacionada