Ich verwende häufig die automatische Vervollständigung aus dem Verlauf, sei es mit up-arrow
oder 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-arrow
oder 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
Ich tippe und gebe ein:
$ command -opt1 reallyverylongindeedarg1
Durch Drücken der Pfeiltaste nach oben wird $ command -opt1 reallyverylongindeedarg1
mein 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, -opt1
damit ich das ändern -differntopt2
und 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 comman
und dann drücken right-arrow
vervollstä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.
Eine andere Methode wäre, dass ich eintippe und $ command -differntopt2
dann den Rechtspfeil drücke, um das Argument really.verylong.indeed.arg1
wie zuvor auszufüllen, als ich diesen Befehl zuletzt ausgeführt habe. Ergebend:
$ command -differntopt2 really.verylong.indeed.arg1
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
, F
und Esc
, B
funktioniert, ist aber sehr langsam. Ctrl + A
für Gehe zum Zeilenanfang wählt alles aus. Ctrl + <-
und Ctrl + ->
nur produzieren [D
und [C
.
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 mksh
oder 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, bindkey
was Ihren Anforderungen entspricht:
bindkey -M vicmd "j" vi-down-line-or-history
bindkey -M vicmd "k" vi-up-line-or-history
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, BUFFER
falls der Befehl kein Leerzeichen enthält.
Die folgende Version behandelt (vielleicht ungewöhnliche) Fälle wie ls -al
und 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 CURSOR
um so viel auf Übereinstimmung.
bindkey
kann fast jede Tastenkombination binden, nicht nur die angezeigten.
Marc Wilson