
Sistema: Debian 8 con XFCE, Cli: Konsole Versión 2.14.2 (La terminal se llama "Konsole" ->https://konsole.kde.org/)
Un amigo me pidió que lo ayudara con un problema extraño.
Algunas claves tienen un comportamiento extraño.
Por ejemplo, Shift + §
hace que la línea actual se muestre solo (arg: 0)
(tenemos un teclado suizo).https://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg, puedes encontrar esta clave en la parte superior izquierda)
Al presionar ö
da (arg: 6)
. Etcétera...
Puedo salir de este "modo" con los siguientes comandos:
set -o vi
set +o vi
Pero antes no estaba en modo vi. Por lo que yo puedo decir. Pero algo parece "restablecerse". La cuestión es que también pierdo algunas configuraciones que quiero si uso los dos comandos anteriores.
EDITAR:Lo que olvidé mencionar; En otro emulador de Terminal, UXTerm
el comportamiento es "normal". Entonces como quiero. Pero en XTerm
tengo el mismo comportamiento que en Konsole
.
EDITAR2:Según lo 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
Información 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
Respuesta1
Todo parece reducirse al hecho de que el juego de caracteres en su localidad es ASCII. ASCII es un juego de caracteres americano de los años 60 y es el denominador común de la mayoría de los juegos de caracteres modernos.
Esto suele ocurrir cuando las configuraciones regionales no están configuradas (las variables de entorno LANG, LC_* no están configuradas) o cuando están configuradas en C
o POSIX
.
Ese juego de caracteres define 128 caracteres con valores de bytes de 0 a 127. Todos los caracteres que componen el lenguaje sh y que se encuentran en la mayoría de los nombres de comandos están en ASCII. Pero § y ° no lo son.
Ahora que esos símbolos están en tu teclado, ¿qué debería pasar cuando los escribas en un emulador de terminal?
Si inicia su emulador de terminal en una configuración regional donde el juego de caracteres es ASCII, le está diciendo a su emulador de terminal que cuando presiona A( XK_a
evento de pulsación de tecla X11) debe enviar la codificación del a
carácter en codificación ASCII, es decir, 0x61. Pero cuando presiona Shift+§( XK_degree
evento de pulsación de tecla X11), debería enviar la codificación para el carácter °, pero no existe tal carácter en ASCII, entonces, ¿qué debería hacer?
xterm
y rxvt
elija enviar la codificación °
en el juego de caracteres iso-8859-1. Ese es el juego de caracteres de 8 bits de la mayor parte del mundo occidental (extiende ASCII para cubrir la mayoría de los caracteres utilizados en idiomas como alemán, francés, inglés británico, español...). Antes de UTF-8, ese era el juego de caracteres más utilizado.
My konsole
y enviar por Eterm
cada carácter que no sea ASCII.xfce4-terminal
?
Mi terminal gnome y mi terminador envían la codificación UTF-8 de °
.
Cuando bash
reciba la codificación iso8859-1 de °
(0xb0) como en xterm
, ¿qué debe hacer?
Le dijimos que el juego de caracteres era ASCII, por lo que 0xb0 no corresponde a ningún carácter conocido.
Antiguamente en EE.UU. Ctrl+Xse utilizaba para introducir caracteres del 0 al 31 (los caracteres de control). En ASCII, eso enviaría los 5 bits inferiores del carácter correspondiente. Por ejemplo, A
ser 0x41
, a
ser 0x61
, Ctrl+Aenviaría 0x61 y 0x1f, por lo que 0x1 (el ^A
carácter, también conocido como CA). Mientras que Meta+Xenviaría la codificación x
con el octavo bit configurado. a
siendo 0x61
, Meta+Aenviaría 0x61 | 0x80, es decir 0xe1. Al presionar Meta+0se enviaría 0x30 | 0x80, es decir, 0xb0, también conocido como carácter (no) M-0.
En ASCII, 0x0 -> 0x1f se usan para caracteres de control para los días de teletipo, la mayoría de los cuales ya no se usan, y 0x80 a 0xff no se usan, por lo que era una forma de ingresar códigos que podrían usarse para hacer otras cosas además de ingrese texto. emacs, por ejemplo, usó aquellas para las teclas de edición, el C-B
carácter mueve el cursor un carácter hacia la izquierda, el M-B
(no) carácter mueve el cursor una palabra hacia la izquierda.
Hoy en día, dado que la mayoría de las personas usan conjuntos de caracteres que extienden ASCII mediante el uso de valores de bytes de 0x80 a 0xff, estos ya no se entienden comúnmente como esos metacaracteres. Meta+Xahora generalmente envía dos caracteres: los caracteres ESC y X.
Aún así, cuando se encuentra en una ubicación donde los valores de bytes 0x80 a 0xff no pueden ser caracteres, cuando bash
(en realidad readline
) lee un valor de bytes del dispositivo tty como 0xb0, lo entiende como M-0 (que de forma predeterminada está vinculado a digit-argument
, lo que explica su arg: 0
).
Esa es la convert-meta
configuración en la configuración de readline. Encontrará en la documentación de readline ( man 3 readline
) que cuando readline detecta que el juego de caracteres es de 7 bits, lo configura para on
convertir esos bytes 0xb0 a ESC + 0.
Si lo desactivas con:
bind 'set convert-meta = off'
(y asumiendo input-meta
y output-meta
también lo son on
). Luego descubrirá que al presionar °
se muestra un °
mensaje. Pero esa sería una codificación 0xb0 iso8859-1 sobre °
la cual las aplicaciones no sabrán qué hacer.
Lo que debes hacer es arreglar la configuración regional a una que tenga esos °
caracteres. Hoy en día, sólo deberías considerar UTF-8, ya que cubre todos los caracteres y es ampliamente compatible.
Por lo tanto, verifique la configuración de su escritorio para conocer su configuración de internacionalización y elija algo como de_CH.UTF-8
/ fr_CH.UTF-8
/ it_CH.UTF-8
(suizo que habla alemán/francés/italiano con UTF-8 como conjunto de caracteres) que mejor se adapte a su entorno.
Es posible que tengas que cerrar sesión y volver a iniciar sesión para que esto se tenga plenamente en cuenta.
Algunos administradores de inicio de sesión a veces también le permiten seleccionar la configuración regional al momento de iniciar sesión a través de algún menú desplegable.