
Sistema: Debian 8 com XFCE, Cli: Konsole Versão 2.14.2 (O terminal se chama "Konsole" ->https://konsole.kde.org/)
Um amigo me pediu para ajudá-lo com um problema estranho.
Algumas chaves estão tendo um comportamento estranho.
Por exemplo Shift + §
faz com que a linha actual seja mostrada apenas (arg: 0)
(Temos um teclado suíçohttps://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg, você pode encontrar esta chave no canto superior esquerdo)
Pressionar ö
dá (arg: 6)
. E assim por diante...
Posso sair desse "modo" pelos seguintes comandos:
set -o vi
set +o vi
Mas não estou no modo vi antes. Pelo que eu posso dizer. Mas algo parece estar “reiniciado”. O problema é que também perco algumas configurações que desejo se usar os dois comandos acima.
EDITAR:O que esqueci de mencionar; Em outro emulador de Terminal - UXTerm
- o comportamento é "normal". Então do jeito que eu quero. Mas em XTerm
eu tenho o mesmo comportamento que em Konsole
.
EDITAR2:Conforme solicitado:
user@myMachine:~$ bind -p | grep arg
"\M--": digit-argument
"\M-0": digit-argument
"\M-1": digit-argument
"\M-2": digit-argument
"\M-3": digit-argument
"\M-4": digit-argument
"\M-5": digit-argument
"\M-6": digit-argument
"\M-7": digit-argument
"\M-8": digit-argument
"\M-9": digit-argument
"\M-.": insert-last-argument
"\M-_": insert-last-argument
# universal-argument (not bound)
# vi-arg-digit (not bound)
# vi-yank-arg (not bound)
"\M-.": yank-last-arg
"\M-_": yank-last-arg
"\M-\C-y": yank-nth-arg
bioinf@ags-wav-debian-MandS:~$ set +o emacs
bioinf@ags-wav-debian-MandS:~$ bind -p | grep ö
bash: bind: warning: line editing not enabled
Informação adicional:
user@machine:~$ locale charmap
ANSI_X3.4-1968
user@machine:~$ bind -v | grep meta
set convert-meta on
set enable-meta-key on
set input-meta on
set meta-flag on
set output-meta on
Responder1
Parece que tudo se resume ao fato de que o conjunto de caracteres em sua localidade é ASCII. ASCII é um conjunto de caracteres americano dos anos 60 e é o denominador comum para a maioria dos conjuntos de caracteres modernos.
Isso normalmente acontece quando as localidades não estão configuradas (variáveis de ambiente LANG, LC_* todas desdefinidas) ou quando estão definidas como C
ou POSIX
.
Esse conjunto de caracteres define 128 caracteres com valores de bytes de 0 a 127. Todos os caracteres que compõem a linguagem sh e encontrados na maioria dos nomes de comandos estão em ASCII. Mas § e ° não são.
Agora que esses símbolos estão no seu teclado, o que deve acontecer quando você os digita em um emulador de terminal?
Se você iniciar seu emulador de terminal em um local onde o conjunto de caracteres é ASCII, você está dizendo ao seu emulador de terminal que quando você pressiona A, ( XK_a
evento de pressionamento de tecla X11) ele precisa enviar a codificação do a
caractere na codificação ASCII, que é 0x61. Mas quando você pressiona Shift+§( XK_degree
evento de pressionamento de tecla X11), ele deve enviar a codificação para o caractere °, mas não existe tal caractere em ASCII, então o que ele deve fazer?
xterm
e rxvt
escolha enviar a codificação °
no conjunto de caracteres iso-8859-1. Esse é o conjunto de caracteres de 8 bits da maior parte do mundo ocidental (estende o ASCII para cobrir a maioria dos caracteres usados em idiomas como alemão, francês, inglês britânico, espanhol...). Antes do UTF-8, esse era o conjunto de caracteres mais usado.
My konsole
e envie para todos Eterm
os caracteres não ASCII.xfce4-terminal
?
Meu terminal gnome e terminador enviam a codificação UTF-8 de °
.
Quando bash
recebe a codificação iso8859-1 de °
(0xb0) como em xterm
, o que deve fazer?
Dissemos que o conjunto de caracteres era ASCII, então 0xb0 não corresponde a nenhum caractere conhecido.
Antigamente nos EUA, Ctrl+Xera usado para inserir caracteres de 0 a 31 (os caracteres de controle). Em ASCII, isso enviaria os 5 bits inferiores do caractere correspondente. Por exemplo, A
ser 0x41
, a
ser 0x61
, Ctrl+Aenviaria 0x61 e 0x1f, então 0x1 (o ^A
caractere , também conhecido como CA). Enquanto Meta+Xenviaria a codificação x
com o conjunto de 8 bits. a
sendo 0x61
, Meta+Aenviaria 0x61 | 0x80, isso é 0xe1. Pressionar Meta+0enviaria 0x30 | 0x80, que é 0xb0, também conhecido como caractere M-0 (não).
Em ASCII, 0x0 -> 0x1f são usados para caracteres de controle para os dias de teletipo, a maioria dos quais não são mais usados, e 0x80 a 0xff não são usados, então essa era uma forma de inserir códigos que poderiam ser usados para fazer outras coisas além insira o texto. o emacs, por exemplo, usou aqueles para as teclas de edição, o C-B
caractere move o cursor um caractere para a esquerda, o M-B
(não) caractere move o cursor uma palavra para a esquerda.
Hoje em dia, como a maioria das pessoas usa conjuntos de caracteres que estendem ASCII fazendo uso de valores de bytes de 0x80 a 0xff, eles não são mais comumente entendidos como metacaracteres. Meta+Xagora geralmente envia dois caracteres: os caracteres ESC e X.
Ainda assim, quando em um local onde os valores de byte 0x80 a 0xff não podem ser caracteres, quando bash
(na verdade readline
) lê um valor de byte do dispositivo tty como 0xb0, ele o entende como sendo M-0 (que por padrão está vinculado a digit-argument
, o que explica o seu arg: 0
).
Essa é a convert-meta
configuração na configuração readline. Você encontrará na documentação do readline ( man 3 readline
) que quando o readline detecta que o conjunto de caracteres é de 7 bits, ele define isso para on
converter esses bytes 0xb0 em ESC + 0.
Se você desligar isso com:
bind 'set convert-meta = off'
(e assumindo input-meta
e output-meta
também são on
). Então você descobrirá que pressionar °
exibe uma °
exibição. Mas isso seria uma codificação 0xb0 iso8859-1 da °
qual os aplicativos não saberiam o que fazer.
O que você precisa fazer é corrigir a localidade para uma que tenha esses °
caracteres. Hoje em dia, você deve considerar apenas o UTF-8, pois abrange todos os caracteres e é amplamente suportado.
Portanto, verifique a configuração da sua área de trabalho para sua configuração de internacionalização e escolha algo como de_CH.UTF-8
/ fr_CH.UTF-8
/ it_CH.UTF-8
(suíço de língua alemã/francesa/italiana com UTF-8 como conjunto de caracteres) que melhor corresponda ao seu ambiente.
Pode ser necessário sair e fazer login novamente para que isso seja totalmente levado em consideração.
Alguns gerenciadores de login às vezes também permitem que você selecione a localidade no momento do login por meio de algum menu suspenso.