Konsole 키탭에서 VT220 이스케이프 시퀀스 에뮬레이션

Konsole 키탭에서 VT220 이스케이프 시퀀스 에뮬레이션

쓸데없는 해킹 끝에 나는 이것을 깨달았습니다. . . 다양한 메타 키를 사용할 수 있도록 HHK 키보드를 올바르게 매핑해야 합니다. 그리고 그렇게 나의 지옥 여행은 시작되었다.

더그 팔머,신뢰할 수 없는 XKB 구성 가이드

응용 프로그램 키보드 모드가 활성화되면(예: 를 통해 ) echoti smkx숫자 키패드에서 VT220 스타일 이스케이프 시퀀스를 내보내도록 Konsole을 구성하려고 합니다. 특히 설명된 조건에서는 다음 제어 시퀀스가 ​​출력되어야 합니다.

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-VT220-Style-Function-Keys

TERM환경 변수를 수정하는 것은 터미널 기능에 대해 쉘에 거짓말을 하는 것과 같으므로 일반적으로 피해야 한다는 점을 인식하는 것이 중요합니다 . 간단한 설정으로 TERM=xterm-vt220는 충분하지 않으며 예상치 못한 동작이 발생할 수 있습니다.

간단하지만 부분적인 해결책이 있습니다. Konsole을 사용하면 터미널 키 바인딩을 파일로 구성할 수 있습니다 .keytab. 다음 추가 사항은 유효하며 다음 위치에 저장됩니다 .local/share/konsole/VT220.keytab.

keyboard "VT220"
key 0+KeyPad+AppCursorKeys : "\EOp"
key 1+KeyPad+AppCursorKeys : "\EOq"
key 2+KeyPad+AppCursorKeys : "\EOr"
key 3+KeyPad+AppCursorKeys : "\EOs"
key 4+KeyPad+AppCursorKeys : "\EOt"
key 5+KeyPad+AppCursorKeys : "\EOu"
key 6+KeyPad+AppCursorKeys : "\EOv"
key 7+KeyPad+AppCursorKeys : "\EOw"
key 8+KeyPad+AppCursorKeys : "\EOx"
key 9+KeyPad+AppCursorKeys : "\EOy"
key ++KeyPad+AppCursorKeys : "\EOk"
key *+KeyPad+AppCursorKeys : "\EOj"
key .+KeyPad+AppCursorKeys : "\EOn"
key -+KeyPad+AppCursorKeys : "\EOm"
key Enter+KeyPad : "\EOM"

이러한 키 바인딩(및 존재할 수 있는 다른 키 바인딩)이 적용되면 응용 프로그램 키보드 모드가 활성화되고 NumLock이 켜져 있을 때와 konsole동일한 제어 시퀀스가 ​​생성됩니다. xterm이러한 시퀀스는 숫자 키패드의 키 입력을 고유하게 식별하여 임의의 기능을 바인딩할 수 있기 때문에 VT220 에뮬레이션이 필요한 애플리케이션에 유용합니다.

/내 구성에 공통 키보드 키 (Qt::Key_Slash) 가 없습니다 . Konsole 그래픽 키 바인딩 편집기는 이름이든 텍스트이든 이 키에 대한 참조를 인식하지 못하는 것 같습니다. .keytab파일 에 수동으로 쓰면 Konsole은 이를 무시하고 해당 줄은 GUI 편집기에 나타나지 않습니다. 이로 인해 키보드에 단 하나의 키만 완고하게 프로그래밍할 수 없는 매우 성가신 구멍이 생겼습니다.

xkb나는 친구들과 함께 수렁에 빠지고 싶지 않습니다 . 물론 바닐라가 xterm기본으로 제공됩니다. 이는 이 경우 그렇게 낮은 수준에서 키 바인딩을 조작할 필요가 없음을 의미합니다. 대신 Konsole(또는 QT)은 X 위에 독특하고 눈송이처럼 보이는 작업을 수행하는 것 같습니다.

질문:Konsole에서 숫자 키패드 키를 /다른 제어 순서에 다시 바인딩할 수 있습니까? 아니면 다른 수준(예 terminfo: xkb또는 xterm-keys에서 tmux)에서 작동하는 것이 더 효율적일 수 있는 지점입니까 ? 내가 미친 건 아닐까?

다른 용감한 콘솔 사령관들의 통찰력을 높이 평가하겠습니다.

답변1

Konsole은 다음에 의존하기 때문에 이를 무시합니다.매핑할 수 없는 하드코딩된 키 목록:

// 다음 단축키 중 하나를 재정의합니다. 왜냐하면
// 터미널에 필요합니다.
int keyCode = keyEvent->key() | int keyCode = keyEvent->key() |수정자;
스위치(키코드) {
    //목록은 QLineEdit::event() 코드에서 가져옵니다.
사례 Qt::Key_Tab:
사례 Qt::Key_Delete:
사례 Qt::Key_Home:
사례 Qt::Key_End:
사례 Qt::Key_Backspace:
케이스 Qt::Key_Left:
사례 Qt::Key_Right:
사례 Qt::Key_Slash:
사례 Qt::Key_Period:
사례 Qt::Key_Space:
    keyEvent->accept();
    사실을 반환;
}
거짓을 반환;

관련 정보