Linux에서 emacs -nw에서 Super 사용


15

나는 대답에 대한 간단하고 직접적인 질문을 찾기 위해 고심하고 있었으므로 여기에서 묻기로 결정했습니다.

Q : Linux의 터미널에서 Emacs에서 Super를 사용하는 방법이 있습니까?

추신 : 나는 많은 정보를 읽었 xmodmap지만 그 열쇠는 터미널 에뮬레이터가 슈퍼 키를 나타낼 수 없다는 것입니다. 그러나 (kbd "s-SPC")무언가를 반환하고의 번역 기능을 사용하려고 생각했습니다 .Xdefaults/X. 내가 올바른 길을 가고 있습니까? 의 결과를 감안할 때 kbdXTerm.VT100.translations로 무엇을 넣어야합니까?

답변:


21

터미널에 대한 인코딩 및 디코딩을 거치지 않고도 키보드 입력 및 표시 텍스트를 수신 할 수있는 X11 Emacs에 더 편합니다 . 텍스트 모드 편집기를 사용하는 주된 이유는 원격 컴퓨터에서 화면 또는 tmux 내에서 실행하는 것이지만 Tramp 덕분에 일반적으로 로컬 Emacs에서 원격 파일을 편집하는 것이 더 쉽습니다. 즉, 터미널 에뮬레이터가 협력하는 한 원하는 것을 할 수 있습니다 (Xterm의 경우).

