Costumo digitar um comando e depois perceber que preciso fazer outra coisa primeiro, e não quero ter que lembrar de tudo e descobrir todos os argumentos ou digitar tudo novamente mais tarde, então geralmente coloco #
no início salve-o no histórico para usar em um minuto ou mais.
Normalmente eu setopt interactivecomments
habilitei no meu .zshrc, mas às vezes eu tenho que acessar sudo
uma conta compartilhada em certos servidores para fazer certas coisas, e isso não é necessariamente definido, então prefixar #
antes de uma linha pode me render a resposta irritante
zsh: command not found: #
Não importa, pode-se pensar, apenas use :
, mas não é tão simples.
$ : do_thing "1" && do_thing "2" && do_thing "3"
Isso executaria do_thing "2" && do_thing "3"
. Talvez não seja grande coisa em alguns casos, mas que tal algo assim?
$ : cd /some/deeply/nested/directory && rm -rf *
A maioria dos comandos não são tão prejudiciais, mas lembre-se que este é um caso em que percebi que tenho que fazer outra coisa antes de executar o(s) comando(s) que digitei, então é sempre um caso em que não quero executá-lo ainda .
Qual é uma maneira confiável, rápida, inofensiva e fácil de salvar um comando que já foi digitado?
echo
tem o mesmo problema que :
, e parece muito menos elegante.
Agrupar tudo dentro de {
e }
ou (
e )
me pareceu que poderia funcionar, mas nenhum deles funcionou. Eles deram-me
zsh: parse error near `}'
e
zsh: parse error near `)'
Basta usar o
push-line
widget , vinculado a Alt+ Qe Ctrl+ Qnoemacs
modo por padrão, que é destinado exatamente para esse fim.Isso colocará o que você digitou até agora em espera (em uma fila, chamada de pilha de buffer na documentação do zsh), limpe o buffer de edição para que você possa digitar seu outro comando. Depois que o outro comando terminar, o comando que você pressionou anteriormente será recuperado automaticamente no buffer de edição.
Um widget talvez melhor (mas que não ajudará no seu caso em que você usa
zsh
em contextos em que você não controla o~/.zshrc
) épush-input
o que envia toda a entrada em vez de apenas a linha atual¹. Isso é melhor ao inserir comandos de várias linhas, os comandos continuam após a$PS2
emissão do prompt.Observe que a linha ou entrada enviada também pode ser recuperada com Alt+ G(
get-line
widget).Outra abordagem que também funciona em outros shells é apagar a linha com Ctrl+ Uno
emacs
modo ou Escddnovi
modo, que será armazenada no killring.Você pode recuperá-lo mais tarde com Ctrl+ Yno
emacs
modo ou p/ Pnovi
modo de comando. Noemacs
modo, você também pode usar Alt+ Ypara percorrer os elementos do killring (lembrar as strings cortadas / copiadas anteriores).No
vi
modo, você também pode armazenar os comandos em registradores nomeados como emvi
:"xdd
no modo de comando vi excluiria a linha e a armazenaria nox
registrador, e você poderá recuperá-la posteriormente com"xP
.Como uma resposta mais direta à sua pergunta, para comentar algum código (uma lista e-ou) quando
interactive_comments
estiver desativado, você pode inserirfor _()
(a forma abreviada defor
loop, aqui fazendo um loop sobre a lista vazia) ouif (())
(forma abreviada deif
, aqui com uma expressão aritmética vazia resolvendo 0) na frente dela.Isso comentaria uma
foo && bar || baz
lista e-ou, mas não abar
entradafoo; bar
oufoo & bar
por exemplo.Isso também pressupõe que o texto inserido até agora é sintaticamente válido, portanto, não funcionaria para código inacabado (como texto citado inacabado, loop for ...).
Outra abordagem, com a mesma ressalva, seria inserir
:||(
no início e)
no final. Isso comentaria qualquer código válido.¹ tecnicamente, o buffer de edição atual que ainda pode conter várias linhas se você inserir novas linhas com Alt+ Enterou tiver recuperado um comando de várias linhas do histórico ou da pilha de buffer.
Embora a primeira sugestão de Stéphane (o widget push-line) seja mais simples e rápida, e preferível em muitas situações, descobri que também posso anexar um dos seguintes ao meu comando:
ou
Isso pode ser melhor nos casos em que eu sei que vou querer executar vários comandos antes de voltar a executar o que acabei de digitar e não quero ter que pressionar optionQ( altQ) várias vezes. Também é muito mais memorável do que
for _()
(uma sugestão posterior).