
Problema
Estou usando oh-my-zsh e Antigen para gerenciar meu Zsh.
Às vezes, insiro acidentalmente um comando errado/com falha no Zsh e é muito irritante quando oPlug-in zsh-autosuggestionslança esses comandos.
Por exemplo, digamos que eu digitei
gut status
em vez de git status
.
Agora, enquanto tento digitar o comando correto novamente, depois de digitar g
, o plug-in de sugestão automática será exibido gut status
, pois é a correspondência mais próxima na história recente. Mas esse é um comando que falhou!
O que euO que quero fazer é evitar que esses comandos falhos "poluam" meu históricoportanto, o plugin de sugestão automática não os sugerirá.
O que eu fiz
Eu procurei por isso e a correspondência mais próxima para excluir entradas do histórico é definir HIST_IGNORE_SPACE ou métodos para ignorar comandos específicos ou excluir comandos manualmente após inseri-los. Veresseeesse. Mas, como observou @Adaephon 52, isso acontecedepoisa ação está feita.
O que estou pensando em fazer
O que tenho em mente agora é escrever uma função que seja acionada toda vez que um comando com falha for inserido no Zsh para excluir a última entrada do histórico. No entanto, não estou familiarizado o suficiente com o Zsh para saber se esse tipo de gatilho existe ou como fazê-lo.
Nota sobre a solução aceita
Para quem está interessado neste problema, a solução aceita funciona no sentido de que comandos com falha não são armazenados no arquivo histórico. fc -l
ou history
confirma isso.
No entanto, parece que o plugin zsh-autosuggestions está fazendo o seu própriolocalalgum tipo de cache (ou está gerando sugestões usando outro mecanismo), então ainda irá sugerir os comandos com falha, massomente se a sessão não terminar. Quando o usuário inicia uma nova instância do shell, quando presumivelmente o plugin precisa carregar o histórico em cache, ele não sugere mais os comandos que falharam (a menos que você os insira novamente, é claro).
A solução proposta é tecnicamente correta, pois eu (erroneamente) estruturei minha pergunta de tal forma que ela requer apenas uma resposta que impeça o Zsh de armazenar os comandos com falha e a solução aceita faz isso (embora de forma limitada; veja o link na solução para detalhes).
Qualquer pessoa familiarizada com scripts de shell (eu não) e motivada o suficiente pode verificar oscript zsh-autosuggestions.
Responder1
Bart Schaeferpropôs a seguinte abordagempara a mesma pergunta sobre ousuários zshlista de discussão:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
Esta função é executada antes que a linha de comando seja gravada no histórico. Se retornar 1, a linha de comando atual não será anexada ao arquivo de histórico nem à pilha de histórico local. No entanto, a verificação se o comando irá acionar umcomando não encontradoo erro cobre apenas casos simples. Por exemplo, esta linha estará no histórico:
echo foo; echooo bar
Mas funciona bem para o seu exemplo
gut status
Esteja ciente de que o comando errado aparecerá UP-ARROW
(para que você possa corrigi-lo!), mas não estará na pilha de histórico; verificar com fc -l
.
Uma possível extensão desta função básica é levar em conta a configuração de variáveis de ambiente na linha de comando, por exemplo, like DEBUG=1 ./some_prog
. Aqui as funções verificam se uma palavra na linha de comando contém um sinal de igual e, em caso afirmativo, verificam a próxima palavra em busca de um comando válido:
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
Responder2
O comando integrado fc
suporta a edição do seu histórico. Caso você tenha digitado incorretamente, por exemplo, o comando anterior, você pode inserir o seguinte:
$ fc -e nano -1
Você pode substituir nano
pelo comando do seu editor preferido. Além disso, você pode definir a EDITOR
variável (parâmetro) em sua configuração zsh. (Consulte a página SO de referência)
Você precisa salvar o arquivo (aquele criado em uma pasta temporária do sistema, por fc). Depois disso você terminará com a(s) linha(s) editada(s). Enter
irá executá-lo ou você pode pressionar Ctrl+C
para finalizar sua edição.
Para mais detalhes, consulte a documentação do zsh:Zsh: histórico de edição
Caso você queira editar todo o histórico
$ fc -W; nano "$HISTFILE"; fc -R
...novamente substitua o nano se desejar
Ele simplesmente escreve o histórico – incluindo o cache – e depois abre o arquivo com um editor.
Por favor, note quezshconhece três tipos de história:
- interno: comandos que você digitou desde o login
- Local: aquele disponível no shell ativo - [HISTFILE + Internal]
- "Global": depende, mas digamos que seja o arquivo definido em HISTFILE
Lembre-se de que caso seu arquivo de histórico seja compartilhado (SHARE_HISTORY
) e você tem mais de um shell zsh aberto com o usuário em questão, então é melhor executar o fc -W
comando nesses shells primeiro. Depois de terminar a edição, execute fc -R
. Caso contrário, os comandos inseridos nesses shells não serão armazenados e, em seguida, reconhecerão sua edição manual do arquivo HISTFILE
.
Responder3
não tenho certeza de como omz o executa, mas tanto no bash quanto no zsh regular, o prefixo com um espaço o mantém fora do .history e, doravante, também fora do preenchimento/sugestão automática
ou seja
<space>ll -ahZ /home/%USER