Mit der 'path'
Option von Vim können Sie Verzeichnisse angeben, die Befehle mögen gf
und :find
nach einer Datei suchen.
Wenn Sie möchten, dass diese Funktionalität nur für einen bestimmten Satz von Dateien ausgelöst wird, können Sie mit einem Autocmd Ihren :edit
Befehl automatisch in die Datei in einem der 'path'
Verzeichnisse "umleiten" .
set path+=~/
function! FindInPath(name)
let found = findfile(a:name)
if !empty(found)
exe 'silent keepalt file '. fnameescape(found)
edit
endif
endfunction
autocmd BufNewFile .vimrc,.zshrc nested call FindInPath(expand('<afile>'))
Dies verwendet den BufNewFile
Autocmd als Auslöser für file not found, so try to find it somewhere else
. Wenn diese Situation erkannt wird findfile()
, versuchen Sie, die Datei in den 'path'
Verzeichnissen zu finden. Wenn es gefunden wird, ändern Sie den Namen des aktuellen Puffers in diese Datei und bearbeiten Sie den Puffer erneut. Andernfalls verwenden Sie einfach den neuen Puffer weiter.
Das nested
Qualifikationsmerkmal ist hier erforderlich, da Autocmds normalerweise nicht verschachtelt sind. In diesem Fall möchten Sie, dass die typischen Autocmds ausgelöst werden, wenn der :edit
Befehl Ihre Datei öffnet.
Beachten Sie, dass dadurch immer noch ein zusätzlicher Puffer erstellt wird, anstatt die Datei nur manuell zu bearbeiten. Zum Zeitpunkt der BufNewFile
Ausführung ist der Puffer für den ursprünglich angegebenen Dateinamen bereits erstellt. Wenn Sie :file
den Namen eines Puffers ändern, wird ein neuer, entladener Puffer mit dem ursprünglichen Namen erstellt.
Wenn Sie immer suchen 'path'
möchten, kann der Autocmd einfach geändert werden, um das Dateimuster zu verwenden *
, anstatt bestimmte Dateien anzugeben.
Hier ist eine aktualisierte Version, die Ihren Anforderungen besser entsprechen sollte. Es wird verwendet :find
, um die Datei direkt zu öffnen, anstatt den Puffernamen basierend auf dem Ergebnis von festzulegen findfile()
.
function! FindInPath(name)
let path=&path
" Add any extra directories to the normal search path
set path+=~,~/.vim,/etc
" If :find finds a file, then wipeout the buffer that was created for the "new" file
setlocal bufhidden=wipe
exe 'silent! keepalt find '. fnameescape(a:name)
" Restore 'path' and 'bufhidden' to their normal values
let &path=path
set bufhidden<
endfunction
autocmd BufNewFile * nested call FindInPath(expand('<afile>'))
Dies löst das Problem in der vorherigen Funktion, bei der sich Vim beschwert, wenn versucht wird, den :file
benannten Puffer zu speichern .
keepalt file
hat den gleichen Nachteil wie die Zuweisung anvim.current.buffer.name
- vim warnt Sie, dass die Datei bereits vorhanden ist, wenn Sie versuchen, Ihre Änderungen zu speichern.