Este é um pedido de explicação ou indicação de documentação.
Sou usuário do KornShell93 ( ksh
no Mac OS X ou ksh93
em 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 vi
modo de edição, com as opções vi
e viraw
definidas.
Há um recurso interessante ksh93
que 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][A
no vi
modo 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 ls
e 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 ls
invocaçõ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 testdir
e, ls -ld test
em vez do comando cc -o testrun mytest.c
e, 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 ksh93
manual diz
[count]k
Buscar o comando anterior. Cada vez quek
é inserido, o comando anterior de volta no tempo é acessado.
/string
Pesquise retroativamente no histórico por um comando anterior contendostring
.String
é terminado por umRETURN
ouNEW LINE
. Sestring
for precedido por um^
, a linha correspondente deverá começar comstring
. Sestring
for nulo, o anteriorstring
será usado.
[count][A
Se o cursor estiver no final da linha, é equivalente a/
definirstring
o conteúdo da linha atual. Caso contrário, é equivalente ak
.
Isso faznãoexplique por que euprimeiroget man strncmp
(como se estivesse pressionando k) eentãoentre ls -ld testdir
no meu exemplo acima. Com o texto do manual em mente, eu esperaria chegar ls -ld testdir
na 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][A
Se o cursor estiver no final da linha, é equivalente a/
comcordadefinido para o conteúdo da linha atual. Caso contrário, é equivalente ak
.
[count]j
Busque o próximo comando. Cada vez quej
é 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 umaRETURN' or
NOVA 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