Ist es möglich, die Art und Weise zu konfigurieren, wie Bash Verzeichnisnamen vervollständigt?

Ist es möglich, die Art und Weise zu konfigurieren, wie Bash Verzeichnisnamen vervollständigt?

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 mycommandund 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 completeBefehl 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.

verwandte Informationen