"Escape"를 눌러도 실행되지 않는 "Alt"가 포함된 키보드 단축키를 만듭니다.

"Escape"를 눌러도 실행되지 않는 "Alt"가 포함된 키보드 단축키를 만듭니다.

나는 다음과 같은 매핑을 만들었습니다.~/.zshrc

bindkey -s '^[u' 'whatever string'

vim다음 규칙을 설정하여 패턴을 활성화했습니다.~/.zshrc

bindkey -v

내가 겪고 있는 문제는 삽입 모드에 있을 때 일반 모드로 들어가고 싶을 때 발생합니다. Escape를 누르면 커서 위치의 명령 프롬프트에 추가됩니다 u. whatever string이는 을 누를 때마다 Escape누를 수 없는 유일한 키는 u일반 모드로 들어가는 것임을 의미합니다. 그렇지 않으면 추가하겠습니다 whatever string.

그래서 제 질문은 다음을 눌러 전환 되지 않도록 Alt + u추가하도록 매핑하는 방법입니다 .whatever stringEscapeu

PD1: 이것은 최소한의 작업 예입니다.

PD2:현재 사용 중인 해결 방법은 키를 누르는 것입니다. Escape + {no map} + u( {no map}아직 매핑되지 않은 키는 어디에 있습니까 Alt?)

답변1

~처럼@JdeBP 라고, 이제 사용자가 키를 길게 누르면 터미널은 EscapeU u+001B U+0075 ( )와 같은 동일한 문자 시퀀스를 전송합니다.uAlt\eu

Alt그러나 +의 경우 u두 문자를 동시에 보내는 반면, 의 Escape경우 u사용자가 두 문자를 동시에 누르지 않기 때문에 전송과 문자 사이에 지연이 있으므로 일반적으로 애플리케이션에서 알 수 있습니다. 차이나는 곳.\eu

줄 편집기에서 zsh키 바인딩이 있을 때 키 누르기가 수신 후 몇 센티초 이내에 수신되지 않거나 이외의 문자가 있는 경우 실행됩니다.xxyxy$KEYTIMEOUTxy

기본값은 $KEYTIMEOUT40(0.4초)입니다. 이 값을 사용하면 사용자가 다중 문자 바인딩을 수동으로 입력할 수 있지만, 다중 문자 바인딩 키 조합 또는 기능 키가 누를 때만 트리거되도록 사람이 키 시퀀스를 너무 빨리 입력할 수 없을 정도로 작게 설정할 수 있습니다.

예를 들어 1(0.01초)로 변경하면 바인딩이 실행된 후 빠르게 입력 $KEYTIMEOUT해야 합니다 .uEscape\eu

이는 zsh에만 국한되지 않습니다. 사용자 정의 키 바인딩을 허용하는 대부분의 대화형 터미널 애플리케이션에는 동일한 설정이 있습니다. 예를 들어 라인 편집기( , , ... readline사용)에서 이는 변수(기본값 0.5초)이고, 보기 변수 및 환경 변수(기본값 1초)는 1입니다. 두번째).bashpythongdbkeyseq-timeoutncursesESCDELAYvimtmttm

답변2

터미널이 (가상) 와이어를 통해 호스트로 문자를 전송할 때,차이 없음키 시퀀스 Esc U와 키 코드 사이 ⎇ Alt+ U또는 복합 키 시퀀스 사이 ⎈ Control+ [ U.

그것들은 모두 문자 다음에 문자 로 인코딩됩니다 u. Z 쉘은 터미널에서 나오는 입력 문자 스트림에서 차이를 보지 못하므로 구별할 수 없습니다. 터미널 I/O 응용 프로그램은 키 입력이 아닌 문자를 봅니다.

관련 정보