8 Stimmen

Wie speichert man das aktuelle Arbeitsverzeichnis in der Zsh-History?

Ich wollte das Gleiche erreichen wie die Frage hier Speichern des aktuellen Verzeichnisses in der Bash-History sondern innerhalb der Zsh-Shell. Ich habe noch nie mit Zsh getrickst, aber bisher habe ich es getan:

function precmd {
  hpwd=$history[$((HISTCMD-1))]  
  if [[ $hpwd == "cd" ]]; then  
    cwd=$OLDPWD
  else
    cwd=$PWD
  fi
  hpwd="${hpwd% ### *} ### $cwd"
  echo "$hpwd" >>~/.hist_log
}

Im Moment speichere ich den Befehl mit dem Verzeichnisnamen in einer Protokolldatei. Das funktioniert gut für mich. Ich dachte nur, dass es vielleicht eine Möglichkeit gibt, die gleiche Ersetzung im Verlaufspuffer selbst vorzunehmen.

8voto

ZyX Punkte 50799
function _-accept-line() {
    [[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}"
    zle .accept-line
}
zle -N accept-line _-accept-line

Wird hinzugefügt ### ${PWD} zu Ihrer Befehlszeile hinzufügen. Nicht die beste Lösung, aber sie funktioniert.

UPD: Die Antwort basiert auf dem Kommentar von @Dennis Williamson:

function zshaddhistory() {
    print -sr "${1%%$'\n'} ### ${PWD}"
    fc -p
}

3voto

MerlinMM Punkte 31

Anstatt es bei jedem Befehl zu speichern, habe ich das Folgende am Anfang meiner precmd()-Funktion hinzugefügt, um es zu speichern, wenn ich das Verzeichnis wechsle:

    if [ "$LAST_DIR" != "$PWD" ]
    then
            print -s "##dir## $PWD"
            LAST_DIR=$PWD
    fi

Fügt jedes Mal, wenn ein Befehl von einem neuen Verzeichnis aus ausgeführt wird, eine eigenständige Zeile '##dir## dir name' in den Verlauf ein.

2voto

Adam Cooper Punkte 182

Die folgende Anpassung von Die Lösung von ZyX behebt ein Problem, bei dem die Wiederverwendung von History-Befehlen mit (UpArrow) zu einer Anhäufung von ### $PWD in der Geschichte:

function zshaddhistory() {
  history_item="${${1%%$'\n'}%%$' ###'*} ### ${PWD}"
  print -sr ${(z)history_item}
  fc -p
  return 1
}

Es entfernt alle vorhandenen PWD-Kommentare, bevor der aktuelle hinzugefügt wird. Auf diese Weise kann ich die Pfeil-nach-oben-Taste drücken, einen alten Befehl ausführen, ohne durch den Kommentar zurückzuspringen, und der neue Eintrag in der Historie wird nur den einen Kommentar mit dem aktuellen Arbeitsverzeichnis haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X