Bash가 특수 모드에 있는 것 같습니다.

Bash가 특수 모드에 있는 것 같습니다.

시스템: XFCE가 포함된 Debian 8, Cli: Konsole 버전 2.14.2(터미널 이름은 "Konsole" ->https://konsole.kde.org/)

내 친구가 나에게 이상한 문제를 해결하도록 도와달라고 요청했습니다.

일부 키가 이상하게 작동합니다.

예를 들어, Shift + §현재 행만 표시되도록 하려면 (arg: 0)(스위스 키보드가 있습니다)https://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg, 이 키는 왼쪽 상단에서 찾을 수 있습니다)

잠깐만 ö(arg: 6).

다음을 사용하여 이 "모드"를 종료할 수 있습니다.

set -o vi
set +o vi

하지만 이전에는 vi 모드가 아니었습니다. 내가 아는 한. 하지만 뭔가가 "재설정"된 것 같습니다. 문제는 위의 두 명령을 사용하면 내가 원하는 설정 중 일부도 손실된다는 것입니다.

편집하다:내가 언급하지 않은 것은 다른 터미널 에뮬레이터에서는 UXTerm동작이 "정상"이라는 것입니다. 그래서 내가 원하는 방식으로. 그러나 XTerm나는 같은 행동을했습니다 Konsole.

편집 2:요청대로:

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

추가 정보:

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

답변1

모든 것은 귀하의 로케일에 설정된 문자가 ASCII라는 사실로 귀결되는 것 같습니다. ASCII는 1960년대 미국 문자 집합이며 대부분의 현대 문자 집합의 공통 분모입니다.

C이는 일반적 으로 로케일이 구성되지 않았거나(LANG, LC_* 환경 변수가 모두 설정되지 않음) 또는 로 설정된 경우에 발생합니다 POSIX.

이 문자 세트는 0부터 127까지의 바이트 값으로 128자를 정의합니다. sh 언어를 구성하고 대부분의 명령 이름에서 발견되는 모든 문자는 ASCII 형식입니다. 그러나 § 및 °의 경우에는 그렇지 않습니다.

이제 이러한 기호가 키보드에 있으므로 터미널 에뮬레이터에 입력하면 어떻게 될까요?

A문자 집합이 ASCII인 로케일에서 터미널 에뮬레이터를 시작하는 경우 X11 키 이벤트 를 누를 때 문자 인코딩을 ASCII 인코딩(0x61 XK_a)으로 보내야 함 을 터미널 에뮬레이터에 알리는 것입니다 . 그런데 ( X11 키 이벤트) a를 누르면 ° 문자의 인코딩을 보내야 하는데 ASCII에는 그런 문자가 없는데 어떻게 해야 할까요?Shift+§XK_degree

xtermiso-8859-1 문자 집합으로 인코딩을 보내도록 선택합니다 rxvt. °이것은 대부분의 서구 세계에 대한 8비트 문자 집합입니다(독일어, 프랑스어, 영국 영어, 스페인어 등과 같은 언어에서 사용되는 대부분의 문자를 포괄하도록 ASCII를 확장함). UTF-8 이전에는 이것이 가장 일반적으로 사용되는 문자 집합이었습니다.

My konsole, ASCII가 아닌 모든 문자를 Eterm보냅니다 xfce4-terminal.?

내 그놈 터미널과 터미네이터는 °.

이와 같은 iso8859-1 인코딩(0xb0) bash을 받으면 무엇을 합니까 ?°xterm

문자 집합이 ASCII이므로 0xb0은 알 수 없는 문자에 해당한다고 말했습니다.

과거 미국에서는 Ctrl+X0부터 31(제어문자)까지의 문자를 입력하는데 사용하였다. ASCII에서는 해당 문자의 하위 5비트를 보냅니다. 예를 들어, Abeing 0x41, abeing은 0x61과 0x1f를 보내므로 0x1( 0x61CA 문자라고도 함)이 됩니다. 비트 8에 설정된 인코딩도 전송됩니다 . , 0x61 | 0x80(0xe1)을 보냅니다. 누르면 0x30 | 0x80이 전송되며 이는 M-0(아님) 문자라고도 알려진 0xb0입니다.Ctrl+A^AMeta+Xxa0x61Meta+AMeta+0

ASCII에서는 0x0 -> 0x1f가 텔레타이프 시대의 제어 문자로 사용되는데 대부분 더 이상 사용되지 않으며, 0x80~0xff도 더 이상 사용되지 않으므로 다른 용도로 사용할 수 있는 코드를 입력하는 방식입니다. Word를 입력하는 것보다 예를 들어, emacs는 이러한 키를 편집 키로 사용하고, C-Bchar는 커서를 한 문자 왼쪽으로 이동하고 M-B(non)char는 커서를 한 단어 왼쪽으로 이동합니다.

오늘날 대부분의 사람들은 0x80부터 0xff까지의 바이트 값을 사용하여 ASCII를 확장하는 문자 세트를 사용하기 때문에 이러한 문자 세트는 더 이상 일반적으로 메타 문자로 이해되지 않습니다. Meta+X이제 일반적으로 ESC와 X 문자라는 두 문자가 전송됩니다.

그럼에도 불구하고 bash(실제로 ) tty 장치에서 0xb0과 같은 바이트 값을 읽을 때 M-0(기본적으로 바인딩되어 있음 ) readline으로 이해합니다 .digit-argumentarg: 0

이는 convert-metareadline 구성의 설정입니다. man 3 readlinereadline 문서( )에서 readline이 문자 세트가 7비트임을 감지하면 on해당 0xb0 바이트를 ESC+0으로 변환 하도록 설정한다는 것을 알 수 있습니다 .

다음을 사용하여 끄는 경우:

bind 'set convert-meta = off'

(그리고 그것을 가정 input-meta하면 output-meta) on. 그런 다음 그것을 누르면 하나가 표시 °되는 것을 알 수 있습니다 °. 그러나 이는 0xb0 iso8859-1 인코딩이 되며 °애플리케이션은 이를 어떻게 처리할지 알 수 없습니다.

당신이 해야 할 일은 °이러한 문자를 포함하는 로케일을 수정하는 것입니다. 현재 UTF-8은 모든 문자를 포함하고 널리 지원되므로 UTF-8만 고려해야 합니다.

따라서 데스크탑 구성의 국제화 설정을 확인하고 귀하의 환경에 가장 적합한 것을 선택하십시오(예: de_CH.UTF-8스위스 fr_CH.UTF-8독일어/프랑스어/이탈리아어, UTF-8을 문자 집합으로 사용).it_CH.UTF-8

이 사항을 완전히 고려하려면 로그아웃했다가 다시 로그인해야 할 수도 있습니다.

일부 로그인 관리자에서는 로그인 시 특정 드롭다운 메뉴를 통해 로케일을 선택할 수도 있습니다.

관련 정보