Seta para cima em um prompt vazio em ksh93

1

Este é um pedido de explicação ou um apontador para a documentação.

Sou um usuário do KornShell93 ( ksh no Mac OS X ou ksh93 em outro lugar). Eu gosto do shell por sua relativa simplicidade como um shell interativo e por suas capacidades de scripting, e eu tenho usado ele desde que o código foi feito mais livre em 2000. Eu o uso no modo de edição vi , com ambos os vi e viraw opções definidas.

Há um recurso interessante em ksh93 que permite que você comece a digitar um comando na linha de comando e pressione Seta para cima para obter a última linha de comando correspondente do histórico da linha de comando. Eu posso encontrar a documentação para isso e como ela está vinculada ao modo de edição [count][A in vi , sem problemas.

No entanto, se eu pressionar Seta para cima em um prompt vazio, primeiro ele me dá o comando executado mais recentemente, então ele começa a percorrer qualquer prefixo de comando que eu tenha procurado anteriormente. Isso não me incomoda.

Exemplo:

Eu executo estes três comandos:

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

Digitar ls e depois pressionar Seta para cima três vezes irá percorrê-las na ordem oposta.

Mais tarde, com muito mais comandos emitidos, mas sem pesquisas de histórico e sem ls invocações:

$ cc -o testrun mytest.c
$ man strncmp

Se eu pressionar uma vez Seta para cima , receberei man strncmp . Se eu pressionar Seta para cima novamente, recebo ls -ld testdir e, em seguida, ls -ld test em vez do comando cc -o testrun mytest.c e, em seguida, o anterior antes disso.

Eu estou procurando por ponteiros para como "consertar" isso de modo que Seta para cima sem digitar nada na linha de comando antes percorra o histórico mais recente sem tentar procurar um prefixo usado anteriormente . Até mesmo um ponteiro para algum lugar onde o comportamento acima é documentado seria bom.

EDITAR :

O manual ksh93 diz

[count]k Fetch previous command. Each time k is entered the previous command back in time is accessed.

/string Search backward through history for a previous command containing string. String is terminated by a RETURN or NEW LINE. If string is preceded by a ^, the matched line must begin with string. If string is null, the previous string will be used.

[count][A If cursor is at the end of the line it is equivalent to / with string set to the contents of the current line. Otherwise, it is equivalent to k.

Isso não explica porque eu primeiro recebo man strncmp (como se estivesse pressionando k ) e então obtenha ls -ld testdir no meu exemplo acima. Com o texto do manual em mente, eu esperaria obter ls -ld testdir no primeiro pressionamento de Seta para cima (o que seria ainda mais irritante, a propósito).

    
por Kusalananda 25.06.2016 / 10:16

1 resposta

2

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

Search Edit Commands These commands access your command history.

[count]k Fetch previous command. Each time k is entered the previous command back in time is accessed.

[count]- Equivalent to k.

[count][A If cursor is at the end of the line it is equivalent to / with string set to the contents of the current line. Otherwise, it is equivalent to k.

[count]j Fetch next command. Each time j is entered the next command forward in time is accessed.

/string Search backward through history for a previous command containing string. String is terminated by a RETURN' orNEW LINE'. If string is preceded by a ^, the matched line must begin with string. If string is null, the previous string will be used.

Observação: ao usar a seta para cima após inserir uma string, a string de pesquisa será ancorada ao início da linha, como se ^ tivesse sido digitado na frente.

Exemplo:

$ ls[Up-Arrow]

é o equivalente de

$ [ESC]/^ls
    
por 26.06.2016 / 12:49