Como fazer “Ctrl + L” para limpar a tela em ksh sob o Red hat linux?

2

Estou usando o putty para me conectar ao servidor Red Hat Linux. Meu shell em linux no shell Korn. Estou acostumado a limpar a tela com a combinação "Ctrl + l". Alguns como essa combinação não está funcionando no Ksh. Se eu digitar " ctrl + l " no ksh, ele me levará para a nova linha.

Eu tentei

alias "^L"=clear

ainda o mesmo resultado.

Eu também tentei

bind -m '^L'=clear'^J'

mas diz que o comando de vinculação não foi encontrado. Não consigo instalar nada de novo na máquina.

Você poderia, por favor, informar como corrigir esse problema? Obrigado.

    
por Forever Learner 28.03.2016 / 12:22

1 resposta

3

A Red Hat fornece "ksh-93", que não possui um comando bind . Ele fornece algo chamado KEYBD , que é acionado por meio de uma função especial trap . De acordo com a página de manual, isso pode ser usado para modificar o Modo de Edição do Emacs .

O exemplo em [Korn Shell] Corrigindo as teclas Home, End, pgup, pgdown e delete é um ponto de partida útil para mostrar como fazer ^L limpar a tela. Por padrão, meta controle L ( ^[^L ) é ligado à função clear-screen, enquanto% plain^L é apenas a próxima -line que você gostaria de alterar:

   ^L        Line feed and print current line.
   M-^L      Clear the screen.

Adicionando apenas uma linha ao exemplo, o que foi perguntado:

set -o emacs

keybd_trap () {
  case ${.sh.edchar} in
    $'\f')    .sh.edchar=$'\e\f';;  # clear-screen (THIS QUESTION)
    $'\e[1~') .sh.edchar=$'
#ifdef _cmd_tput
                case cntl('L'): /* clear screen */
                        sh_trap("tput clear", 0);
                        draw(ep,REFRESH);
                        return(-1);
#endif
1';; # Home = beginning-of-line $'\e[4~') .sh.edchar=$'
Q4. How is keybinding done?
A4. ksh93 provides a KEYBD trap that gets executed whenever a key
    is entered from the keyboard.  Using this trap, and the associate
    array feature of ksh93, a keybind function can easily be written
    which will map any entered key sequence to another key sequence. 
5';; # End = end-of-line $'\e[5~') .sh.edchar=$'\e>';; # PgUp = history-previous $'\e[6~') .sh.edchar=$'\e<';; # PgDn = history-next $'\e[3~') .sh.edchar=$'
   ^L        Line feed and print current line.
   M-^L      Clear the screen.
4';; # Delete = delete-char esac } trap keybd_trap KEYBD

Por alguma razão, o modo vi é muito menos capaz em ksh .

A documentação é vaga sobre como as chaves são realmente mapeadas para funções. Para essa instância, o recurso é implementado em src/cmd/ksh93/edit/emacs.c como parte de uma instrução switch / case:

set -o emacs

keybd_trap () {
  case ${.sh.edchar} in
    $'\f')    .sh.edchar=$'\e\f';;  # clear-screen (THIS QUESTION)
    $'\e[1~') .sh.edchar=$'
#ifdef _cmd_tput
                case cntl('L'): /* clear screen */
                        sh_trap("tput clear", 0);
                        draw(ep,REFRESH);
                        return(-1);
#endif
1';; # Home = beginning-of-line $'\e[4~') .sh.edchar=$'
Q4. How is keybinding done?
A4. ksh93 provides a KEYBD trap that gets executed whenever a key
    is entered from the keyboard.  Using this trap, and the associate
    array feature of ksh93, a keybind function can easily be written
    which will map any entered key sequence to another key sequence. 
5';; # End = end-of-line $'\e[5~') .sh.edchar=$'\e>';; # PgUp = history-previous $'\e[6~') .sh.edchar=$'\e<';; # PgDn = history-next $'\e[3~') .sh.edchar=$'%pre%4';; # Delete = delete-char esac } trap keybd_trap KEYBD

dentro da função de escape (isto é, manipulando "meta"). Portanto, é um comportamento interno que pode ser customizado.

Leitura adicional:

%pre%
por 29.03.2016 / 00:07

Tags