Caso você queira editar todo o histórico

Caso você queira editar todo o histórico

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 statusem 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 -lou historyconfirma 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 fcsuporta 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 nanopelo comando do seu editor preferido. Além disso, você pode definir a EDITORvariá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). Enterirá executá-lo ou você pode pressionar Ctrl+Cpara 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 -Wcomando 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

informação relacionada