Comentários na linha de comando Zsh

115

Mudei recentemente do Bash para o Zsh no Ubuntu e estou muito feliz com isso. No entanto, há algo de que realmente sinto falta e não encontrei como conseguir o mesmo.

No Bash, sempre que eu estava digitando um comando longo e percebia que tinha que executar outra coisa antes, eu apenas tinha que comentar como o seguinte:

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!

No entanto, esta situação bastante recorrente não é tão fácil de endereço como com zsh, dado #mysuperlongcommandserá executado como tal (e resultando em: zsh: command not found: #mysuperlongcommand.

Rolf
fonte

Respostas:

172

Tendo acabado de começar a testar o zsh, também me deparei com esse problema. Você pode fazer setopt interactivecommentspara ativar os comentários de estilo bash.

Lajnold
fonte
3
Você também pode fazer set -kse for apenas um. Mas eu usaria a setoptlinha desta resposta em meu zshrc
Hamish Downer
12
Existe uma razão para que este não seja o comportamento padrão?
naught101
1
@ naught101 muitos dos melhores bits de zsh são desativados por padrão. não sei por quê
zzapper
@ naught101 porque é novo e inovador. muito progresso, muitas melhorias
Ярослав Рахматуллин
40

eu uso

bindkey "^Q" push-input

Do manual zsh:

Empurre toda a construção multilinha atual para a pilha de buffer e retorne ao prompt de nível superior (PS1). Se a construção do analisador atual for apenas uma linha, será exatamente como uma linha push. Da próxima vez que o editor iniciar ou for exibido com get-line, a construção será removida do topo da pilha de buffer e carregada no buffer de edição.

Então fica assim:

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

Além disso, se você definir a INTERACTIVE_COMMENTSopção ( setopt INTERACTIVE_COMMENTS), poderá usar comentários em shells interativos como está acostumado.

Michał Politowski
fonte
Gosto da sua opção, mas não consigo fazer funcionar :( Existe uma maneira de escrever a ligação no arquivo, ou são apenas dois caracteres, ^ e Q? Meu comando foi apagado, mas não sei como fazê-lo aparecer novamente na entrada.
Mihnea Simian
2
@Mihnea se o comando desaparecer, parece que o push-input está funcionando. Ele deve aparecer de volta quando você executar o próximo comando ou apenas pressionar Enter. Não faz isso?
Michał Politowski
1
@barbaz a pilha pode ser manipulada com read -ze print -z, portanto, com alguns scripts e arquivos temporários você pode. Mas um widget zle personalizado para salvar a linha de comando em um arquivo temporário pode ser mais simples e o histórico compartilhado será ainda mais simples.
Michał Politowski
1
Embora a resposta aceita atualmente trate da pergunta do questionador , esta resposta aborda a intenção do questionador . Ou seja, zsh tem uma maneira melhor de atingir o resultado pretendido, e é isso.
wjv
1
Esta deve ser a resposta aceita. Se você usar oh-my-zsh, poderá usar Ctrl-Q para fazer isso fora da caixa.
Gecko
18

Eu também faço isso com frequência. O que eu faço é cortar o comando longo, executar o comando que precisa ser executado primeiro e depois colar o comando longo de volta. Isso é fácil: CTRL + U corta o comando atual em um buffer, CTRL + Y cola. Funciona em zsh e bash.

Fredrik Möllerstrand
fonte
bem, na verdade, meu jeito é uma solução alternativa enquanto sua solução é a melhor opção;)
Rolf
4
Esta não deve ser a resposta aceita. A solução abaixo que diz para usar "setopt interactivecomments" deve ser. A razão para isso é que se você apenas recortar o comando atual, ele não estará em seu histórico do zsh e também não poderá usar recortar e colar facilmente enquanto digita seu novo comando sem sobrescrever o comando que estava tentando Salve .
Douglas
1
Usar comentários e a solução nestas respostas são soluções alternativas; o método push-input postado por Michał Politowski é mais correto.
Fredrik Möllerstrand
0

Além de setopt interactivecomments, sugerido por @Lajnold, você também pode querer adicionar algo como o seguinte para evitar que certos comentários sejam gravados no histórico (de /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-saved-into-history ):

Isso substitui a função interna ZSH zshaddhistory ():

  • Registrará comentários que começam na coluna 1 não seguidos por um ou mais espaços (ou seja, # algum comando ao qual desejo voltar)
  • Não registra comentários que começam na coluna 1 seguidos por um ou mais espaços
  • Não registra comentários recuados, preenchidos por espaços da coluna 1
  • Não registra os comandos com um espaço na coluna 1 (atalho útil para executar comandos que você não quer que sejam registrados
setopt interactivecomments

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

Para referência, este é o zshaddhistory () padrão http://zsh.sourceforge.net/Doc/Release/Functions.html

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