Questão Alterar a ordem de recuperação do histórico de comandos do shell do Windows


Uma das coisas que me deixam louco na linha de comando do MS-Windows é a ordem em que o shell do Windows (tanto o padrão quanto o PowerShell) recupera comandos do histórico quando você usa as teclas de seta para cima e para baixo.

A maneira padrão pela qual eu gosto, como é feito basicamente em todos os outros shells do mundo, é que o último comando é colocado na pilha do histórico, e então pressionar para cima recupera o último comando que eu executei, "up" novamente irá recuperar o anterior, e assim por diante. Se você escolher um comando do histórico e enviá-lo novamente, o comando será copiado para o topo da pilha e, se você pressionar o próximo prompt, verá o último comando e, em seguida, o comando anterior à última. Se depois de percorrer o histórico você pressionar "para baixo" após o comando mais recente na pilha de histórico, você retornará ao seu prompt vazio (ou o que quer que você tenha lá antes de iniciar o histórico de navegação).

No shell do Windows, funciona estranhamente diferente: se você tem 3 comandos no histórico - por exemplo, vamos chamá-los de "A", "B" e "C" - e você usa a tecla de seta para cima para selecionar o comando "B" e executar novamente e, em seguida, use a tecla de seta para cima novamente no próximo prompt, o shell exibirá "B". Mas este não é o último comando que você executou (apesar de "B" ter sido copiado de novo para a pilha do histórico), como se você pressionasse "up" novamente, você mostraria "A" e não "C". Se você navegar para baixo (para entradas posteriores) você verá "B" novamente, seguido por "C" e depois por "B" novamente, que foi o último comando digitado - mas você também não pode ir mais longe: não há como voltar atrás para um prompt vazio, exceto excluir o que você tem na linha ou pressionar CTRL-C.

Minha pergunta - existe alguma configuração que se pode definir para mudar esse comportamento?

Estou ciente da opção de apenas obter bash ou algo parecido e usá-lo no Windows, mas devido a restrições externas (como em - isso é o que eu preciso escrever meus scripts), eu tenho que trabalhar no PowerShell ou outro Windows shell que pode invocar scripts do PowerShell.


7


origem


Eu diria que a resposta é "provavelmente não".
Não consigo resolver seu problema principal, mas um bom atalho para lembrar é pressionar CRTL-Home para apagar a linha atual. - zdan
BTW - este é outro exemplo de por que fazer com que o PowerShell seja completamente baseado em objetos não foi uma boa idéia: ao introduzir novos mecanismos complexos, você também introduz novos comportamentos estranhos frustrantes e casos extremos. - Guss
Eu concordo que é enlouquecedor quando você está acostumado a um prompt * nix, mas eu acho que há uma justificativa. Eu acredito que "leva você de volta" para o comando na pilha, então você está simplesmente navegando para cima e para baixo na lista. Ele não adiciona um novo item ao fundo e leva você até lá, a menos que você altere algo ou digite algo novo. Uma vez que você se lembra de estar lá na história, pode se acostumar com isso. Mas é uma mudança muito difícil para a memória muscular! - scipilot


Respostas:


Existe uma maneira diferente de controlar a pilha de histórico, não é o que você queria, mas é uma opção diferente que você deve verificar.

Em Propriedades (ou Padrão), quando você clica com o botão direito do mouse no canto superior esquerdo, há uma opção "Descartar duplicatas antigas" e a pilha mudará seu comportamento.

no seu exemplo realizando "A", "B", "C". e depois duas vezes para executar "B", a pilha ficará: "B","C","A" (first up will be "B")


5



Não é exatamente o que eu queria, mas é tão próximo, não importa muito - minha principal queixa é que apertar SETA PARA CIMA depois de executar um comando do histórico não reverte a "entrada do histórico atual" para "depois da última entrada", mas para "depois a entrada que você selecionou pela última vez "(mas antes da próxima). Isso corrige ainda ter o cursor do histórico virtual "após a última entrada selecionada", mas movendo a referida entrada para o final, fazendo com que o cursor do histórico também seja "após a última entrada". Obrigado! - Guss
A meio caminho, mas é muito melhor. Obrigado Ofir! - kmort


Além disso, não esqueça F7. Isso aparece um DOS-style menu mostrando o histórico de comandos (ESC para fazê-lo ir embora). O comando 'last' inserido ou selecionado com a seta para cima será mostrado, assim você verá imediatamente onde você está no contexto de seta para cima / para baixo.

Aparentemente isso é de algo chamado DOSKEY, um utilitário mal documentado. Por exemplo, além de cima, baixo e depois entrar para executar o comando, descobri que uma tecla de seta para a direita ou para a esquerda irá colocá-lo no prompt sem executar (para que você possa editá-lo). PgUp / PgDn / Home / End navegará pela lista da maneira óbvia, e eu acabei de descobrir (não vi isso documentado em nenhum lugar) que se você pressionar a primeira letra de um comando, ele irá percorrer os comandos começando com essa letra ( então digite um comando como ze fun start now!para saltar para aquele ponto da história facilmente pressionando z na F7).

Talvez, porém se alguém prevê reviver muito da história, talvez seja melhor

doskey /history > editme.bat

do que sofrer as eslingas e flechas, e copiar / colar do referido registro (ou faça com que seus asseclas usem um roteiro).

Há outro casal comandos de prompt de comando no artigo de Joel Spolsky provavelmente não são amplamente conhecidos. Eu não sabia sobre a expansão de curinga, portanto, você pode usar o preenchimento de tabulação digitando os últimos caracteres de um nome ou o meio.

Acho as janelas curiosas, mas considero isso um beco sem saída, e só aprendo essas trivialidades quando parece que isso reduzirá minha interação com ele. Dada a oportunidade, acredito que é melhor instalar o cygwin para obter um shell de expressão e um ambiente menos irritante, além de habilidades e scripts que você poderá usar em outro lugar.


3



1. Obrigado - Eu não estava ciente de F7 e parece útil - apenas para reduzir a confusão horrível confuso que é a navegação do histórico do console do Windows. 2. o doskey comando não funciona para mim, provavelmente porque eu estou usando o PowerShell e não cmd.exe (veja OP). 3. O link que você forneceu não é para Joel Spolsky, mas seu co-conspirador, Jeff Atwood. Ainda um cara incrível, e as informações são úteis, mesmo se pertencentes apenas ao cmd.exe - então obrigado novamente. 4. Por fim, em relação ao cygwin, ver último parágrafo do OP. \ n \ n Parece que não tenho alternativa a não ser rolar meu próprio console. - Guss
Isso é tão maravilhosamente retrô! Eu amo isso. Tão feliz que eles se preocuparam em mantê-lo no PS. - scipilot