Comentarios en la línea de comandos Zsh

115

Recientemente cambié de Bash a Zsh en Ubuntu y estoy bastante feliz por ello. Sin embargo, hay algo que realmente extraño y no encontré cómo lograr lo mismo.

En Bash, cada vez que estaba escribiendo un comando largo y noté que tenía que ejecutar algo más antes, solo tenía que comentarlo como en el siguiente:

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: then up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

Sin embargo, esta situación bastante recurrente no es tan fácil como con la dirección zsh, dada #mysuperlongcommandserá ejecutar como tal (y lo que resulta en: zsh: command not found: #mysuperlongcommand.

Rolf
fuente

Respuestas:

172

Habiendo empezado a probar zsh, también me encontré con este problema. Puede hacer setopt interactivecommentspara activar los comentarios de estilo bash.

Lajnold
fuente
3
También puede hacerlo set -ksi es solo una vez. Pero usaría la setoptlínea de esta respuesta en mi zshrc
Hamish Downer
12
¿Hay alguna razón por la que este no es el comportamiento predeterminado?
naught101
1
@ naught101 muchos de los mejores bits de zsh están desactivados por defecto. no sé por qué
zzapper
@ naught101 porque es nuevo e innovador. mucho progreso, mucho mejora
Ярослав Рахматуллин
40

yo suelo

bindkey "^Q" push-input

Desde el manual de zsh:

Empuje toda la construcción de líneas múltiples actual en la pila de búfer y regrese al indicador de nivel superior (PS1). Si la construcción del analizador actual es solo una línea, esto es exactamente como push-line. La próxima vez que el editor se inicie o se muestre con get-line, la construcción se extraerá de la parte superior de la pila de búfer y se cargará en el búfer de edición.

Entonces se ve así:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

Además, si configura la INTERACTIVE_COMMENTSopción ( setopt INTERACTIVE_COMMENTS), podrá usar comentarios en shells interactivos como está acostumbrado.

Michał Politowski
fuente
Me gusta su opción, pero no puedo hacer que funcione :( ¿Hay alguna manera de que deba escribir el enlace en el archivo, o son solo dos caracteres, ^ y Q? Mi comando se borró, pero no lo sé cómo hacer que vuelva a aparecer en la entrada.
Mihnea Simian
2
@Mihnea si el comando desaparece, parece que la entrada push está funcionando. Debería volver a aparecer cuando ejecute el siguiente comando o simplemente presione enter. ¿No hace eso?
Michał Politowski
1
@barbaz la pila se puede manipular con read -zy print -z, por lo que con algunas secuencias de comandos y archivos temporales podría hacerlo. Pero luego, un widget zle personalizado para guardar la línea de comando en un archivo temporal podría ser más simple, y el historial compartido será aún más simple.
Michał Politowski
1
Si bien la respuesta actualmente aceptada aborda la pregunta del interrogador , esta respuesta aborda la intención del interrogador . Es decir, zsh tiene una mejor manera de lograr el resultado deseado, y esta es.
wjv
1
Esta debería ser la respuesta aceptada. Si usa oh-my-zsh, puede usar Ctrl-Q para esto de inmediato.
Gecko
18

También me encuentro haciendo esto a menudo. Lo que hago es cortar el comando largo, ejecutar el comando que necesita ir primero y luego pegar el comando largo nuevamente. Esto es fácil: CTRL + U corta el comando actual en un búfer, CTRL + Y lo pega. Funciona en zsh y bash.

Fredrik Möllerstrand
fuente
bueno, en realidad, mi método es una solución alternativa, mientras que su solución es la que mejor se ajusta;)
Rolf
4
Esta no debería ser la respuesta aceptada. La siguiente solución que dice usar "setopt interactivecomments" debería ser. La razón de esto es que si simplemente corta el comando actual, entonces no está en su historial de zsh, y tampoco puede usar cortar y pegar fácilmente mientras escribe su nuevo comando sin sobrescribir el comando que estaba intentando salvar.
Douglas
1
El uso de comentarios y la solución en estas respuestas son soluciones alternativas; el método push-input publicado por Michał Politowski es más correcto.
Fredrik Möllerstrand
0

Además de lo setopt interactivecommentssugerido por @Lajnold, es posible que también desee agregar algo como lo siguiente para evitar que ciertos comentarios se escriban en el historial (de /superuser/352788/how-to-prevent-a- comando-en-el-zshell-de-ser-guardado-en-historial ):

Esto anula la función incorporada de ZSH zshaddhistory ():

  • Registrará los comentarios que comienzan en la columna 1 no seguidos por uno o más espacios (es decir, # algún comando al que quiero volver)
  • No registrará comentarios que comiencen en la columna 1 seguidos de uno o más espacios
  • No registrará comentarios con sangría, rellenados con espacios de la columna 1
  • No registrará comandos con un espacio en la columna 1 (atajo útil para ejecutar comandos que no desea registrar
setopt interactivecomments

function zshaddhistory() {
  emulate -L zsh
  if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
      print -sr -- "${1%%$'\n'}"
      fc -p
  else
      return 1
  fi
}

Como referencia, este es el zshaddhistory () predeterminado http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
FlakRat
fuente