Vim-Dateinamenvervollständigung relativ zur aktuellen Datei

Vim-Dateinamenvervollständigung relativ zur aktuellen Datei

InVimWenn ich im Einfügemodus bin und die Dateinamenvervollständigung verwenden möchte, soll der Suchpfad relativ zur aktuellen Datei sein, nicht zum aktuellen Arbeitsverzeichnis. Wenn ich beispielsweise im Einfügemodus Folgendes eingebe:

./^X^F

Das Vervollständigungsmenü zeigt mir Dateien im:pwd, aber ich würde die Dateien lieber in%:p:haufgelistet.

Gibt es eine Option, mit der ich das Problem beheben kann, und wenn nicht, was schlagen Sie als Problemumgehung vor?

Antwort1

Wenn du

:set autochdir

Sie erhalten das gewünschte Verhalten. Wenn Sie jedoch das Arbeitsverzeichnis behalten müssen (z. B. um andere Projektdateien problemlos zu öffnen), müssen Sie das CWD mit Autocmds speichern/wiederherstellen:

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

Antwort2

@Ingo Karkat'SAntwortist nett, aber ich bin ein wenig zögerlich, das einzubauenmein vimrc, denn selbst dieHilfeseite für'autochdir'gibt einen Hinweis, dass seine Verwendung einige Plugins beschädigen wird.

Ich habe eine eigene Lösung gefunden, die für meine Anwendungsfälle möglicherweise sehr speziell ist:

inoremap./<CX><CF> <CO>:LCD %:p:h<CR><CX><CF>

Ich habe vor, es in eine Funktion zu extrahieren und eine Variable für das Passwort festzulegen, bevor der LCS-Befehl ausgegeben wird, und es dann irgendwann zurückzusetzen. Es wäre schön, wenn es ein Menü mit Autocmd gäbe.

Ich werde das vielleicht verwenden oder auch nicht, aber ich dachte, ich werfe mal eine andere Lösung ein.

Antwort3

Ich habe dies in meinem .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

Bei Verwendung wird das Arbeitsverzeichnis in das der aktuellen Datei geändert <C-x><C-x><C-f>und bei Verlassen des Einfügemodus bei Bedarf zurück in das vorherige Verzeichnis.

verwandte Informationen