Bash parece estar em modo especial

Bash parece estar em modo especial

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 ö(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 XTermeu 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 Cou 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_aevento de pressionamento de tecla X11) ele precisa enviar a codificação do acaractere na codificação ASCII, que é 0x61. Mas quando você pressiona Shift+§( XK_degreeevento 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?

xterme rxvtescolha 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 konsolee envie para todos Etermos caracteres não ASCII.xfce4-terminal?

Meu terminal gnome e terminador enviam a codificação UTF-8 de °.

Quando bashrecebe 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, Aser 0x41, aser 0x61, Ctrl+Aenviaria 0x61 e 0x1f, então 0x1 (o ^Acaractere , também conhecido como CA). Enquanto Meta+Xenviaria a codificação xcom o conjunto de 8 bits. asendo 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-Bcaractere 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-metaconfiguraçã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 onconverter esses bytes 0xb0 em ESC + 0.

Se você desligar isso com:

bind 'set convert-meta = off'

(e assumindo input-metae output-metatambé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.

informação relacionada