Getrennter Pfeil nach oben für die lokale und globale ZSH-Geschichte

24

Ist es möglich, zu...

  • Erhöhen Sie den lokalen ZSH-Shell-Verlauf (Aktionen wurden nur in dieser Eingabeaufforderung ausgeführt).

  • Erhöhen Sie den globalen ZSH-Verlauf (gemeinsam genutzter Verlauf ist aktiviert) - Standardmäßig geschieht dies, wenn Sie den Pfeil nach OBEN drücken, wenn der gemeinsam genutzte Verlauf aktiviert ist

... getrennt.

Zum Beispiel könnte man STRG + für den globalen Verlauf binden, normal für den lokalen Verlauf. Gleichzeitig ist es sinnvoll, den globalen Verlauf für eine Rückwärts-Verlaufssuche (dh CTRL+ R) zu verwenden.

Dies kann einige Shell-Vorgänge beschleunigen, da einige Vorgänge für dieses Shell-Fenster spezifisch sind und Sie darauf zurückgreifen möchten.

Mikko Ohtamaa
quelle

Antworten:

23

Kopieren Sie diese und fügen Sie sie in Ihre .zshrc:

Cursor verwenden den lokalen Verlauf:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Wenn Sie auch Tastenkombinationen ( CTRL+ Cursor) benötigen , um durch den globalen Verlauf zu blättern, fügen Sie Folgendes hinzu .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Damit dies funktioniert, muss die Option SHARE_HISTORY (siehe 16.2.4 Verlauf ) aktiviert sein. Führen Sie aus setoptund prüfen Sie, ob "sharehistory" aufgelistet ist. Wenn nicht setopt sharehistoryzu deinem hinzufügen .zshrc. Dann kann man set-local-history wie oben verwenden. Die Dokumentation sagt:

Standardmäßig werden die importierten Zeilen und die lokalen Zeilen von Verlaufsbewegungsbefehlen besucht, aber Sie können dies mit der Zle-Bindung set-local-history ein- und ausschalten. Es ist auch möglich, ein zle-Widget zu erstellen, mit dem einige Befehle importierte Befehle ignorieren und andere enthalten.

Beachten Sie, dass standardmäßig der globale Verlauf verwendet wird (und alle Funktionen mit "zle set-local-history 0" enden, dh der lokale Verlauf ist deaktiviert). Wenn Sie also CTRL+ drücken, Rwird standardmäßig der globale Verlauf durchsucht (was in den meisten Fällen sinnvoll ist).

Dies ähnelt der Lösung von @mpy, ist jedoch zum Kopieren und Einfügen bereit. Es überschreibt die Cursortasten nach oben und unten. Ich habe diesen Mailinglisteneintrag verwendet .

Siehe auch:

lumbric
quelle
1
Auf zsh 5.0.2 erhalte ich einen Fehler, der nicht an eine leere Schlüsselsequenz gebunden werden kann. Auch wenn ich es durch die Tasten einer anderen Antwort ersetze, gehen sowohl Hoch / Runter als auch Strg + Hoch / Runter nur durch den globalen Verlauf. Was mache ich hier falsch?
rjh
1
@rjh: Versuchen Sie Folgendes: Löschen Sie in einem Editor wie vim das ${key[Up]}. Geben Sie dann (im Bearbeitungsmodus) Strg + V gefolgt von einem Aufwärtspfeil ein. Dies sollte den richtigen Schlüsselcode einfügen. Machen Sie dasselbe für den Pfeil nach unten.
Robinst
Ich habe diese Methode verwendet und sie funktioniert, aber ich habe die Möglichkeit verloren, den Verlauf zu durchsuchen, indem ich den ersten Teil eines Befehls und dann Pfeil nach oben geschrieben habe. Es geht durch alle Befehle wie Bash, so muss ich mit umgehen Ctrl+R.
Melebius
5

Sie können ein spezielles zle-Widget einrichten, um nur lokale Verlaufselemente anzuzeigen:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Vorausgesetzt, das ist gebunden an up-line-or-history(ich denke das ist Standard), können Sie dieses Widget an einen anderen Tastendruck binden, wie CTRL+ :

 bindkey "^[Oa" only-local-history

Ob dies funktioniert, hängt wahrscheinlich von Ihrem Terminal ab. Die obige Zeile funktioniert in URxvt/Screen. Mit xtermwirst du brauchen

 bindkey "^[[1;5A" only-local-history

für CTRL+ .

Eine andere Variante könnte sein

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

Wenn Sie also den lokalen Verlauf aktiviert haben, können Sie einen Blick in den globalen werfen oder umgekehrt.

mpy
quelle
4

Die Antwort von @lumbic hat bei mir nur mit ein paar Änderungen funktioniert:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Dieser Code legt den globalen Verlauf als Standard fest und verwendet den STRG-Pfeil für den lokalen Verlauf.

Hinweis: Ich verwende zsh 5.0.2 zusammen mit oh-my-zsh.

Arnuschky
quelle
Dies scheint das Gegenteil von dem zu sein, was OP verlangt - Ctrl+arrowsfür die lokale Geschichte.
Melebius
1

Ich habe die Optionen ausprobiert, die in den anderen Antworten aufgeführt sind, aber ich war nicht zufrieden mit ihnen. Die Widgets 1 up-history oder up-line-or-historyenthalten keine Suche zu Beginn und das Widget 1 up-line-or-beginning-search scheint nicht gut zu funktionieren, wenn Sie die Einstellungen für den lokalen Verlauf ändern, während Sie es verwenden. 2

Also bin ich auf folgende Einstellungen gekommen. Es aktiviert Ctrl+ Pfeile, um den globalen Verlauf zu durchsuchen, Alt+ Pfeile, um nur den lokalen Verlauf zu durchsuchen (ähnlich wie bei Bash) und Standalone-Pfeile, um die intelligente Anfangssuche zu verwenden (Standardeinstellung in Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 Auch ihre downGegenstücke sind implizit gemeint.

2 Der für die Suche verwendete Anfang wird nach dem Ändern der lokalen Verlaufspräferenz neu definiert, sodass der gesamte zuerst gefundene Befehl als der für die zweite Suche zu suchende Anfang verwendet wird.

Melebius
quelle
0

Aufgrund der verschiedenen Antworten hier konnte ich eine verkürzte Version erstellen:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Diese Version überschreibt die vorhandenen up-line-or-historyund down-line-or-historyWidgets mit neuen benutzerdefinierten Widgets. Dieses Widget aktiviert den lokalen Verlauf und ruft dann die ursprünglichen Widgets auf, die unter den .vordefinierten Namen verfügbar sind . Weitere Informationen finden Sie in der Dokumentation zum zle-Widget .

Dies bedeutet, dass Sie alle vorhandenen Tastenkombinationen beibehalten können. Sie müssen also nicht herausfinden, wie die Escape-Sequenz lautet, wenn Sie in Ihrem aktuellen Terminal einen Aufwärtspfeil eingeben.

Martin Geisler
quelle
-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

Die obige Antwort hat bei mir funktioniert.

Referenz: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

maddy10
quelle
Können Sie erklären, wie dies die lokale und die globale Geschichte voneinander unterscheidet? IMHO tut Ihr Code das überhaupt nicht. Außerdem scheint dies bereits in Oh My Zsh eingestellt zu sein .
Melebius