
시스템: Debian 8 with XFCE, Cli: Konsole Version 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는 60년대 미국 문자 집합이며 이는 대부분의 최신 문자 집합의 공통 분모입니다.
C
이는 일반적으로 로캘이 구성되지 않았거나(LANG, LC_* 환경 변수가 모두 설정되지 않음) 또는 로 설정된 경우에 발생합니다 POSIX
.
해당 문자 세트는 바이트 값이 0에서 127까지인 128자를 정의합니다. sh 언어를 구성하고 대부분의 명령 이름에서 발견되는 모든 문자는 ASCII입니다. 그러나 § 및 °는 그렇지 않습니다.
이제 해당 기호가 키보드에 있습니다. 터미널 에뮬레이터에 해당 기호를 입력하면 어떻게 될까요?
A문자 세트가 ASCII인 로케일에서 터미널 에뮬레이터를 시작하는 경우 터미널 에뮬레이터에 를 누를 때 ( X11 키 누르기 이벤트) ASCII 인코딩의 문자 인코딩, 즉 0x61을 XK_a
보내야 함을 알려주는 것입니다 . 하지만 ( X11 키 누르기 이벤트) a
를 누르면 ° 문자에 대한 인코딩을 보내야 하는데 ASCII에는 그러한 문자가 없으므로 어떻게 해야 합니까?Shift+§XK_degree
xterm
iso-8859-1 문자 집합 rxvt
의 인코딩을 보내도록 선택합니다 . °
이는 대부분의 서구 세계의 8비트 문자 집합입니다(독일어, 프랑스어, 영국 영어, 스페인어...와 같은 언어에서 사용되는 대부분의 문자를 포함하도록 ASCII를 확장합니다). UTF-8 이전에는 가장 일반적으로 사용되는 문자 세트였습니다.
My konsole
, ASCII가 아닌 모든 문자에 대해 Eterm
보냅니다 xfce4-terminal
.?
내 그놈 터미널과 터미네이터는 °
.
에서와 같이 (0xb0) bash
의 iso8859-1 인코딩을 수신 하면 어떻게 해야 합니까?°
xterm
우리는 문자 세트가 ASCII이므로 0xb0은 알려진 문자에 해당하지 않는다고 말했습니다.
예전 미국에서는 Ctrl+X0부터 31(제어문자)까지의 문자를 입력하는데 사용되었습니다. ASCII에서는 해당 문자의 하위 5비트를 보냅니다. 예를 들어, A
being 0x41
, a
being은 0x61
0x61 Ctrl+A& 0x1f를 보내므로 0x1( ^A
CA 문자라고도 함)이 됩니다. 반면에 8번째 비트 세트로 Meta+X인코딩을 보냅니다 . 인 경우 0x61 | 0x80, 즉 0xe1입니다. 누르면 0x30 | 0x80, 즉 M-0(비)문자라고도 알려진 0xb0입니다.x
a
0x61
Meta+AMeta+0
ASCII에서는 0x0 -> 0x1f가 텔레타이프라이터 시대의 제어 문자로 사용되는데 대부분은 더 이상 사용되지 않으며, 0x80부터 0xff까지 사용되지 않으므로 코드 입력 이외의 용도로 사용할 수 있는 방법이었습니다. 텍스트를 입력하세요. 예를 들어 emacs는 편집 키에 사용되었으며 C-B
문자는 커서를 한 문자 왼쪽으로 이동하고 M-B
(비) 문자는 커서를 한 단어 왼쪽으로 이동합니다.
오늘날 대부분의 사람들은 바이트 값 0x80에서 0xff를 사용하여 ASCII를 확장하는 문자 세트를 사용하기 때문에 이러한 문자 세트는 더 이상 일반적으로 메타 문자로 이해되지 않습니다. Meta+X이제는 일반적으로 ESC와 X 문자라는 두 문자를 대신 보냅니다.
그럼에도 불구하고 0x80 ~ 0xff의 바이트 값이 문자일 수 없는 로케일에서 bash
(실제로 readline
) 0xb0과 같은 tty 장치에서 바이트 값을 읽을 때 M-0으로 이해합니다(기본적으로 에 바인딩됨 digit-argument
, )를 설명합니다 arg: 0
.
이것이 convert-meta
readline 구성의 설정입니다. readline 문서( man 3 readline
)에서 readline이 문자 세트가 7비트임을 감지하면 on
해당 0xb0 바이트를 ESC + 0으로 변환하도록 설정한다는 것을 알 수 있습니다.
다음을 사용하여 해당 기능을 끄면:
bind 'set convert-meta = off'
(그리고 가정 input-meta
하고 output-meta
또한 입니다 on
). 그런 다음 누르면 표시 °
되는 것을 알 수 있습니다 °
. 그러나 이는 °
응용 프로그램이 무엇을 해야할지 알 수 없는 0xb0 iso8859-1 인코딩입니다 .
당신이 해야 할 일은 해당 문자가 있는 로케일을 수정하는 것입니다 °
. 요즘에는 모든 문자를 포함하고 널리 지원되는 UTF-8만 고려해야 합니다.
따라서 국제화 설정에 대한 데스크탑 구성을 확인하고 환경에 가장 적합한 de_CH.UTF-8
/ fr_CH.UTF-8
/ (문자 세트로 UTF-8을 사용하는 독일어/프랑스어/이탈리아어 스위스어 사용)와 같은 것을 선택하십시오.it_CH.UTF-8
해당 사항을 완전히 고려하려면 로그아웃했다가 다시 로그인해야 할 수도 있습니다.
일부 로그인 관리자에서는 로그인 시 일부 드롭다운 메뉴를 통해 로케일을 선택할 수도 있습니다.