Voltando a um comando eu escrevi parcialmente [duplicado]

4

Muitas vezes eu me vejo no meio da escrita de um longo comando (ou cadeia de comandos) e percebo que preciso executar outro comando antes de terminar de digitar este atual.

Exemplos

Às vezes, eu ...

  • Precisa encontrar o nome exato de uma interface de rede ( wlp2s0b1 - blargh);
  • Precisa verificar a documentação de um comando;
  • É necessário iniciar um daemon (com systemctl , service , etc) antes de poder me comunicar com ele;
  • Preciso de sudo ls de um diretório se estiver executando um comando com sudo e a conclusão de tabulação não estiver funcionando porque não tenho permissão no diretório em que estou operando.

Eu acho que a solução ideal para mim seria um atalho de teclado que empurra o meu comando atual para uma pilha e esvazia a linha, e outro comando que aparece o comando superior da pilha na linha de entrada.

Kinda-sorta-solutions que eu uso atualmente:

  • Use o mouse para selecionar o comando no terminal (se eu tiver um terminal gráfico disponível) e copie-o, colando quando estiver pronto (lento) ;
  • Pressione enter (esperando que o comando simplesmente falhe do que apagando coisas) e use para voltar a ele (perigoso) ;
  • Digite novamente (demorado)

Alguma sugestão de como eu poderia realizar isso melhor? Eu uso zsh onde eu posso, mas uma solução que funcione em bash também seria apreciada.

    
por JJJollyjim 23.03.2015 / 03:13

2 respostas

2

Para o zsh, há três widgets, que podem estar vinculados a esse efeito: push-input , push-line e push-line-or-edit (consulte man 1 zshzle para mais informações). No prompt de nível superior ( PS1 ), eles se comportam da mesma forma: o buffer atual é colocado na pilha de buffers e, em seguida, limpo. Na próxima promp (ou ao chamar o widget get-line ), o buffer será estourado da pilha e do loadet no buffer de edição. Isso também significa que você pode colocar vários comandos em espera.

Por padrão push-line está limitado a ^Q ( Ctrl + q , pode não funcionar), ^[Q ( Alt + Shift + q ou Esc , Deslocamento + q ) e ^[q ( Alt + q ou Esc , q ). Mas você pode vinculá-lo facilmente a outra combinação com bindkey . Por exemplo, para Alt + h :

bindkey '^[h' push-line

Como dito, esses três widgets se comportam da mesma forma no prompt de nível superior. Mas eles diferem se for um prompt de segundo nível de entrada de múltiplas linhas ( PS2 ).

  • push-input

    sempre envia a construção multilinha completa para o buffer. Isso é tudo desde o último prompt de nível superior. Você retornou ao prompt de nível superior.

  • push-line

    apenas envia a linha atual para o buffer. Isso é tudo desde o último prompt. Você permanece no mesmo nível de prompt.

  • push-line-or-edit

    envia toda a construção multilinha atual para o buffer do editor ( não a pilha). Ele essencialmente faz o que o push-input faz, mas imediatamente retira o buffer da pilha novamente.

O contraparte desses widgets é get-line , que aparece na linha superior do buffer e o insere na posição do cursor. No modo Emacs, ele está limitado a ^[G ( Alt + Deslocar + g ou Esc , Shift + g ) e ^[g ( Alt + g ou Esc , g )

Para usar push-line-or-edit efetivamente, você deve saber (ou querer aprender) alguns comandos necessários para editar uma linha de comando (copiar e colar palavras e linhas, inserir nova linha (sem executar o comando), etc.). Caso contrário, sugiro usar push-line e / ou push-input .

    
por 23.03.2015 / 09:28
1

Por que não usar apenas um segundo shell para verificar detalhes? Eu uso screen para isso, ou simplesmente mudo para uma segunda área de trabalho onde eu (normalmente) também tenho um shell aberto. Dessa forma, eu gasto apenas um atalho extra para alternar para o shell de backup e mais um para voltar.

É claro que essa técnica não funcionará no último caso que você descreve, porque meu segundo shell não terá o mesmo diretório de trabalho que o primeiro.

    
por 23.03.2015 / 10:30