![Ist es möglich, die Art und Weise zu konfigurieren, wie Bash Verzeichnisnamen vervollständigt?](https://rvso.com/image/1288703/Ist%20es%20m%C3%B6glich%2C%20die%20Art%20und%20Weise%20zu%20konfigurieren%2C%20wie%20Bash%20Verzeichnisnamen%20vervollst%C3%A4ndigt%3F.png)
Ich möchte Bash anweisen, eine spezielle Methode zu verwenden, um die Vervollständigung bestimmter Verzeichnisnamen durchzuführen. Beispielsweise würde Bash ein Programm von mir aufrufen, um die Vervollständigung durchzuführen, wenn ein Pfad mit „$$“ beginnt, und andernfalls die Vervollständigung normal durchführen.
Ist das überhaupt möglich? Wie würdet ihr das umsetzen?
Kopfgeld: Ich würde mich sehr über eine Antwort auf diese Frage freuen. Das Ziel ist es,automatischer Sprungum Pfade für alle Befehle zu vervollständigen, wenn der Benutzer sie mit einem bestimmten Präfix startet. Wenn Sie beispielsweise eine Datei aus einem entfernten Verzeichnis kopieren, können Sie Folgendes eingeben:
cp $$patern + <Tab>
und Autojump würde abgeschlossen
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
und Sie müssen nur hinzufügen, wo Sie die Datei ablegen möchten. Natürlich kann ich otts Kommentar verwenden, um ihn zu einigen bestimmten Befehlen hinzuzufügen, aber wenn jemand eine bessere Idee hat, wäre ich sehr dankbar.
Antwort1
Sie können dies tun, indem Sie die Standardbindung für TAB(^i) überschreiben. Zuerst müssen Sie die TAB-Bindung überschreiben, dann müssen Sie eine Funktion erstellen, die Ihren Befehl aufruft, und schließlich müssen Sie die Ausgabe dieses Befehls übernehmen und die Variable aktualisieren, die die aktuelle Befehlszeile enthält.
Diese Funktion nimmt die aktuelle Befehlszeile und ändert die letzten beiden Zeichen in „huugs“.
function my_awesome_tab_completion_function () {
set -- $READLINE_LINE
command="$1"
shift
argument="$*"
argument_length=$(echo -n $argument | wc -c)
if echo $argument | grep '^$$' >/dev/null 2>&1; then
new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
else
new_argument=$(compgen -d $argument)
fi
new_argument_length=$(echo -n $new_argument | wc -c)
READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
READLINE_LINE="$command $new_argument"
}
In Ihrem Beispiel möchten Sie die Zeile „new_argument“ wahrscheinlich so ändern:
new_argument=$(autojump $argument)
Überschreiben Sie nun die ^i-Bindung:
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
Testen Sie nun, ob es funktioniert:
$ cd /ro<TAB>
changes my command to:
$ cd /root
damit die normale Vervollständigung weiterhin funktioniert, können Sie den $$-Teil testen, indem Sie cd $$... usw. ausführen.
Wenn bei Ihnen Probleme auftreten, aktivieren Sie den ausführlichen Modus:
$ set -x
Es wird alles ausgedruckt, was die Funktion macht.
Ich habe dies unter Ubuntu 11 mit Bash 4.2.8(1)-Release (Standard) getestet.
Antwort2
Die Bash-Vervollständigungsroutine kann als Shell-Skript programmiert werden.
$$[Tab]
Hier ist ein Beispiel für ein Shell-Skript, das alle Parameter durch ersetzt my replacement string
, aber nur für den spezifischen Befehl mycommand
und nur, wenn der Parameter genau „$$“ ist:
_mycomplete()
{
if [ ${COMP_WORDS[COMP_CWORD]} == \$\$ ]
then
COMPREPLY='my replacement string'
fi
}
complete -o default -o bashdefault -F _mycomplete mycommand
Sie müssen das Skript über source <file-name>
(oder den Punktbefehl) in Bash einspeisen, um es zu starten, und dann:
mycommand $$[Tab] -> mycommand my replacement string
mycommand $$$[Tab] -> mycommand $$$ (beep)
mycommand whatever[Tab] -> (will complete "whatever" in the normal bash manner)
Um es immer für einige oder alle Benutzer funktionieren zu lassen, fügen Sie dies in einen derBash-Profilroutinen.
Das Problem mit dem complete
Befehl ist, dass er nur für einen oder mehrere Befehlsnamen funktioniert, die als Parameter angegeben sind. Man könnte ihm einfach die Liste aller Befehle geben, die der Benutzer möglicherweise verwenden könnte, oder in verzweifelten Fällen expand /bin/* /usr/bin/* ~/bin/*
.
Getestet auf CentOS 5.5.
Dieses einfache Skript basiert auf den Quellen, die ich in meiner anderen Antwort aufgelistet habe – die vom Moderator Studiohack gelöscht wurde. Wenn Sie interessiert sind, bitten Sie ihn einfach, es wiederherzustellen.