터미널에서 키 또는 키 조합을 누르면 하나 이상의 문자 시퀀스로 터미널에서 실행중인 응용 프로그램으로 전송됩니다. 예를 들어를 누르면 a응용 프로그램이 수신 a합니다. 을 누르면 Enter응용 프로그램은 문자 CR(일명 ^M"Control-emm", 일명 문자 번호 13, 일명 \r또는 \015)를받습니다. 관련된 키 조합 Alt은 일반적으로 문자 ESC( ^[일명 일명 \e또는 \033) 로 전송되고 그 뒤에 키 또는 키 조합에 대한 시퀀스가 ​​이어집니다 Alt. 기능 키 및 기타 키 조합은 \e[또는로 시작하는 이스케이프 시퀀스로 전송됩니다 \eO.

이스케이프 시퀀스는 완전히 표준화되지 않았으며 터미널은 일반적으로 특정 키의 특정 속성을 무시합니다. 예를 들어, hyper 및 super 한정자는 일반적으로 무시됩니다. 쉘 프롬프트에서 Ctrl+ V와 그 키 조합을 차례로 누르 C-q거나 C-h cEmacs 의 키 조합을 누르면 터미널이 키 조합에 대해 전송하는 내용을 볼 수 있습니다 .

Xterm을 사용하면 X 자원을 통해 각 키의 이스케이프 시퀀스를 구성 할 수 있습니다 . 대부분의 설정은 ~/.XresourcesX가 시작될 때 부터 리소스를 읽으며을 사용하여 파일을 수동으로로드 할 수 있습니다 xrdb -merge ~/.Xresources.

XTerm.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(기능 키 나타낸다 1524대해 F5F12- 역사적인 이유로, F1을 통해 F4다른 이스케이프 시퀀스가) number2개질제를 나타낸다 ( 2에 대해 Shift, 5에 대해 Ctrl, 3에 대해 Meta, 8에 대해 Ctrl+ Meta및 + 1 추가 Shift- 없음, 매우 일관되지이다).

Mod1통해 와 같이 숫자를 통해 Hyper 및 Super 수정자를 지정해야합니다 Mod5. 키 xmodmap -pm심이 수정 자에 맵핑되는 것을 보려면 실행 하십시오. 예를 들어 Super_LMod5에 바인딩 된 경우 다음 줄 (이 정확한 경우 사용)은 Super+에 대한 바인딩을 정의합니다 Space.

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

이맥스 통해 키 내부 표현으로 이스케이프 시퀀스를 변환 input-decode-map하거나local-function-key-map (또는 function-key-map이맥스 23 전).

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

이 글은 80 % 재활용 소재로 만들어졌습니다. 모든 핵심 조합을 처리 할 수있는 리눅스 터미널이 있습니까?


이것은 약간의 흩어져있는 모든 지식을 포괄하는 훌륭한 답변입니다. 단 하나의 질문 : 당신은 어디서 32/16을 찾고 / 어떻게 선택 했습니까? 그리고 왜 아래의 emacs 바인딩과 일치하지 않습니까? 숫자의 출처를 이해했지만 number1number2의 어딘가에 매핑 테이블에 연결할 수 있는지 묻고 싶습니다 .
Andrea Richiardi

@AndreaRichiardi 스페이스 문자의 ASCII / 유니 코드 값이므로 32를 선택했으며 표준 바인딩은 Ctrl, Meta 및 Shift에 최대 8을 사용하기 때문에 16을 선택했습니다. 아래 33은 오타였습니다. 다른 키와 충돌하지 않는 한 아무 것도 선택할 수 있습니다.
Gilles 'SO- 악마 중지

시퀀스를 함수에 바인딩해야 했으므로 순간적으로 해결했습니다 (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). 그러나 완료하기 위해 define-key위의 방법을 시도했지만 트리거 할 수 없었습니다 (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). 버퍼에 16 ~ 16 만 인쇄했습니다. 키 시퀀스가 ​​바인딩되어 있고 다른 명령에 다시 할당 할 수 있도록 해당 시퀀스를 (kbd "s-SPC")에 바인딩하는 것이 좋을 것입니다.
Andrea Richiardi

C-h l지금은 S-SPC를 눌러에서 다음을 반환 ESC [ 3 2 ; 1 6 ~하지만 이맥스는 여전히 불만이M-[ 32 is undefined
안드레아 Richiardi

@AndreaRichiardi xterm 부분에 더 많은 오타를 고친 후 (Emacs가 의도 한 문자 시퀀스를 수신 한 이후 수정 된 것처럼 보입니다), 그것은 나를 위해 작동합니다. function-key-map대신에 사용하면 작동합니까 local-function-key-map? local-function-key-map터미널 종속적이므로 설정 할 때 문제가 될 수 있습니다 .
Gilles 'SO- 악의를 멈춰라'

0

Emacs 패키지를 설치하고 터미널을 구성하려는 경우 Emacs 패키지를 작성하여 Emacs와 터미널에 모든 PC 키보드 키와 수정 자 키 조합을 올바르게 인식하는 방법을 알려줄 수 있습니다.

https://github.com/CyberShadow/term-keys

수퍼 수정 자 인코딩은 기본적으로 활성화되어 있지 않지만 패키지를 사용자 정의 할 수 있으며 인코딩 할 수정 자 키 조합을 구성 할 수 있습니다. 수퍼 수정자를 포함하는 인코딩 키 조합을 사용하려면 0이 아닌 경우 term-keys/want-key-p-func를 리턴하는 함수로 설정 하십시오 ( 설명 은 기본 구현 참조 ).t(elt mods 3)


0

init 파일에 다음이 있습니다.

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

기능 키를 사용하여 슈퍼 및 하이퍼 키를 보낼 수 있습니다.


-1

짧은 대답 :을 사용하십시오 Konsole.

설명:

  • Emacs ' local-function-key-map에 대한 항목 매핑 C-x @ sevent-apply-super-modifier있습니다.
  • KonsoleSuper(Windows 로고 키)를 이스케이프 시퀀스에 매핑합니다 ( ^X@s어딘가에 문서화되지 않은 것 같습니다. 우연히 발견했습니다). Konsole예를 들어서 열어서 시도 할 수 있습니다 Ctrl-v Win-o.

답변 주셔서 감사하지만 용어를 변경하는 것은 내가 찾고있는 해결책이 아닙니다.
Andrea Richiardi 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.