
Ubuntu와 Arch 모두에서 zsh 쉘을 기본 쉘로 사용합니다.
my 에서 다음 줄을 사용하여 zsh 셸의 기록에서 자동 완성되도록 바로가기(위쪽 화살표)를 구성했습니다 .zshrc
.
bindkey "^[[A" history-beginning-search-backward
그러나 Ubuntu에서 소스 및/또는 재부팅을 하면 .zshrc
바로 가기가 작동하지 않습니다(무엇을 입력하기 시작했는지에 관계없이 이전 명령만 얻습니다). 반면 Arch에서는 잘 작동합니다(무엇으로 시작하는 마지막 명령만 얻습니다). 나는)를 입력했습니다.
이 문제를 해결하는 방법을 아는 사람이 있나요?
답변1
대부분의 xterm과 유사한 터미널에서 Up(대부분의 탐색 키와 유사함) 은 터미널이 삽입되었는지 여부에 따라 ␛[A
전송 됩니다.␛OA
키패드 전송모드인지 아닌지. 및 terminfo 항목을 사용하여 터미널을 해당 모드로 설정하거나 해제할 수 있습니다 smkx
.rmkx
(키 커서가 1만큼 위로) terminfo 항목 은 다음과 같은 경우 kcuu1
에 전송된 시퀀스를 설명합니다.Up키패드 전송모드, 즉 ␛OA
.
데비안과 파생 제품에는 /etc/zsh/zshrc
다음을 수행하는 파일이 있습니다.
function zle-line-init () {
emulate -L zsh
printf > /dev/tty '%s' ${terminfo[smkx]}
}
zle이 활성화되면 터미널이 해당 모드로 전환됩니다. 즉, 이제 terminfo 데이터베이스를 사용하여 키가 전송하는 문자 시퀀스를 알 수 있습니다.
파일도$key
연관 배열을 정의합니다terminfo 항목을 기반으로 위젯에 매핑하는 데 도움이 됩니다. 따라서 해당 시스템에서는 다음을 수행할 수 있습니다.
(($+key[Up])) && bindkey $key[Up] history-beginning-search-backward
터미널이 있는 시스템에서 작동하는 것의 경우키패드 전송모드와 해시가 없거나 없는 모드에서는 다음을 $key
수행할 수 있습니다.
bindkey $terminfo[kcuu1] history-beginning-search-backward
bindkey ${terminfo[kcuu1]/O/[} history-beginning-search-backward
또한보십시오:
- 커서 키가 작동하지 않습니다(ncurses FAQ)
- (어떤 것이든) 쉘에서 커서 키를 사용할 수 없는 이유는 무엇입니까?(xterm FAQ)
답변2
커서 키가 재미있네요.
비록 편집 키만큼 재미는 없지만정말재미있는.
당신은두 세트키보드의 커서 키,커서 키패드그리고 위에 있는 것들은계산기 키패드.
대부분의 터미널 에뮬레이터는 각 키 세트가 개별적으로 전환 가능한 DEC VT 모델을 사용하려고 시도합니다(때로는 매우 열악함).응용 프로그램 모드그리고일반 모드개인 모드 설정 DECCKM
(커서 키패드 모드) 및 DECNKM
(숫자 키패드 모드)를 각각 사용합니다. 응용 프로그램 모드의 개념은 기본적으로 관련 키패드의 키가 추가 응용 프로그램 기능 키로 바뀌는 것입니다.
-
⇐ 커서 키패드입니다.
-
- 일반 모드에서 화살표 키는 ECMA-48
CUB
,CUF
,CUU
및CUD
제어 시퀀스를 보냅니다. 단, ⎇ Alt수정자가 적용되는 경우에는DECFNK
제어 시퀀스를 보냅니다. - 애플리케이션 모드에서 화살표 키는
SS3
단일 교대 3 시퀀스를 보냅니다.
- 일반 모드에서 화살표 키는 ECMA-48
-
⇐ 계산기 키패드입니다.
-
- 일반 모드에서 화살표 키는 ECMA-48
CUB
,CUF
,CUU
및CUD
제어 시퀀스를 보냅니다. 단, ⎇ Alt수정자가 적용되어DECFNK
제어 시퀀스를 보내는 경우가 아니면 숫자 잠금 및 Shift 조합으로 인해 숫자가 전송되지 않는 한입니다. - 응용 프로그램 모드에서 화살표 키는 다음을 보냅니다.다른 세트
SS3
단일 시프트 3 시퀀스(숫자 잠금 및 시프트 조합으로 인해 숫자가 전송되지 않는 한).
- 일반 모드에서 화살표 키는 ECMA-48
␛
[
A
위젯에 바인딩하도록 ZLE에 지시한 시퀀스는 ("커서 UP") 제어 시퀀스인 제어 시퀀스에 대한 ECMA-48 7비트 별칭 입니다 CSI
A
. CUP
해당 제어 시퀀스는 키패드가 일반 모드에 있고 수정 ⎇ Alt자가 적용되지 않을 때 DEC VT 및 모방 터미널 에뮬레이터에 의해서만 생성됩니다. 관련 키패드가 애플리케이션 모드에 있을 때 전송된 변속 순서와 일치하지 않습니다.
terminfo 데이터베이스는 터미널 I/O에 이 모델을 사용하지 않기 때문에 상황을 혼란스럽게 하고 여기서 추가적인 재미를 유발합니다. 오히려 자체적으로 사용합니다.다른"로컬" 및 "원격" 키 개념을 구현하는 모델. 이는 DEC VT 애플리케이션/일반 모드 전환이 실제로 포함되는 것과 전혀 다릅니다. 단일 로컬/원격 스위치 메커니즘을 갖추고 있어 전환이 완료됩니다.둘 다애플리케이션/일반 모드 사이의 키패드는 분리되지 않습니다.
terminfo는 DEC VT를 모방하지 않는 터미널이나 터미널 에뮬레이터를 사용하는 경우를 대비해 ZLE를 구성하는 방법을 하나의 특정 터미널 유형에 고정하지 않는 방법입니다. 그리고 Z 셸은 데이터베이스 기록에서 필요한 기능 항목에 액세스하는 방법을 제공합니다. 따라서 terminfo에서 위쪽/아래쪽/왼쪽/오른쪽 커서 키가 생성할 것으로 예상하는 제어 시퀀스를 읽고 bindkey
해당 제어 시퀀스를 위젯에 매핑하는 적절한 명령을 실행할 수 있습니다.
문제는 terminfo가 이 작업에 적합하지 않다는 것입니다. 녹음하는 방법밖에 없어요하나키당 제어 시퀀스를 제어하는 반면, 보시다시피 키는 전송할 수 있습니다.적어도모드와 누른 수정자에 따라 달라지는 세 가지 다른 시퀀스. (수정자는 DEC VT 모델에서 전송된 제어 시퀀스에 상당한 영향을 미칠 수 있습니다.) 따라서 터미널을 terminfo가 예상하는 것을 생성하는 모드로 전환해야 합니다.
그러나 상황은 더욱 악화됩니다. terminfo는 일관성이 없습니다. 단일 제어 시퀀스는 때로 DEC VT 애플리케이션 모드 시퀀스입니다.터미널 putty
유형, 때로는 DEC VT 일반 모드 시퀀스(terminfo 레코드)터미널 rxvt
유형, 그러나 DECFNK
순서는 아닙니다. 따라서 특정 터미널이나 터미널 에뮬레이터를 사용하여 애플리케이션으로 전환해야 하는지 일반 모드로 전환해야 하는지 알 수 있는 방법이 없습니다. 한 사람에게는 옳은 일이 다른 사람에게는 잘못될 것입니다.
따라서 다른 접근 방식은 terminfo를 무시하고 다음과 같은 사실을 인식하는 것입니다.이미그리고 귀하의 터미널이 항상 원래 명령을 사용하는 DEC VT와 같을 것이라고 가정하면 매우 기쁠 것입니다 bindkey
. 터미널이 애플리케이션 모드인지 일반 모드인지 여부에 관계없이 전송하는 제어 시퀀스가 일치하는지 확인하려면 두 가지만 필요합니다.
바인드키 "^[OA" 기록-시작-검색-뒤로
그러나 이는 수정자 키를 누르는 것에 대처할 수 없습니다. 이는 CUP
제어 시퀀스에 추가 매개변수를 추가하여 ZLE가 찾고 있는 모든 것이 매개변수가 없는 평범한 오래된 문자열일 때 실패하는 단순한 문자열 일치를 유발합니다 CUP
. 가능한 각 수정자 조합으로 인해 발생하는 bindkey
가능한 각 제어 시퀀스에 대해 추가 명령을 수동으로 실행해야 합니다 .CUP
시퀀스 1 8 | 읽는 동안 -ri 하다 바인딩 키 "^[[1;${i}A" 기록-시작-검색-뒤로 완료
ZLE는 혼자가 아닙니다. 쉘 과 같은 다른 terminfo 기반 프로그램도 fish
같은 방식으로 문제를 겪습니다. ( fish
쉘 사람들도 하나의 터미널 에뮬레이터에 적합한 응용 프로그램/일반 모드 선택이 다른 터미널 에뮬레이터에서는 잘못될 수 있다는 사실을 발견했습니다.)libtermkey
입력을 위한 실제 ECMA-48 제어 시퀀스 파서가 있는 경우) 이 프로그램에서는 이미 오래 전부터 사용되었습니다. 하지만 아직까지 누구도 이를 해결하지 못했습니다.
추가 읽기
- https://unix.stackexchange.com/a/444270/5132
- "키보드 기능". VT510 비디오 터미널 프로그래머 정보. EK-VT510-RM. 1993년 11월. 디지털.
- https://unix.stackexchange.com/a/289871/5132
- 조나단 드 보인 폴라드(2018-05-14).일부 터미널에는 키패드 모드(smkx)가 필요합니다.. 생선 껍질 버그 #2139.
- https://unix.stackexchange.com/a/419092/5132