Das ist nicht perfekt, aber die Bash-Vervollständigung ist eine ziemlich knifflige Sache ...
Der einfachste Weg ist auf Befehlsbasis. Er ist etwas flexibler als FIGNORE
Sie es tun können:
complete -f -X "/myproject/data/*" vi
Dies weist die automatische Vervollständigung an, dass die Vervollständigung für vi
Dateien gilt, und das Entfernen von Mustern, die mit dem -X
Filter übereinstimmen . Der Nachteil ist, dass das Muster nicht normalisiert ist ../data
und die Variationen nicht übereinstimmen.
Das nächstbeste ist möglicherweise eine benutzerdefinierte PROMPT_COMMAND
Funktion:
# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )
function _myprompt {
[[ -n "${noacdirs[$PWD]}" ]] && {
echo autocomplete off
bind 'set disable-completion on'
} || {
echo autocomplete on
bind 'set disable-completion off'
}
}
PROMPT_COMMAND=_myprompt
Dadurch wird die Vervollständigung (vollständig) deaktiviert, wenn Sie sich im Verzeichnis befinden. Sie wird jedoch für jeden Pfad deaktiviert, nicht nur für Dateien in diesem Verzeichnis.
Es wäre allgemeiner sinnvoll, dies für definierte Pfade selektiv zu deaktivieren, aber ich glaube, der einzige Weg ist die Verwendung einer Standard-Vervollständigungsfunktion (bash-4.1 und höher mit complete -D
) und viel Herumspielen.
Dies sollte für Sie funktionieren, kann jedoch unbeabsichtigte Nebenwirkungen haben (z. B. Änderungen an der erwarteten Fertigstellung in einigen Fällen):
declare -A noacdirs=([/myproject/data]=1 )
_xcomplete() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
name=$(readlink -f "${cur:-./}") # poor man's path canonify
dirname=$(dirname "$name/.")
[[ -n "${noacdirs[$dirname]}" ]] && {
COMPREPLY=( "" ) # dummy to prevent completion
return
}
# let default kick in
COMPREPLY=()
}
complete -o bashdefault -o default -F _xcomplete vi
Dies funktioniert zur Vervollständigung vi
, andere Befehle können nach Bedarf hinzugefügt werden. Die Fertigstellung der Dateien in den angegebenen Verzeichnissen sollte unabhängig von Pfad oder Arbeitsverzeichnis beendet sein.
Ich glaube, dass der allgemeine Ansatz darin complete -D
besteht, Vervollständigungsfunktionen für jeden Befehl dynamisch hinzuzufügen, wenn er angetroffen wird. Möglicherweise müssen Sie auch hinzufügen complete -E
(Vervollständigung des Befehlsnamens, wenn der Eingabepuffer leer ist).
Update
Hier ist eine Hybridversion der PROMPT_COMMAND
und Vervollständigungsfunktion Lösungen, es ist ein wenig einfacher zu verstehen und zu hacken, denke ich:
declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)
_xcomplete() {
local cmd=${COMP_WORDS[0]}
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ -z "$cur" && -n "$nocomplete" ]] && {
printf "\n(restricted completion for $cmd in $nocomplete)\n"
printf "$PS2 $COMP_LINE"
COMPREPLY=( "" ) # dummy to prevent completion
return
}
COMPREPLY=() # let default kick in
}
function _myprompt {
nocomplete=
# uncomment next line for hard-coded list of directories
[[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
# uncomment next line for per-directory ".noautocomplete"
# [[ -f ./.noautocomplete ]] && nocomplete=$PWD
# uncomment next line for size-based guessing of large directories
# [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
}
PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff
Diese Eingabeaufforderungsfunktion legt die nocomplete
Variable fest, wenn Sie eines der konfigurierten Verzeichnisse eingeben. Das geänderte Vervollständigungsverhalten tritt nur ein, wenn diese Variable nicht leer ist und wenn Sie versuchen, die Vervollständigung aus einer leeren Zeichenfolge vorzunehmen, wodurch die Vervollständigung von Teilnamen ermöglicht wird (entfernen Sie die -z "$cur"
Bedingung, um die Vervollständigung insgesamt zu verhindern). Kommentieren Sie die beiden printf
Zeilen für den stillen Betrieb aus.
Andere Optionen umfassen eine verzeichnisbezogene .noautocomplete
Flag-Datei, die Sie nach Bedarf touch
in einem Verzeichnis ablegen können. und Erraten der Verzeichnisgröße mit GNU stat
. Sie können eine oder alle dieser drei Optionen verwenden.
(Die stat
Methode ist nur eine Vermutung , die gemeldete Verzeichnisgröße wächst mit dem Inhalt, es ist eine "High Water Mark", die normalerweise nicht verkleinert wird, wenn Dateien ohne administrativen Eingriff gelöscht werden. Sie ist billiger als die Ermittlung des tatsächlichen Inhalts einer potenziell großen Datei Das genaue Verhalten und das Inkrementieren pro Datei hängen vom zugrunde liegenden Dateisystem ab. Ich finde es zumindest auf Linux Ext2 / 3/4-Systemen ein zuverlässiger Indikator.)
Bash fügt ein zusätzliches Leerzeichen hinzu, auch wenn ein leerer Abschluss zurückgegeben wird (dies tritt nur auf, wenn der Abschluss am Ende einer Zeile erfolgt). Sie können -o nospace
den complete
Befehl erweitern, um dies zu verhindern.
Ein verbleibender Haken ist, dass, wenn Sie den Cursor an den Anfang eines Tokens bewegen und auf die Registerkarte klicken, die Standardvervollständigung erneut aktiviert wird. Betrachten Sie es als ein Feature ;-)
(Oder Sie könnten herumfummeln, ${COMP_LINE:$COMP_POINT-1:1}
wenn Sie Überplanung mögen, aber ich finde, dass bash selbst die Beendigungsvariablen nicht zuverlässig festlegt, wenn Sie mitten in einem Befehl eine Sicherung durchführen und versuchen, die Beendigung durchzuführen .)