Recentemente configurei uma máquina Ubuntu 12.04 de 64 bits. eu usotmuxcom muitas janelas abertas, todas usamzshcomo shell, alguns deles através de umchrootambiente que usa a mesma pasta pessoal do ambiente normal.
Depois de algum tempo executando comandos aleatórios nos shells (todos os tipos, mas principalmente operações de arquivo, comandos vi, build/make dentro e fora do ambiente chroot), cada shell começa a mostrar imediatamente alguns comandos pré-compilados do histórico passado, que eu preciso remover, por exemplo, com Ctrl-Q, antes que eu possa digitar qualquer coisa ou pesquisar meu histórico anterior.
O fato mais irritante é que, se eu digitar por engano algum caractere antes do comando pré-compilado, excluir a linha e digitar meu próprio comando, no próximo prompt obterei também esses caracteres extras. Essa entrada modificada cresce cada vez mais, sem nunca aparecer no arquivo de histórico zsh.
Se eu excluir o arquivo .zsh_history ou criar um novo shell, o problema será resolvido por um tempo muito curto e inexoravelmente voltará para me assombrar depois de um curto período (alguns minutos de uso do shell).
Este é um exemplo de como fica meu prompt depois de algum tempo, apenas voltando ao shell do meu comando anterior:
[10:59:14] user:Build git:(master*) $ schroot -c full32 -- antls -l
Observe que o prompt deve terminar obviamente em $, e o que se segue ant
é algum lixo que digitei por engano antes de excluir a linha com Ctrl-Q em uma ocorrência anterior.
Para contexto, estou usandooh-meu-zshcom ogeoffgarsidetema e ogitfastplugar. Para chroot estou usandoidiotacom a seguinte configuração:
[precise-full32]
description=Full 32bits dev environment
aliases=full32
type=directory
directory=/opt/chroot/full32
users=user
root-groups=root
personality=linux
preserve-environment=true
Estou perdendo o juízo e não consegui encontrar nenhum problema como este descrito aqui ou em outro lugar. Alguma pista sobre o que pode estar causando esse comportamento irritante?
Responder1
Suponho que você esteja usando o mapa de teclado do emacs (por meio de d'oh-my-zsh
alguma configuração personalizada)... verifique com
$ bindkey | grep '\^Q'
"^Q" push-line
E então... o push-line
widget foi projetado exatamente para o propósito que você descreve como irritante: eu digito um comando longo - mas esqueci alguma etapa... então eu inicio push-line
via CTRL-Q
, recebo um novo prompt, faço-o bem e depois dissoRecebo meu comando digitado anteriormente (mas ainda não executado):
$ `cp /something/foo/bar to/another/long/path` # to/another/long/path does not exist
[CTRL-Q]
$ mkdir to/another/long/path
[ENTER]
$ `cp /something/foo/bar to/another/long/path` # appears again and I can execute it via [ENTER] without retyping
Então, longa história abreviada:
Use CTRL-U
qual é a ligação padrão kill-whole-line
ou redefina CTRL-Q
se você estiver acostumado com esse atalho:
$ bindkey '^Q' kill-whole-line