Quali funzioni zsh usate?

Faccio un sacco di lavoro al terminal, quindi ho imparato molto sul mio guscio di scelta, zsh. Quali caratteristiche di zsh utilizzate per rendervi molto più produttivi al lavoro? Uno dei miei preferiti è l'autocomplete multi-dir. Quindi, invece di digitare cd /fo{tab}/ba{tab}/ba{tab} posso fare solo cd /fo/ba/ba{tab} e salvare tante tastature!

Ho appena trovato questo piccolo gioiello:

 cd old new 

Questa forma di cd sostituisce tutte le occorrenze di old nel path completo della directory presente con new e cerca di cambiare la directory di lavoro nel path risultante.

Ad esempio, se la directory di lavoro è /home/larry/code/backrub/server e si desidera passare a /home/sergei/code/backrub/server , tutto quello che devi fare è:

 cd larry sergei 

Tornerò a cose che, per quanto ne so, non possono fare bash.

  • Completo di fantasia. Sì, bash ha qualcosa, ma zsh sa più comandi, è spesso più preciso e ha molte più possibilità di configuration.

  • Il ** glob, ad esempio, **/foo cerca i file chiamati foo nelle sottodirectory ricorsivamente. (E ***/foo segue anche i simboli.) Due caratteri invece di un lungo command di find (difficile da get se alcuni nomi di file includono caratteri speciali come spazi e virgolette).

  • Più raramente, i qualificatori di glob come in foo*(*) (come foo* ma conservano solo i file eseguibili), foo(.) (Solo file regolari, non directory), foo([email protected]) foo*(m-5) (solo file modificati negli ultimi 5 minuti), foo*(om[1]) (il file modificato di recente), ecc.

  • autocd : Digitare un nome di directory come command cambia in esso ( cd o pushd seconda di come è stato configurato). Il command cd è di tre caratteri troppo lungo! Non posso usare bash per più di trenta secondi senza sentire il dolore. Ho anche alcune funzioni di carattere singolo, come ad esempio

 function - {
   se [[$ # -eq 0]];  poi
     cd "$ OLDPWD"
   altro
     builtin - "$ @"
   fi
 }
  • Il built-in zmv e
 alias zcp = 'noglob zmv -C'
 alias zln = 'noglob zmv -L'
 alias zmv = 'noglob zmv'
  • Mentre sono a questo punto, il noglob .

  • Le precmd e preexec hook: utilizzo preexec per impostare il titolo del mio terminal per includere il command di esecuzione e precmd per sostituire il command con il suo codice di output. Qualcosa di simile a

 term_title_base = '@% l:% 1 ~'
 preexec () {
   printingre -nr $ '\ e] 2;' "$ {(%) term_title_base} $ * '' $ \ a '
 }
 precmd () {
   printingre -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?) '' $ \ a '  
 }
  • Ctrl + Z:
    • Su una row di command vuota eseguire bg (in modo che Ctrl + Z Ctrl + Z sospenda un programma e lo riprenda immediatamente in background).
    • Su una linea di command non vuota, sospendere l'edizione di command corrente: lasciathemes digitare un altro command e quando la seconda row di command finita, riceverò il primo command da modificare.
    • Questo utilizza la seguente function:
 fancy-ctrl-z () {
   se [[$ BUFFER -eq 0]];  poi
     bg
     zle redisplay
   altro
     zle push-input
   fi
 }
 zle -N fancy-ctrl-z
 bindkey '^ Z' fancy-ctrl-z
  • Le più importnti opzioni relative alla mancanza di completamento: setopt append_history autocd extended_glob no_match

la capacità di zsh di completare le attività oltre i file e le directory.

Ad esempio, con il pacchetto git installato, git-sh {tab} viene visualizzato:

 - command git -
 shortlog - riepiloga l'output del log di git
 show-branch - mostra i rami ei loro impegni
 show-index - visualizza il contenuto di un pacchetto idx file 

Mi piace molto gli alias globali così

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

lasciami fare cose simili

 somecommand file arg L 

e get paging.

Come accennato da altri, l'autocomplete di zsh è eccellente.

È ansible impostare il proprio autocomplete per i comandi personalizzati anche senza troppi problemi. Per inserire i nomi utente completi come argomenti al dito:

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

Altre opzioni che mi piace avere impostato:

 # 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 e popd sono anche abbastanza pratici.

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

Inaspettatamente i tasti di casa e di fine non funzionano per impostazione predefinita su zsh come fanno su altre conchiglie, ma è ansible risolvere questo problema.

 # 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 

Abilitare il completamento automatico quando si utilizza scp su un server remoto.

Il prompt giusto per visualizzare ulteriori informazioni.