Seta para cima em um prompt vazio no ksh93

Seta para cima em um prompt vazio no ksh93

Este é um pedido de explicação ou indicação de documentação.

Sou usuário do KornShell93 ( kshno Mac OS X ou ksh93em outro lugar). Gosto do shell por sua relativa simplicidade como shell interativo e por seus recursos de script, e o uso desde que o código se tornou mais livre em 2000. Eu o uso no vimodo de edição, com as opções vie virawdefinidas.

Há um recurso interessante ksh93que permite que você comece a digitar um comando na linha de comando e pressione Up-arrowpara obter a linha de comando correspondente mais recente do histórico da linha de comando. Posso encontrar a documentação para isso e como isso funciona [count][Ano vimodo de edição, sem problemas.

No entanto, se eu pressionar Up-arrowem um prompt vazio, primeiro ele me dará o comando executado mais recentemente e, em seguida, começará a percorrer qualquer prefixo de comando que eu procurei anteriormente. Isso me irrita sem fim.

Exemplo:

Eu executo estes três comandos:

$ ls -l
$ ls -ld test
$ ls -ld testdir

Digitar lse pressionar Up-arrowtrês vezes irá percorrê-los na ordem oposta.

Mais tarde, com muitos outros comandos emitidos, mas sem pesquisas no histórico e sem lsinvocações:

$ cc -o testrun mytest.c
$ man strncmp

Se eu pressionar Up-arrowuma vez agora, recebo man strncmp. Se eu pressionar Up-arrownovamente, obtenho ls -ld testdire, ls -ld testem vez do comando cc -o testrun mytest.ce, em seguida, o anterior antes disso.

Estou procurando dicas sobre como "consertar" isso para que, Up-arrowsem digitar nada na linha de comando, percorra o histórico mais recente sem tentar pesquisar um prefixo usado anteriormente. Mesmo um ponteiro para algum lugar onde o comportamento acima está documentado seria bom.

EDITAR:

O ksh93manual diz

[count]k Buscar o comando anterior. Cada vez que ké inserido, o comando anterior de volta no tempo é acessado.

/string Pesquise retroativamente no histórico por um comando anterior contendo string. Stringé terminado por um RETURNou NEW LINE. Se stringfor precedido por um ^, a linha correspondente deverá começar com string. Se stringfor nulo, o anterior stringserá usado.

[count][A Se o cursor estiver no final da linha, é equivalente a / definir stringo conteúdo da linha atual. Caso contrário, é equivalente a k.

Isso faznãoexplique por que euprimeiroget man strncmp(como se estivesse pressionando k) eentãoentre ls -ld testdirno meu exemplo acima. Com o texto do manual em mente, eu esperaria chegar ls -ld testdirna primeira impressão Up-arrow(o que seria ainda mais chato, aliás).

Responder1

Acontece que é um comportamento documentado. Na página de manual do ksh93:

Comandos de edição de pesquisa Esses comandos acessam seu histórico de comandos.

[count]k Buscar o comando anterior. Cada vez que k é inserido, o comando anterior de volta no tempo é acessado.

[count]- Equivalente a k.

[count][ASe o cursor estiver no final da linha, é equivalente a /comcordadefinido para o conteúdo da linha atual. Caso contrário, é equivalente a k.

[count]j Busque o próximo comando. Cada vez que jé inserido, o próximo comando de avanço no tempo é acessado.

/corda Pesquise para trás no histórico por um comando anterior contendocorda. Cordaé finalizado por uma RETURN' orNOVA LINHA'. Secordaé precedido por um ^, a linha correspondente deve começar comcorda. Secordafor nulo, a string anterior será usada.

Nota: Ao usar a seta para cima após inserir uma string, a string de pesquisa seráancoradoao início da linha, como se ^tivesse sido digitado na frente.

Exemplo:

$ ls[Up-Arrow]

é o equivalente a

$ [ESC]/^ls

informação relacionada