É possível obter histórico de trabalho para comandos multi-line em mksh, usando o modo de edição vi?

2

Nos meus sistemas Debian, eu sempre usei pdksh como meu shell interativo. Originalmente, o comportamento do histórico de linha de comando era semelhante ao que eu cresci em plataformas como AIX e Solaris.

Recentemente, como pdksh no Debian agora está implementado por mksh , o histórico da linha de comando não funciona mais como os meus dedos esperam. Eu estou tentando descobrir se eu posso configurar mksh para fazer o que eu quero, ou se eu tenho que encontrar outro idioma (ou outro shell).

Eu uso ksh no modo de edição de vi ( set -o vi e FCEDIT=vi ). Muitas vezes, escrevo comandos curtos de várias linhas imediatamente no prompt de comando, ou seja,

daystrom:/home/pronovic> for i in 1 2 3
> do
>    print $i
> done
1
2
3

Funcionam como esperado em mksh . No entanto, o histórico da linha de comando não.

Em todas as implementações do kshell com as quais estou familiarizado (antes de agora), esse script seria preservado no histórico como uma única entrada. Então, eu poderia atingir ESC-k e voltar para a frente da linha for . Quando cheguei lá, eu poderia editar o script no lugar novamente, ou eu poderia acessar ESC-v para editar o script em vi .

Em mksh , cada linha no meu script (a linha for , a linha do , a linha print , etc.) acaba como uma entrada separada no meu histórico. Então, ESC-k apenas me leva para a linha done , ESC-k novamente me leva para a linha print , etc.

Estou procurando uma maneira de configurar mksh , então ESC-k me leva ao início do meu script para que eu possa executá-lo ou editá-lo novamente. No entanto, não encontrei uma maneira de fazer isso.

A única discussão que encontrei está em gmane , o que implica que ^O pode de alguma forma ser usado. No entanto, não está claro para mim como isso é relevante - ou talvez não seja relevante apenas no modo de edição de vi.

É possível fazer isso funcionar?

    
por Ken Pronovici 01.05.2015 / 02:41

1 resposta

3

mksh mantenedor aqui ;-) embora esse não seja o “fórum de suporte” usual…

No mksh, a edição interativa (não ESC + v (vi) / ^ Xe (emacs)) está limitada a linhas únicas, como é histórico, uma vez que é terminada internamente pelo caractere de nova linha. Isso sempre foi assim, mesmo em pdksh.

Aparentemente, o pdksh no Debian foi corrigido de alguma forma, vejo que tem os caracteres ^J newline inline. Esta foi uma modificação específica do Debian que eu não conhecia. (Eu não uso o modo de edição vi, então eu confio nos usuários para solicitar coisas e ocasionalmente enviar um patch; até agora, ninguém se apresentou para mantê-lo, então está um pouco órfão no momento, mas é popular o suficiente. Estou pensando em reescrever todo o edit.c para unificar o código para ambos os modos, para me livrar do problema de manutenção.)

^O é o modo emacs apenas. Mas talvez possamos fazer isso funcionar no modo vi…

Para responder à sua pergunta direta: Não, atualmente não é possível em mksh. Mas eu posso dar uma olhada no que o Debian fez e tentar descobrir se podemos aceitá-lo.

Editar 2015-07-05

Eu dei uma olhada no pdksh; isso é, na verdade, uma característica da história “simples” que é impossível clonar simplesmente (sem trocadilhos) uma história “complexa”, que a antiga embalagem Debian do pdksh simplesmente decidiu não ativar, ao contrário de muitos outros SOs.

Implementei o recurso completamente novo hoje, atrasando gravações reais até que o comando tenha sido totalmente compilado, o que significa que você pode perder algumas entradas do histórico em condições de erros raros (verifiquei, erros de sintaxe não pertencem a essa categoria) mas A entrada de linha agora funciona como desejado nos modos Emacs e Vi, incluindo ESC v / ^Xe e histórico de armazenamento / carregamento.

    
por 01.05.2015 / 07:56