Bash parece estar em modo especial

1

Sistema: Debian 8 com XFCE, Cli: Konsole Versão 2.14.2 (O terminal é chamado de "Konsole" - > link )

Eu amigo me pediu para ajudá-lo com um problema estranho.

Algumas chaves estão tendo um comportamento estranho.

Por exemplo, Shift + § faz a linha atual mostrar apenas (arg: 0) (temos um teclado suíço link , você pode encontrar esta chave no canto superior esquerdo)

Pressionar ö(arg: 6) . E assim por diante ...

Eu posso sair desse "modo" pelos seguintes comandos:

set -o vi
set +o vi

Mas eu não estou no modo vi antes. Tanto quanto eu posso dizer. Mas algo parece ser "redefinido". A única coisa é que eu também perco algumas configurações que eu quero, se eu usar os dois comandos acima.

EDIT: O que eu esqueci de mencionar; Em outro emulador de terminal - UXTerm - o comportamento é "normal". Então, do jeito que eu quero. Mas em XTerm tenho o mesmo comportamento como em Konsole .

EDIT2: 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ções adicionais:

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
    
por Michael 02.06.2017 / 15:38

1 resposta

5

Parece que tudo se resume ao fato de que o charset em sua localidade é ASCII. ASCII é um charset americano dos anos 60 e é o denominador comum para a maioria dos conjuntos de caracteres modernos.

Isso geralmente acontece quando as localidades não estão configuradas (variáveis de ambiente LANG, LC_ * não são todas definidas) ou quando estão definidas como C ou POSIX .

Esse conjunto de caracteres define 128 caracteres com valores de byte de 0 a 127. Todos os caracteres que compõem a linguagem sh e são encontrados na maioria dos nomes de comandos estão em ASCII. Mas § e ° não são.

Agora esses símbolos estão no seu teclado, o que deve acontecer quando você 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 emulador de terminal que quando você pressiona A , ( XK_a X11 keypress event) ele precisa enviar a codificação do caractere a na codificação ASCII, ou seja, 0x61. Mas quando você pressiona Shift + § ( XK_degree X11 evento keypress), ele deve enviar a codificação para o caractere °, mas não existe tal caractere em ASCII, então o que deve fazer?

xterm e rxvt escolhem enviar a codificação de ° 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.

Meus konsole , Eterm e xfce4-terminal enviam ? para cada caractere não ASCII.

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

Quando bash recebe a codificação iso8859-1 de ° (0xb0) como em xterm , o que ela deve fazer?

Nós dissemos que o conjunto de caracteres era ASCII, de forma que 0xb0 corresponde a nenhum caractere conhecido.

Nos velhos tempos nos EUA, Ctrl + X era 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 sendo 0x41 , a sendo 0x61 , Ctrl + A enviaria 0x61 & 0x1f, então 0x1 (o caractere ^A , também conhecido como C-A). Enquanto Meta + X envia a codificação de x com o conjunto de 8 bits. a sendo 0x61 , Meta + A enviaria 0x61 | 0x80, isso é 0xe1. Pressionar Meta + 0 enviaria 0x30 | 0x80, isso é 0xb0 também conhecido como o caractere M-0 (não).

Em ASCII, 0x0 - > 0x1f são usados para caracteres de controle para os dias do teletypewriter, a maioria dos quais não são mais usados e 0x80 para 0xff não é usado, de modo que era uma maneira de inserir códigos que poderiam ser usados para fazer outras coisas que inserir texto. O emacs, por exemplo, usou aqueles para as teclas de edição, o caractere C-B move o cursor um caractere para a esquerda, o caractere M-B (não) move o cursor uma palavra para a esquerda.

Atualmente, como a maioria das pessoas usa conjuntos de caracteres que estendem o ASCII fazendo uso dos valores de byte 0x80 a 0xff, eles não são mais entendidos como os metacaracteres. Meta + X agora geralmente envia dois caracteres: os caracteres ESC e X.

Ainda assim, quando em uma localidade 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 entende como sendo M- 0 (que por padrão está vinculado a digit-argument , o que explica seu arg: 0 ).

Essa é a configuração convert-meta na configuração readline. Você encontrará na documentação readline ( man 3 readline ) que quando readline detecta que o conjunto de caracteres é de 7 bits, ele define isso como on para converter esses bytes 0xb0 em ESC + 0.

Se você desativar isso:

bind 'set convert-meta = off'

(e assumindo input-meta e output-meta também são on ). Então você verá que pressionar ° mostra a você ° exibido. Mas isso seria uma codificação iso8859-1 0xb0 de ° , cujos aplicativos não saberão o que fazer.

O que você precisa fazer é corrigir o código do idioma para um que tenha esses ° caracteres. Hoje em dia, você deve considerar apenas o UTF-8, que abrange todos os caracteres e é amplamente suportado.

Portanto, verifique sua configuração de desktop para sua configuração de internacionalização e escolha algo como de_CH.UTF-8 / fr_CH.UTF-8 / it_CH.UTF-8 (alemão / francês / italiano que fala suíço com UTF-8 como charset) que melhor corresponde ao seu ambiente.

Talvez você precise fazer logout e login novamente para que isso seja levado em consideração.

Alguns gerenciadores de login às vezes permitem que você selecione a localidade no momento do login por meio de um menu suspenso.

    
por 02.06.2017 / 21:26

Tags