Welche zsh-Funktionen verwenden Sie? [geschlossen]

33

Ich arbeite viel im Terminal und habe viel über meine bevorzugte Shell gelernt, zsh. Mit welchen Funktionen von zsh können Sie Ihre Produktivität bei der Arbeit steigern? Einer meiner Favoriten ist die Multi-Dir-Autovervollständigung. Anstatt also zu tippen, cd /fo{tab}/ba{tab}/ba{tab}kann ich einfach so cd /fo/ba/ba{tab}viele Tastenanschläge machen und speichern!

Frew Schmidt
quelle
2
Ich wusste nichts über diese Funktion, ich muss sie ausprobieren!
Roy Rico
1
Welche Option hat das Verzeichnis Autocomplete?
Hometoast

Antworten:

50

Habe gerade dieses kleine Juwel gefunden:

cd old new

Diese Form von cdersetzt alle Vorkommen oldim vollständigen Pfad des aktuellen Verzeichnisses durch newund versucht, das Arbeitsverzeichnis in den resultierenden Pfad zu ändern.

Wenn sich Ihr Arbeitsverzeichnis beispielsweise befindet /home/larry/code/backrub/serverund Sie zu diesem wechseln möchten, /home/sergei/code/backrub/servermüssen Sie nur Folgendes tun:

cd larry sergei
Agnel Kurian
quelle
7
Ok, das regiert.
Hometoast
21

Ich werde mich an Dinge halten, die Bash meines Wissens nicht können.

  • Lust auf Vollendung. Ja, bash hat einiges davon, aber zsh kennt mehr Befehle, ist oft genauer und hat viel mehr Konfigurationsmöglichkeiten.

  • Der **Glob **/foosucht z. B. foorekursiv nach Dateien, die in Unterverzeichnissen aufgerufen werden. (Und ***/foofolgt auch Symlinks.) Zwei Zeichen anstelle eines langen findBefehls (was schwer zu verstehen ist, wenn einige Dateinamen Sonderzeichen wie Leerzeichen und Anführungszeichen enthalten).

  • Glob-Qualifizierer wie in foo*(*)(mögen foo*, behalten aber nur ausführbare Dateien bei), foo(.)(nur reguläre Dateien, keine Verzeichnisse), foo(-@) (nur baumelnde Symlinks), foo*(m-5)(nur Dateien, die in den letzten 5 Minuten geändert wurden), foo*(om[1])(die zuletzt geänderte Datei) , etc.

  • autocd: Wenn Sie einen Verzeichnisnamen als Befehl eingeben, wird dieser geändert ( cdoder pushdje nachdem, wie Sie ihn konfiguriert haben). Der cdBefehl ist drei Zeichen zu lang! Ich kann Bash nicht länger als 30 Sekunden verwenden, ohne den Schmerz zu spüren. Ich habe auch ein paar Einzelzeichenfunktionen, wie z

Funktion - {
  if [[$ # -eq 0]]; dann
    cd "$ OLDPWD"
  sonst
    eingebaut - "$ @"
  fi
}
  • Das zmveingebaute und
alias zcp = 'noglob zmv -C'
alias zln = 'noglob zmv -L'
alias zmv = 'noglob zmv'
  • Während ich dabei bin, ist das noglobeingebaut.

  • Die precmdund preexecHook-Funktionen: Ich preexecsetze den Titel meines Terminals so, dass er den ausgeführten Befehl enthält, und precmdersetze den Befehl durch seinen Exit-Code. So etwas wie

term_title_base = '@% l:% 1 ~'
preexec () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} $ *" '$ \ a'
}
precmd () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?)" '$ \ a'  
}
  • Strg + Z:
    • Auf einer leeren Kommandozeile läuft bg(damit Strg + Z Strg + Z ein Programm anhält und sofort im Hintergrund fortsetzt).
    • Unterbrechen Sie in einer nicht leeren Befehlszeile die aktuelle Befehlsausgabe: Lassen Sie mich einen anderen Befehl eingeben. Wenn diese zweite Befehlszeile beendet ist, erhalte ich den ersten zu bearbeitenden Befehl zurück.
    • Dies verwendet die folgende Funktion:
fancy-ctrl-z () {
  if [[$ # BUFFER -eq 0]]; dann
    bg
    zle Redisplay
  sonst
    zle Push-Eingang
  fi
}
zle -N schick-strg-z
bindkey '^ Z' fancy-ctrl-z
  • Die wichtigsten nicht abschlussbezogenen Optionen: setopt append_history autocd extended_glob no_match
Gilles 'SO - hör auf böse zu sein'
quelle
3
Lieben Sie den Trick ^ Z ^ Z, danke! Ursprünglich suchte superuser.com/questions/378018 nach einer Lösung, um es an einen einzelnen Schlüssel zu binden, aber ^ Z ^ Z macht so viel mehr Sinn
Evgeniy Dolzhenko
13

Die Fähigkeit von zsh, Dinge außer Dateien und Verzeichnissen automatisch zu vervollständigen.

Wenn beispielsweise das git-Paket installiert ist, zeigt git-sh {tab} Folgendes an:

- Git-Befehl -
shortlog - fasst die Ausgabe des Git-Protokolls zusammen
show-branch - zeigt Branchen und deren Commits an
show-index - zeigt den Inhalt einer Pack-IDX-Datei an
Mark Thalman
quelle
1
Ja, das ist ausgezeichnet! Ich benutze dies auch, wenn ich nicht ganz sicher bin, was eine Befehlszeilenoption ist, aber nicht in die Man-Datei eintauchen muss.
Frew Schmidt
Ich glaube, Bash hat diese Fähigkeit auch.
Keith Thompson
10

Ich mag die globalen Aliase sehr

alias -g L='|less
alias -g DN='>/dev/null'

lass mich Dinge tun wie

somecommand file arg L

und paging bekommen.

Hometoast
quelle
Ich mag auch G für grep.
Frew Schmidt
7

Wie von anderen erwähnt, ist die automatische Vervollständigung von zsh ausgezeichnet.

Sie können Ihre eigene Autovervollständigung für benutzerdefinierte Befehle einrichten, ohne zu viel Aufwand. So tappen Sie vollständige Benutzernamen als Argumente für finger ein:

# ~/.zshrc
function userlist {
        reply=(`users | tr ' ' '\n' |sort -u `);}
compctl -K userlist finger
set COMPLETE_ALIASES

Weitere Optionen, die ich gerne eingestellt habe:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber

Pushd und Popd sind auch ziemlich praktisch.

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME

Es ist ärgerlich, dass die Schlüssel home und end bei zsh standardmäßig nicht wie bei anderen Shells funktionieren, aber Sie können dies beheben.

# Make home and end keys work.
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
theotherreceive
quelle
2
Ich finde die Rechtschreibkorrektur eher ärgerlich als hilfreich.
Frew Schmidt
@Frew heh, du bist nicht der erste, der mir das sagt. Eine der besseren Funktionen der Korrektur ist, dass die korrigierte Version in den Verlauf aufgenommen wird, sodass Sie nicht versehentlich dasselbe erneut ausführen.
theotherreceive
5

Aktivieren Sie die automatische Vervollständigung bei Verwendung scpauf einem Remote-Server.

Die richtige Eingabeaufforderung zum Anzeigen zusätzlicher Informationen.

Rob Wells
quelle
Tatsächlich! Ich habe eine sehr komplexe, aber kurze Aufforderung. Hostname [aktuelle Zeile] <Fehler-Nr.>%
Frew Schmidt