Quais recursos do zsh você usa? [fechadas]

33

Eu faço muito trabalho no terminal, então aprendi muito sobre o meu shell de escolha, o zsh. Quais recursos do zsh você usa para se tornar muito mais produtivo no trabalho? Um dos meus favoritos é o preenchimento automático multi-dir. Então, ao invés de digitar, cd /fo{tab}/ba{tab}/ba{tab}eu posso simplesmente fazer cd /fo/ba/ba{tab}e salvar tantas teclas!

Frew Schmidt
fonte
2
eu não sabia sobre esse recurso, vou ter que tentar esse!
214 Roy Roy
1
Qual opção esse diretório é preenchido automaticamente?
Homtodo 14/10/2009

Respostas:

50

Acabei de encontrar esta pequena jóia:

cd old new

Esta forma de cdsubstitui todas as ocorrências de oldno caminho completo do diretório atual por newe tenta alterar o diretório de trabalho para o caminho resultante.

Por exemplo, se seu diretório de trabalho é /home/larry/code/backrub/servere você deseja alternar /home/sergei/code/backrub/server, tudo o que você precisa fazer é:

cd larry sergei
Agnel Kurian
fonte
7
Ok, isso governa.
hometoast
21

Vou manter as coisas que, até onde eu sei, o bash não pode fazer.

  • Conclusão extravagante. Sim, o bash possui parte disso, mas o zsh conhece mais comandos, geralmente é mais preciso e tem muito mais possibilidades de configuração.

  • A **glob, por exemplo, **/fooprocura por arquivos chamados fooem subdiretórios recursivamente. (E***/foo também segue links simbólicos.) Dois caracteres em vez de um findcomando longo (que é difícil de acertar se alguns nomes de arquivos incluírem caracteres especiais, como espaços e aspas).

  • Com menos frequência, qualificadores glob como em foo*(*)(como foo*, mas apenas retêm arquivos executáveis), foo(.)(apenas arquivos regulares, não diretórios), foo(-@) (apenas links simbólicos pendentes), foo*(m-5)(apenas arquivos modificados nos últimos 5 minutos) foo*(om[1])(o arquivo modificado mais recentemente) , etc.

  • autocd: Digitar um nome de diretório como um comando muda para ele ( cdou pushddependendo de como você o configurou). O cdcomando tem três caracteres a mais! Não posso usar o bash por mais de trinta segundos sem sentir a dor. Eu também tenho algumas funções de caractere único, como

função - {
  if [[$ # -eq 0]]; então
    cd "$ OLDPWD"
  outro
    embutido - "$ @"
  fi
}
  • O zmvbuiltin, e
alias zcp = 'noglob zmv -C'
alias zln = 'noglob zmv -L'
alias zmv = 'noglob zmv'
  • Enquanto eu estou nisso, o noglobbuiltin.

  • As funções precmde preexechook: eu uso preexecpara definir o título do meu terminal para incluir o comando em execução e precmdsubstituir o comando pelo seu código de saída. Algo como

term_title_base = '@% l:% 1 ~'
preexec () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} $ *" '$ \ a'
}
precmd () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?)" '$ \ a'  
}
  • Ctrl + Z:
    • Em uma linha de comando vazia, é executada bg(para que Ctrl + Z Ctrl + Z suspenda um programa e o retome imediatamente em segundo plano).
    • Em uma linha de comando não vazia, suspenda a edição de comando atual: deixe-me digitar outro comando e, quando a segunda linha de comando terminar, volto ao primeiro comando para editar.
    • Isso usa a seguinte função:
fancy-ctrl-z () {
  if [[$ # BUFFER -eq 0]]; então
    bg
    zle reexibir
  outro
    zle push-input
  fi
}
zle -N fantasia-ctrl-z
bindkey '^ Z' fancy-ctrl-z
  • As opções mais importantes não relacionadas à conclusão: setopt append_history autocd extended_glob no_match
Gilles 'SO- parar de ser mau'
fonte
3
Adoro o truque ^ Z ^ Z, obrigado! Originalmente estava olhando superuser.com/questions/378018 de uma solução para vinculá-lo a uma única tecla, mas ^ Z ^ Z faz muito mais sentido
Evgeniy Dolzhenko
13

A capacidade do zsh de completar automaticamente coisas além de arquivos e diretórios.

Por exemplo, com o pacote git instalado, o git-sh {tab} exibe:

- comando git -
shortlog - resume a saída do log do git
show-branch - mostra ramificações e seus commits
show-index - exibe o conteúdo de um arquivo idx do pacote
Mark Thalman
fonte
1
Sim, isso é excelente! Também uso isso quando não tenho certeza do que é uma opção de linha de comando, mas não preciso me aprofundar no arquivo man.
Frew Schmidt
Acredito que o bash também tem essa capacidade.
Keith Thompson
10

Eu realmente gosto dos apelidos globais, então

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

deixe-me fazer coisas como

somecommand file arg L

e obtenha paginação.

hometoast
fonte
Eu também gosto de G para grep.
21710 Frew Schmidt #
7

Como mencionado por outros, o preenchimento automático do zsh é excelente.

Você pode configurar seu próprio preenchimento automático para comandos personalizados sem muito trabalho também. Para tabular nomes de usuário completos como argumentos a serem digitados:

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

Outras opções que eu gosto de definir:

# 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 também são bastante úteis.

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

Irritantemente, as teclas home e end não funcionam por padrão no zsh, como em outros shells, mas você pode corrigir isso.

# 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
fonte
2
Costumo achar a correção ortográfica mais irritante do que realmente útil.
Frew Schmidt
@Frew heh, você não é a primeira pessoa a me dizer isso. Uma das características mais agradáveis ​​da correção é que ela colocará a versão corrigida no histórico, para que você não execute acidentalmente a mesma coisa novamente.
theotherreceive
5

Ative o preenchimento automático ao usar scpem um servidor remoto.

O prompt certo para exibir informações adicionais.

Rob Wells
fonte
De fato! Eu tenho um prompt muito complexo, mas curto. Nome do host [linha atual] <erro não>%
Frew Schmidt