Compose 키가 순수 콘솔과 X에서 다르게 동작하는 이유는 무엇입니까?

Compose 키가 순수 콘솔과 X에서 다르게 동작하는 이유는 무엇입니까?

Xubuntu 20.04에서 키보드 레이아웃을 설정하고 있습니다.

나는 일반적으로 동일한 키 입력을 사용하여 일반 콘솔과 X 모두에서 다양한 유니코드 문자를 입력할 수 있기를 원합니다. 나는 콘솔이 유니코드(512개의 문자)를 제한적으로 지원한다는 것을 알고 있으므로 콘솔이 이 제한된 범위 내에서만 작동한다는 데 동의합니다.

xfce4-keyboard-settings에서 "시스템 기본값 사용"을 그대로 두고 이 옵션을 "설정 사용 /etc/default/keyboard"으로 이해하고 콘솔 전용 및 X에 대한 단일 구성을 원했습니다.

저는 sudo dpkg-reconfigure keyboard-configuration"AltGr Dead Keys가 있는 US International" 레이아웃 변형을 실행하고 선택했습니다.

나는 순수 콘솔 bash에서 "(arg: x)" 모드를 입력하면 일부 AltGr 시퀀스가 ​​엉망이 된다는 것을 발견했고, 일부 readline 기능과 관련하여 구글링을 했으며 잠정적으로 이것이 주제에서 벗어난 것이라고 생각했습니다. bash로 시작하는 이 동작을 배제하는 sh것이 가장 쉽습니다 .

이 시점에서 키보드 레이아웃이 콘솔과 X: AltGr+2 유형에서 동일하게 작동하는 것 같아 기쁩니다.², AltGr+` 다음 e 입력이자형.

작성 키로는 Caps Lock을 선택했습니다.

X에서는 다음과 같은 동작이 예상됩니다. oo 유형은 각도 표기법으로 작성되고 e= 유형은 유로 표기법으로 작성됩니다.

그러나 콘솔에서는 Compose 시퀀스가 ​​거의 작동하지 않습니다. 학위도 없고 유로도 없습니다(단, 완벽하게 표시되며 AltGr을 통해 입력할 수도 있음). Compose 키는 Compose `e 구성과 같은 가장 기본적인 구성에 여전히 작동하므로 완전히 쓸모가 없습니다.이자형. 그러나 이는 512개의 글리프보다 훨씬 더 제한적입니다.

그렇다면 콘솔 Compose가 그토록 다르게 동작하는 이유는 무엇이며, 최소한 학위나 유로처럼 겉으로는 단순해 보이는 것들을 지원하도록 조정할 수 있을까요?

답변1

콘솔은 완전히 다른 코드로 처리되기 때문에 다르게 동작합니다. /etc/default/keyboard다음 설정이 포함되어 있습니다.XKB, 이는 X의 키보드 입력 처리의 일부입니다. 이것콘솔 설치 패키지이러한 설정을 콘솔이 수행할 수 있는 작업으로 프로그래밍 방식으로 변환setupcon(읽고 구문 분석 /etc/default/keyboard) 및ckbcomp(XKB 설정을 콘솔 설정으로 변환합니다). 이러한 도구는 콘솔의 기능에 따라 제한됩니다.

Linux 콘솔은 커널 내부에서 구현되며 멀티바이트 문자 집합에 대해 부분적인 지원만 제공합니다. 특히 작성 키의 경우 커널에 하드코딩된 제한이 있습니다.구성표( accent_table)하드코딩된 크기는 다음과 같습니다.MAX_DIACR커널을 다시 컴파일하지 않으면 256입니다. 이는 콘솔 설정 패키지에 유니코드 작성 테이블이 없는 이유를 설명합니다. 항목이 256개뿐이므로 무엇을 하든 많은 문자를 포함하지 않습니다. 내가 아는 한, 유니코드 문자 세트와 함께 콘솔 설정을 사용하면 결국 커널의내장된 구성 테이블이는 ASCII가 아닌 라틴 1 악센트 문자만 나열합니다(°와 같은 구두점은 제외).

자신만의 구성 테이블을 정의할 수 있습니다. 두 캐릭터의 최대 256개 조합을 선택하여 세 번째 캐릭터를 형성하고 콘솔 작성 맵 파일에 나열합니다.

Compose 'o' 'o' to degree
Compose 0x6f 0x006f to 0xb0
Compose U+6F U+006f to U+00B0

위의 첫 번째 줄은 Compose o oinsert 를 표현하는 다양한 방법을 보여줍니다 °. 물론 하나만 필요합니다. 문자를 지정하는 방법은 다음과 같습니다.

  • 10진수, 선행 8진수 0또는 선행 16진수입니다 0x.
  • 단일 바이트안에 있는 문자들입니다 '. 이 문자 앞에는 백슬래시가 올 수 있고, 백슬래시와 작은따옴표 앞에는 백슬래시 '\o''o'와야 '\\'합니다 '\'.
  • '\ooo'어디오, 오최대 255( \377)의 값을 지정하는 정확히 3개의 8진수입니다.
  • U+hhhh어디헤헤정확히 4자리 16진수입니다.
  • 오른쪽에만 to캐릭터의 상징적인 이름이 있습니다. 기호 이름은 X11 키 기호 이름의 하위 집합입니다. 보다원천( syms.*.h)기호 이름 목록을 가져옵니다.

자체 작성 맵을 로드하려면 다음을 실행하세요.

loadkeys /path/to/my/compose.kmap

이는 현재 로드된 조합 테이블을 대체합니다.

사용자 정의 작성 맵을 로드하도록 콘솔 설정에 지시하는 방법을 찾을 수 없습니다. 유니코드가 아닌 인코딩의 경우 ckbcomp로드되지만 유니코드의 경우 이 단계를 건너뜁니다./etc/console-setup/compose.${charmap}.inc

1 배열의 요소 수kbdiacrucstruct kbdiacrsuc사용자 모드에서 설정할 수 있는 최대 항목 개수입니다. 동일한 값으로 설정해야 할 수도 있습니다.
² 소스: 소스 코드( kbd패키지, 파일 src/libkeymap/analyze.l) src/libkeymap/parser.y. 문서에서 이러한 세부 정보를 찾을 수 없습니다.

관련 정보