macOS-Terminal: schnelle Möglichkeit, Befehlsoptionen nach der automatischen Vervollständigung von bash/zsh zu bearbeiten

Das Thema

Ich verwende häufig die automatische Vervollständigung aus dem Verlauf, sei es mit up-arrowoder durch Eingeben der ersten Buchstaben und Vervollständigen des gesamten Befehls einschließlich aller Argumente (Optionen und andere) mit right-arrow.

Sehr oft muss ich denselben Befehl mehrmals für dieselbe Datei ausführen, jedoch mit unterschiedlichen Optionen. Wenn ich jedoch up-arrowoder drücke right-arrow, vervollständige ich den Befehl bis zum Ende und es ist schneller, das Ganze manuell einzugeben, als den Cursor zurück zu den Optionen zu bringen, zu bearbeiten und dann erneut einzugeben.

Grundsätzlich würde ich gerne wissen, ob es eine Möglichkeit gibt, die automatische Vervollständigung zu verwenden, um einen Befehl aus dem Verlauf erneut einzugeben, aber den Cursor wieder auf die erste Option/das erste Argument zu bringen . Alternativ eine Tastenkombination, um die verbleibenden Argumente wie zuvor auszufüllen, nachdem Sie ein anderes eingegeben haben.

z.B

Option 1

Ich tippe und gebe ein:

$ command -opt1 reallyverylongindeedarg1

Durch Drücken der Pfeiltaste nach oben wird $ command -opt1 reallyverylongindeedarg1mein Cursor am Ende der Zeile angezeigt.

Ich hätte gerne eine andere Tastenkombination, die dazu führt, dass ich den Cursor irgendwo in der Nähe habe, -opt1damit ich das ändern -differntopt2und den Befehl erneut ausführen kann, der jetzt lautet:

$ command -differntopt2 really.verylong.indeed.arg1

Oder nachdem Sie zuvor Folgendes eingegeben und ausgeführt haben:

$ command -opt1 really.verylong.indeed.arg1

Tippen commanund dann drücken right-arrowvervollständigt den vollständigen Befehl $ command -opt1 reallyverylongindeedarg1(wieder mit meinem Cursor am Ende der Zeile). Ich würde gerne wissen, ob es eine Tastenkombination gibt, um bei der automatischen Vervollständigung zum ersten Argument/zur ersten Option zu springen.

Option 2

Eine andere Methode wäre, dass ich eintippe und $ command -differntopt2dann den Rechtspfeil drücke, um das Argument really.verylong.indeed.arg1wie zuvor auszufüllen, als ich diesen Befehl zuletzt ausgeführt habe. Ergebend:

$ command -differntopt2 really.verylong.indeed.arg1

Wie wäre es, einfach mit der Tastatur zu navigieren und wortweise zurück zu springen?

Nun, erstens ist das alles andere als ideal, da die Argumente viele Satzzeichen enthalten, sodass jedes mehrere (und unterschiedlich viele) Tastendrücke erfordert und es langsam ist, jedes Mal die richtige Anzahl von Wörtern zurückzugehen, um die Option zu erreichen, die ich bearbeiten möchte.

Zweitens finde ich keine Möglichkeit, normale Tastenkombinationen für die wortweise Vorwärts- und Rückwärtsnavigation einzurichten.

In iTerm2 habe ich versucht:

Escape-Sequenzen wie [1;5D, [1;5C, \033b, \033f, usw.

Die manuelle Eingabe von Esc, Fund Esc, Bfunktioniert, ist aber sehr langsam. Ctrl + Afür Gehe zum Zeilenanfang wählt alles aus. Ctrl + <-und Ctrl + ->nur produzieren [Dund [C.

tl;dr

  1. Wie kann ich automatisch vervollständigen und mit meinem Cursor am ersten Argument statt am Ende der Zeile enden?, oder,
  2. Wie richte ich Tastaturkürzel für das Vorwärts- und Rückwärtsspringen nach Argument in iTerm2 ein?
Bringen Sie den Befehl zurück, drücken Sie ⌃X⌃E, das lädt die Befehlszeile in $EDITOR, lassen Sie tun, was Sie wollen. Was das Vor- und Zurückgehen per Argument angeht, ist dies Ihre Shell, nicht das Terminal. Wahrscheinlich hat es sie schon.

Antworten (1)

Für ZSH besteht eine weitere Option darin, den Cursor an den Anfang und nicht an das Ende der Zeile zu setzen (das macht es eher wie mkshoder andere). Der Standard:

% PS1='%% ' zsh -f
% bindkey | grep up-line-or
"^[OA" up-line-or-history
"^[[A" up-line-or-history

Ich verwende set -o vi, damit Sie die Schlüssel möglicherweise in das übersetzen müssen, bindkeywas Ihren Anforderungen entspricht:

bindkey -M vicmd "j" vi-down-line-or-history
bindkey -M vicmd "k" vi-up-line-or-history

Nein, wirklich, ich möchte zum ersten Argument springen

Dies erfordert ein benutzerdefiniertes Widget, das so etwas wie ausführen könnte

function up-line-first-arg {
    local first offset
    zle vi-up-line-or-history
    first=${BUFFER%% *}
    CURSOR+=$(( 1 + ${#first} ))
}
zle -N up-line-first-arg
autoload -U up-line-first-arg
autoload -U compinit
compinit
set -o vi
bindkey -M vicmd "k" up-line-first-arg

Diese Version setzt den Cursor auf das erste Argument oder das Ende des Befehlsnamens (es sei denn, es gibt mehrere Leerzeichen zwischen dem ersten und dem nachfolgenden Argument, was nicht üblich ist). Docs in zshexpn(1)und zshzle(1)können helfen, die Einzelheiten zu erklären, aber das Wesentliche ist, sich wie ZSH nach oben zu bewegen, das erste Wort (falls vorhanden) zu erhalten und den Cursor über diese Länge zu bewegen, plus eins, um über das Leerzeichen hinauszukommen. ZSH ist schlau und bewegt den Cursor nicht über das Ende von hinaus, BUFFERfalls der Befehl kein Leerzeichen enthält.

aber warte, es gibt noch mehr

Die folgende Version behandelt (vielleicht ungewöhnliche) Fälle wie ls -alund bei einem Fehler wird der Cursor an den Anfang der Zeile gesetzt.

function up-line-first-arg {
    zle vi-up-line-or-history
    [[ $BUFFER =~ "^[^ ]+[ ]+" ]] && CURSOR+=${#MATCH}
}

Im Grunde ein regulärer Ausdruck "vom Beginn der BUFFERÜbereinstimmung an ein oder mehrere Dinge, die kein Leerzeichen sind, gefolgt von einem oder mehreren Dingen, die Leerzeichen sind" und dann das Verschieben CURSORum so viel auf Übereinstimmung.

Ich möchte nicht, dass das ständig passiert, nur wenn ich es möchte. Ist es möglich, dies mit einer Metataste oder dem Drücken einer anderen Tastenkombination nach Abschluss zu erreichen?
Ja? bindkeykann fast jede Tastenkombination binden, nicht nur die angezeigten.
Wenn Sie Combos mit der Befehlstaste verwenden möchten, können Sie iterm & bindkey verwenden, wie in dieser Antwort gezeigt: superuser.com/a/740174/1294587