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.if expand('%') !~ '^[.~]\?/'
...endif
damit explizit angegebene relative oder absolute Pfade übersprungen werden; und verwenden Siesilent
stattdessensilent!
, denn wenn Sievim vimrc
in zwei Terminals öffnen , wartet die zweite auf die Eingabe der üblichen Warnung "Datei ist an anderer Stelle geöffnet", aber der Benutzer hat keine Ahnung, worauf er wartet. Ich bearbeite es noch nicht, um zu sehen, ob Sie auch bessere Möglichkeiten haben, es anzugehen.Alternativ können Sie einige Befehle ausführen, die dies vereinfachen:
Ich verwende das
E
/S
pattern, das Rails.vim / projectionist.vim verwendet.Weitere Hilfe finden Sie unter:
quelle
Dies ist keine Lösung, aber es ist das, was ich tue, um einen einfachen Zugang zu
.vimrc
und zu haben.zshrc
. Persönlich finde ich das ziemlich ordentlich:quelle
Im Geiste von habe
CDPATH
ich dazu eine Python-basierte Funktion geschrieben (mit Hilfe von Matt Boehm ):BufWinEnter
stattdessen verwendet,BufNewFile
weil letzteres sich nicht zuverlässig zu verhalten schien, wenn mehrere solcher Dateinamen angegeben wurden.bad
gefolgt vonbd
als zuverlässigem Weg , um den Puffer für die nicht genutzte Datei geöffnet zu schließen. Dies funktioniert immer noch nicht, wenn ich es tue:tabe some-file
(es wird kein neuer Tab geöffnet). Das ist jedoch eine Frage für einen anderen Tag.CDPATH
kann ich einfach weitere Verzeichnisse hinzufügen, indem ich sie bearbeitePATHS
oder zu einer Variablen auf Vim-Ebene mache und sie ändere.Was die anderen Antworten vermissen, IMO, ist, dass ich nicht für jede Datei , sondern für jedes Verzeichnis eine Konfiguration erstellen möchte . Es ist mir egal, ob ich öffne
fstab
odervimrc
, ich wollte nur, dass Vim in einigen Verzeichnissen nach Dateien sucht, wenn diese nicht im aktuellen Verzeichnis vorhanden sind. +1 an alle für die dateispezifischen Bemühungen.quelle
*
für das Dateimuster anstelle bestimmter Dateien sollte dasselbe bewirken und Ihr Problem mit vermeiden:tabe
.Mit
'user-commands'
und'Dictionary'
können wir die Dateien bearbeiten, ohne einen Puffer zum Überschreiben der Datei zu erstellen, die wir im Puffer bearbeiten möchten.Beachten Sie, dass die Funktion
Editfile
nicht versucht, ihr Argument zu überprüfen. Lassen Sie vim alle Fehler wie andere normale Ex-Befehle behandeln. Wenn das Argument korrekt ist, beginnt vim mit der Bearbeitung der Datei. Wenn dies nicht korrekt ist, meldet vim Fehler.Meiner Meinung nach müssen wir keinen Puffer erstellen. Es hat zwei Hauptnachteile.
'not-edited'
Flagge würde gesetzt. Wie Jamessan in seiner Antwort betont:file
, wird die Fehlermeldung angezeigt , wenn wir den aktuellen Dateinamen mit dem Befehl festlegen und versuchen, die Datei zu schreiben.E13: File exists (use ! to override)
Dies liegt daran, dass vim die Datei als "nicht bearbeitet" markiert, wenn wir den Namen der Datei ändern mit:file
Befehl.:keepalt
Befehl beizubehalten. Wenn wir versuchen, vimrc während der Bearbeitung von 'foo.bar' zu bearbeiten, erwarten wir, dass der alternative Dateiname 'foo.bar' lautet. Wenn wir jedoch einen Puffer erstellen und den Namen ändern, wird der alternative Dateiname nicht zur "foo.bar", sondern zum alten Namen des Puffers 'vimrc'. Schlimmer noch, der alte Puffer bleibt alsunlisted-buffer
oder erhalteninactive-buffer
. Aus diesem Grund sollten wir den:keepalt
Befehl verwenden, um den erwarteten alternativen Dateinamen beizubehalten und diebufhidden
Option so einzustellen , dasswipe
der alte Puffer gelöscht wird.Wenn der Großbuchstabe im Befehlsnamen (alle benutzerdefinierten Befehle sollten mit einem Großbuchstaben beginnen) uns nicht betrifft, ist es besser, ihn zu verwenden. Da kein Puffer erstellt wird, müssen wir den Puffer nicht mehr verwalten. Übergeben Sie einfach den Dateinamen an vim und sehen Sie, wie vim damit umgeht.
quelle