Lembre-se de um comando meio digitado enquanto eu verifico algo

92

Eu sempre me encontro na seguinte posição: Eu comecei a digitar um longo comando no prompt do bash, mas na metade eu descobri que preciso checar algo com outro comando. Isto é um problema quando estou na consola (no X), o que é frequentemente o caso, porque então eu só tenho as seguintes formas insatisfatórias para o fazer, que eu conheço:

  • Pressione ctrl + alt + F2 e faça o login em outro console virtual, e descubra o que eu queria, depois volte e continue
  • ctrl + a , digite echo + espaço + digite , descubra o que eu queria, pressione < kbd> ↑ até encontrar o meu comando, ctrl + a , del x 5, ctrl + e e continue
  • Realce o que escrevi até agora com o meu mouse (se o gpm estiver rodando, o que geralmente é), pressione ctrl + c para interromper, descobrir o que Eu queria ter cuidado para não usar meu mouse para destacar coisas, então pressione o botão do meio do mouse em um novo prompt e continue
  • Ore aos deuses da linha de comando que o comando meio-escrito não terá efeitos adversos, mas simplesmente falhará, e cautelosamente pressione enter, então descubra o que eu queria, pressione uparrow até receber meu comando de volta e continuar
  • Entre na minha máquina do tempo, volte no tempo e lembre-se de iniciar a tela antes de começar a digitar o comando, retorne ao presente, pressione ctrl + a < kbd> c , descubra o que eu queria, pressione ctrl + a ctrl + a , e continue

Então o que eu quero saber é, existe alguma maneira mais elegante de fazer isso? Uma espécie de subshell-comando ou similar?

Estou mais interessado em métodos que não exigem preparação ou configuração para funcionar.

    
por Lauritz V. Thaulow 07.04.2011 / 15:09

10 respostas

63

Uma versão um pouco mais rápida de alex's Ctrl + A Ctrl + K (que se move para a frente da linha e depois corta tudo para frente) é apenas usar Ctrl + U , que recua no bash, e toda a linha (independentemente da sua posição atual) no zsh. Então você usa Ctrl + Y para colar novamente

    
por 07.04.2011 / 22:58
52

Faça ctrl-A para chegar ao início da linha, prefixar um hash e pressionar voltar - assim ele permanecerá no histórico de comandos como um comentário e você poderá voltar a ele com o cursor para cima

EDIT: só notei que esta é uma variante um pouco mais elegante no seu # 2;)

    
por 07.04.2011 / 15:42
28

Acerte Ctrl+A , Ctrl+K para ir para o início da linha e exclua (kill) para o final dela. Em seguida, faça sua pesquisa e, quando estiver pronto para continuar, pressione Ctrl+Y (yank) para colocar sua linha salva (eliminada) de volta.

    
por 07.04.2011 / 18:40
13

Em zsh, eu digito Ctrl + Z para “suspender” o comando que estou digitando e digite outro comando. Depois de executar esse comando (ou abortar com Ctrl + C ), o comando suspenso volta para edição (lembrando-se da posição do cursor). Como uma conveniência adicional, se a linha de comando estiver vazia quando eu digito Ctrl + Z , a tecla invoca o bg embutido (então um duplo Ctrl + Z envia um comando em execução diretamente para o fundo).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

Eu não sei como fazer algo semelhante no bash.

Em qualquer shell, você pode usar o método de baixa tecnologia adicionando um # no começo da linha atual .

    
por 07.04.2011 / 22:06
11

No bash, apenas digite Alt + # .

Então, quando estiver pronto, pressione Up e então Alt + # .

O primeiro coloca um # no início da linha para transformá-lo em um comentário, e então aceita a linha, como se você tivesse pressionado Enter .

Então, quando você faz isso uma segunda vez, ele vê que a linha já tem um # no início, então ele a remove e a aceita, novamente salvando a chave Enter .

Se a segunda vez apenas inserir outro # , você deverá digitar Alt + - Alt + # em vez disso.

Você pode fazer o zsh fazer o mesmo colocando

bindkey -M emacs '\e#' pound-insert

no seu ~ / .zshrc.

Ou, se você estiver usando o vi bindings, você pode digitar # no modo de comando no bash e no zsh.

    
por 07.04.2011 / 23:06
10

Um dos meus recursos favoritos em zsh é a função push-line incorporada que cuida disso sem qualquer falha em outras respostas aqui. Eu tenho que ligar Ctrl + l no meu arquivo .zshrc como este:

bindkey '^L' push-line

Então, quando estou digitando em algum comando e preciso fazer outra coisa bem rápido, posso invocá-lo com uma chave e obter um prompt em branco. Depois de executar o outro comando, o prompt é preenchido automaticamente com o que eu estava digitando antes.

Você pode encadear várias camadas e os comandos retornarão na ordem inversa em que você os colocou na fila.

    
por 25.04.2011 / 19:40
5

Além do truque ctrl - a ctrl - k , se você estiver na tela, apenas ctrl - a d para desanexar e depois reconectar com screen -r

Você também pode simplesmente abrir outra janela com ctrl + a c

    
por 08.04.2011 / 00:08
4

Uma maneira alternativa, embora não perfeita, pressione Ctrl-X Ctrl-E . Isto irá abrir o seu editor padrão contendo seu comando meio digitado. Então você pode salvar seu comando em um arquivo ou abrir um novo shell a partir do seu editor. Quando você sair do novo shell, ele retornará ao editor e o salvamento do conteúdo será executado automaticamente.

Isso não é perfeito porque não retorna ao seu shell original, mas também força a execução do comando ou o descarta completamente. Mas não há seleções temporárias ou buffers de morte para se preocupar, e há também alguns bons ajustes, por exemplo, se editor = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing
    
por 07.04.2011 / 21:02
2

Semelhante ao método de adicionar # no início da linha, há um método discutivelmente mais simples que eu uso que não requer o retorno ao início da linha:

Apenas adicione uma cotação aberta e não a feche, seja ela simples ou dupla.

Em seguida, pressione Enter .

Em seguida, pressione Ctrl C .

O comando parcial é salvo no histórico de comandos (disponível por meio da seta para cima), mas na verdade não é executado.

    
por 15.11.2016 / 01:39
1

Usando zsh, se você digitar <ESC> q (escape, e Q), sua linha de prompt será cortada, para que você possa digitar outro comando. Você receberá automaticamente seu texto cortado no próximo prompt.

Ele pode lembrar várias linhas ao mesmo tempo, para que você possa usá-lo enquanto uma linha está esperando por você. Você pode até usá-lo em linha em branco para atrasar o retorno da sua linha de corte.

Não é a maneira mais eficiente se você tiver que usar vários comandos para a verificação / preparação (você terá que digitar novamente <ESC> q antes de cada comando). Mas acho que é possível ligá-lo a um atalho menor.

Se você quiser apenas verificar o manual, digite <ESC> h (escape, depois H). Isso executará o run-help integrado, com a primeira palavra da linha de comando como argumento. Você encontrará sua linha de volta intacta assim que terminar.

    
por 18.06.2014 / 09:33