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%- 10.3. Personalizando os Modos de Edição (Aprendendo o Korn Shell)