Bash parece estar en modo especial

Bash parece estar en modo especial

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, UXTermel comportamiento es "normal". Entonces como quiero. Pero en XTermtengo 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 Co 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_aevento de pulsación de tecla X11) debe enviar la codificación del acarácter en codificación ASCII, es decir, 0x61. Pero cuando presiona Shift+§( XK_degreeevento 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?

xtermy rxvtelija 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 konsoley enviar por Etermcada carácter que no sea ASCII.xfce4-terminal?

Mi terminal gnome y mi terminador envían la codificación UTF-8 de °.

Cuando bashreciba 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, Aser 0x41, aser 0x61, Ctrl+Aenviaría 0x61 y 0x1f, por lo que 0x1 (el ^Acarácter, también conocido como CA). Mientras que Meta+Xenviaría la codificación xcon el octavo bit configurado. asiendo 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-Bcará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-metaconfiguració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 onconvertir esos bytes 0xb0 a ESC + 0.

Si lo desactivas con:

bind 'set convert-meta = off'

(y asumiendo input-metay output-metatambié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.

información relacionada