¿Qué características de zsh usas? [cerrado]


33

Trabajo mucho en la terminal, así que aprendí mucho sobre mi shell de elección, zsh. ¿Qué características de zsh usas para hacerte mucho más productivo en el trabajo? Uno de mis favoritos es el autocompletado de múltiples directorios. Entonces, en lugar de escribir, cd /fo{tab}/ba{tab}/ba{tab}¡puedo hacer cd /fo/ba/ba{tab}y guardar tantas pulsaciones de teclas!


2
No sabía sobre esa característica, ¡tendré que probarla!
Roy Rico el

1
¿Qué opción es ese directorio autocompletado?
hometoast

Respuestas:


50

Acabo de encontrar esta pequeña joya:

cd old new

Esta forma de cdreemplaza todas las ocurrencias de olden la ruta completa del directorio actual con newe intenta cambiar el directorio de trabajo a la ruta resultante.

Por ejemplo, si su directorio de trabajo es /home/larry/code/backrub/servery desea cambiar /home/sergei/code/backrub/server, todo lo que necesita hacer es:

cd larry sergei

77
Ok, eso gobierna.
hometoast

21

Me ocuparé de cosas que, hasta donde yo sé, bash no puede hacer.

  • Finalización de lujo. Sí, bash tiene algo de eso, pero zsh tiene más comandos, a menudo es más preciso y tiene muchas más posibilidades de configuración.

  • El **glob, por ejemplo, **/foobusca archivos llamados fooen subdirectorios de forma recursiva. (Y ***/footambién sigue enlaces simbólicos). Dos caracteres en lugar de un findcomando largo (que es difícil de entender si algunos nombres de archivo incluyen caracteres especiales como espacios y comillas).

  • Con menos frecuencia, los calificadores globales como en foo*(*)(como foo*, pero solo retienen archivos ejecutables), foo(.)(solo archivos normales, no directorios), foo(-@) (solo enlaces simbólicos colgantes), foo*(m-5)(solo archivos modificados en los últimos 5 minutos), foo*(om[1])(el archivo modificado más recientemente) etc.

  • autocd: Escribir un nombre de directorio como un comando cambia en él ( cdo pushddependiendo de cómo lo configuró). ¡El cdcomando tiene tres caracteres demasiado largos! No puedo usar bash por más de treinta segundos sin sentir el dolor. También tengo algunas funciones de un solo carácter, como

función - {
  si [[$ # -eq 0]]; luego
    cd "$ OLDPWD"
  más
    incorporado - "$ @"
  fi
}
  • El zmvincorporado, y
alias zcp = 'noglob zmv -C'
alias zln = 'noglob zmv -L'
alias zmv = 'noglob zmv'
  • Mientras estoy en eso, el noglobincorporado.

  • Las funciones precmdy preexechook: utilizo preexecpara configurar el título de mi terminal para incluir el comando en ejecución y precmdpara reemplazar el comando con su código de salida. 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:
    • En una línea de comando vacía se ejecuta bg(para que Ctrl + Z Ctrl + Z suspenda un programa y lo reanude inmediatamente en segundo plano).
    • En una línea de comando no vacía, suspenda la edición del comando actual: permítame escribir otro comando, y cuando termine esa segunda línea de comando, recupero el primer comando para editar.
    • Esto usa la siguiente función:
fancy-ctrl-z () {
  si [[$ # BUFFER -eq 0]]; luego
    bg
    zle redisplay
  más
    entrada push zle
  fi
}
zle -N fancy-ctrl-z
bindkey '^ Z' fancy-ctrl-z
  • Las opciones más importantes no relacionadas con la finalización: setopt append_history autocd extended_glob no_match

3
Me encanta el truco ^ Z ^ Z, gracias! Originalmente buscaba en superuser.com/questions/378018 una solución para vincularlo a una sola tecla, pero ^ Z ^ Z tiene mucho más sentido
Evgeniy Dolzhenko el

13

La capacidad de zsh para autocompletar cosas además de archivos y directorios.

Por ejemplo, con el paquete git instalado, git-sh {tab} muestra:

- comando git -
shortlog: resume la salida del registro git
show-branch - muestra ramas y sus commits
show-index: muestra el contenido de un archivo idx de paquete

1
Sí, esto es excelente! También lo uso cuando no estoy muy seguro de qué es un cambio de línea de comando, pero no necesito profundizar en el archivo man.
Frew Schmidt el

Creo que bash también tiene esta capacidad.
Keith Thompson

10

Realmente me gustan los alias globales, así que

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

déjame hacer cosas como

somecommand file arg L

y obtener paginación.


También me gusta G para grep.
Frew Schmidt

7

Como lo mencionaron otros, el autocompletado de zsh es excelente.

Puede configurar su propio autocompletado para comandos personalizados sin demasiada molestia también. Para tabular nombres de usuario completos como argumentos para dedo:

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

Otras opciones que me gusta configurar:

# 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 y popd también son bastante útiles.

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

Molesto, las teclas de inicio y finalización no funcionan de manera predeterminada en zsh como lo hacen en otros shells, pero puede solucionarlo.

# 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

2
Tiendo a encontrar la corrección ortográfica más molesta que realmente útil.
Frew Schmidt el

@Frew je, no eres la primera persona que me dice eso. Una de las características más agradables de la corrección es que incluirá la versión corregida en el historial, por lo que no volverá a ejecutar accidentalmente lo mismo.
theotherrecibido el

5

Habilite el autocompletado cuando lo use scpen un servidor remoto.

El mensaje correcto para mostrar información adicional.


¡En efecto! Tengo un mensaje muy complejo pero corto. Nombre de host [línea actual] <error no>%
Frew Schmidt el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.