답변:
터미널에서 키 또는 키 조합을 누르면 하나 이상의 문자 시퀀스로 터미널에서 실행중인 응용 프로그램으로 전송됩니다. 예를 들어를 누르면 a응용 프로그램이 수신 a
합니다. 을 누르면 Enter응용 프로그램은 문자 CR
(일명 ^M
"Control-emm", 일명 문자 번호 13, 일명 \r
또는 \015
)를받습니다. 관련된 키 조합 Alt은 일반적으로 문자 ESC
( ^[
일명 일명 \e
또는 \033
) 로 전송되고 그 뒤에 키 또는 키 조합에 대한 시퀀스가 이어집니다 Alt. 기능 키 및 기타 키 조합은 \e[
또는로 시작하는 이스케이프 시퀀스로 전송됩니다 \eO
.
이스케이프 시퀀스는 완전히 표준화되지 않았으며 터미널은 일반적으로 특정 키의 특정 속성을 무시합니다. 예를 들어 Ctrl+ Shift+ letter는 기본적으로 Ctrl+ 와 같이 정확하게 전송됩니다 letter.
쉘 프롬프트에서 Ctrl+ V와 그 키 조합을 차례로 누르 C-q
거나 C-h c
Emacs 의 키 조합을 누르면 터미널이 키 조합에 대해 전송하는 내용을 볼 수 있습니다 .
일부 터미널 에뮬레이터를 사용하면 각 키에 대한 이스케이프 시퀀스를 구성 할 수 있습니다. Xterm에서 이것은 X resources를 통해 수행됩니다 . 대부분의 설정은 ~/.Xresources
X가 시작될 때 부터 리소스를 읽으며을 사용하여 파일을 수동으로로드 할 수 있습니다 xrdb -merge ~/.Xresources
.
Term.VT100.translations: #override \n\
Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
Ctrl Shift ~Meta <key>percent: string("\033[37;6~")
공통 규칙은 ESC [ number1 ; number2 ~
수정자가있는 기능 키 에 대해 형식의 이스케이프 시퀀스를 사용합니다 . number1
기능 키를 나타낸다 ( 15
행 24
에 대한 F5행 F12- 역사적인 이유로, F1을 통해 F4다른 이스케이프 시퀀스가) 및 number2
수식을 나타낸다 ( 2
에 대해 Shift, 3
에 대해 Meta, 5
에 대해 Ctrl, 7
에 대해 Ctrl+ Meta및 1 추가 Shift적어도 하나와 함께 Ctrl또는 Meta).
이맥스 통해 키 내부 표현으로 이스케이프 시퀀스를 변환 input-decode-map
하거나local-function-key-map
(또는 function-key-map
이맥스 23 전).
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
ESC
(128 자 이상을 시도하지 않는 한 가능한 입력 인코딩을 제한하지 않는 한) 두 번째 문자는 ESC foo
바인딩 을 원하지 않는 것이어야 함을 의미합니다 .
local-set-key
실제로 일 define-key
? 전자는 오류 (잘못된 인수 수)를 제공하지만 후자는 적어도 <kbd> C-Enter </ kbd>에 대해 작동합니다. Konsole이 여전히 <kbd> CM-% </ kbd>를 전송하는 데 문제가있는 것 같습니다.
define-key
. Konsole의 이스케이프 키를 구성 할 수 있는지 모르겠습니다. xterm은 다른 방법보다 사용자 정의가 가능합니다.
XTerm*modifyOtherKeys: 2
리소스를 사용하면 C-M-
조합 에도 고유 한 시퀀스를 생성 하지만이 설정을 사용하면 많은 사용자 지정 매핑을 제공해야합니다 ( XTerm*modifyOtherKeys: 1
기능이 부족하지만 기능이 훨씬 뛰어남). 예를 들어 볼 (나를 위해 작동하지 않은 일이기는하지만) xterm-extras.el
라이브러리 및 관련 .Xresources
및 .inputrc
에있는 파일 easymacs의 다운로드.
KDE의 곤솔을 가정 할 때 제한적이지만 중요한 키 세트의 경우 emacs -nw에서 작동하는 복잡한 키 바인딩을 갖기 위해 다음을 수행 할 수 있습니다.
S-<RET>
예를 들어 작업 구현에 대한 구현을 사용합니다 .
Return+Shift
키를 누르고 새로운 항목을 작성 하고 유용한 키 시퀀스를 제공하십시오 ( \E[27;3
xev와 함께 파고 났을 때 X가 보낸 키 시퀀스라고 생각했지만 잘못되었을 수도 있습니다. 적절한 탈출구가 있고 다른 것과 충돌하지 않는지 확인하십시오).시작 emacs -nw
하고 스크래치 버퍼에서 다음을 평가하십시오.
(read-key-sequence-vector "Type your new key:")
그런 다음 새 키 조합을 입력하십시오.
바인딩 할 수있는 키 시퀀스를 추출해야합니다.
( 콘솔 키 바인딩을 엉망으로 만들기 전에 [27 91 50 55 59 51]
지루한 옛날과는 반대로 나에게 돌아 왔습니다 [13]
.)
emacs 구성에 추가하십시오 :
(define-key function-key-map [27 91 50 55 59 51] [(shift return)])
다음을 emacs -nw
사용하여 스크린 세션에서 테스트했습니다 .
(define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
(define-key sh-mode-map [(shift return)] #'send-line-to-shell)
짧은 대답은 모든 터미널의 근본적인 한계라는 것입니다.
약간 더 긴 대답은 누군가가 원하는 것을 수행하는 터미널을 만들었더라도 Emacs 자체 가이 가상 터미널을 사용하기 위해 큰 변화가 필요하다는 것입니다.
무손실 키보드 입력을 허용하는 방식으로 VT 프로토콜을 확장하려는 노력이 있습니다 (그래픽과 같은 다른 기능 중에서도).
하나의 예는 notty입니다 : https://github.com/withoutboats/notty
infocmp $TERM
?에 정의 된 것과 충돌하지 않는 한 이스케이프 시퀀스는 임의적 일 수 있습니까 ?