emacs에서 Ctrl 및 Shift 화살표 키를 작동시키는 방법은 무엇입니까?

emacs에서 Ctrl 및 Shift 화살표 키를 작동시키는 방법은 무엇입니까?

나는 최근에 tmux(이전에는 스크린 사용자)를 사용하기 시작했고 한 가지 작은 문제를 제외하고는 그것을 좋아합니다. 저는 tmux 세션에서 emacs를 사용하고 있으며, (tmux 창이 아닌) emacs 창 사이를 이동하기 위해 Shift-화살표 키를 사용하는 데 익숙합니다. tmux에서 실행할 때 이러한 바인딩은 완전히 작동하지 않는 것처럼 보입니다(Emacs에 전혀 등록되지 않은 것처럼). tmux를 종료하고 셸에서 emacs를 실행하면 제대로 작동합니다.

저는 iTerm2를 사용하고 있으며 SSH를 통해 Linux 시스템에 연결하고 거기에서 tmux/emacs를 실행하고 있습니다. .emacs에 Shift-화살표 키 바인딩을 다음과 같이 설정했습니다.

(global-set-key "\M-[1;2A" 'windmove-up)
(global-set-key "\M-[1;2B" 'windmove-down)
(global-set-key "\M-[1;2C" 'windmove-right)
(global-set-key "\M-[1;2D" 'windmove-left)

tmux에서 실행하지 않을 때 emacs에서 Cq를 실행한 다음 키 시퀀스를 눌러 Shift-화살표 키 조합에 대한 올바른 문자 시퀀스인지 확인할 수 있습니다. tmux에서는 Shift-화살표 키의 입력이 표시되지 않는 것 같기 때문에 이조차 작동하지 않습니다(단지 Cq 프롬프트에 있음).

tmux의 키 바인딩을 보면 Shift-화살표 키에 바인딩된 것이 아무것도 없는 것 같습니다. 설사 있다고 하더라도 입력 접두사 뒤에만 등록됩니다(제 경우에는 Co에 바인딩됨).

tmux에서 Shift-화살표 키를 다시 작동시키는 방법에 대한 아이디어가 있습니까?

답변1

먼저 모든 위치에서 용어가 올바른지 확인하세요.

  • xtermxterm-256color- 로컬 셸에서 실행되는 것(예:)iTerm2창문
  • xterm- Linux 시스템에 SSH 연결한 후의 셸 내용
    로컬에서 사용하는 내용과 동일해야 합니다.iTerm2, SSH가 이를 원격 측에 전달해야 하기 때문입니다(그리고 중요한 것은 원격 측이 쉘 초기화 파일의 값을 맹목적으로 덮어쓰면 안 된다는 것입니다).
  • screenscreen-256color- 쉘 내부에서 실행되는 것(예:)멀티플렉서Linux 시스템에서는 항상 내부적으로 TERM을 사용해야
    합니다 .screen멀티플렉서.

xterm즉시 야외에서 한 학기를 보내세요.멀티플렉서허용할 것이다멀티플렉서수정된 화살표 키를 인식하지만 xterm-keys창 옵션도 켜져 있지 않으면 전달되지 않습니다. ~/.tmux.confLinux 시스템에 넣으십시오 .

set-window-option -g xterm-keys on

이제 Shift 키 순서가 통과되어야 합니다.이맥스, 실행 중멀티플렉서, SSH를 통해 연결,iTerm2창문.

답변2

xterm-keys먼저 tmux 구성에서 이를 활성화해야 합니다. 그래서 다음을 넣어보세요~/.tmux.conf

setw -g xterm-keys on

그러나 이로 인해 다른 키 조합이 중단됩니다. 이 문제를 해결하려면 ~/.emacs또는 ~/.emacs.d/init.el구성 에 다음을 입력하세요.

;; handle tmux's xterm-keys
;; put the following line in your ~/.tmux.conf:
;;   setw -g xterm-keys on
(if (getenv "TMUX")
    (progn
      (let ((x 2) (tkey ""))
    (while (<= x 8)
      ;; shift
      (if (= x 2)
          (setq tkey "S-"))
      ;; alt
      (if (= x 3)
          (setq tkey "M-"))
      ;; alt + shift
      (if (= x 4)
          (setq tkey "M-S-"))
      ;; ctrl
      (if (= x 5)
          (setq tkey "C-"))
      ;; ctrl + shift
      (if (= x 6)
          (setq tkey "C-S-"))
      ;; ctrl + alt
      (if (= x 7)
          (setq tkey "C-M-"))
      ;; ctrl + alt + shift
      (if (= x 8)
          (setq tkey "C-M-S-"))

      ;; arrows
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
      ;; home
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
      ;; end
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
      ;; page up
      (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
      ;; page down
      (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
      ;; insert
      (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
      ;; delete
      (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
      ;; f1
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
      ;; f2
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
      ;; f3
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
      ;; f4
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
      ;; f5
      (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
      ;; f6
      (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
      ;; f7
      (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
      ;; f8
      (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
      ;; f9
      (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
      ;; f10
      (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
      ;; f11
      (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
      ;; f12
      (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
      ;; f13
      (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
      ;; f14
      (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
      ;; f15
      (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
      ;; f16
      (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
      ;; f17
      (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
      ;; f18
      (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
      ;; f19
      (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
      ;; f20
      (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))

      (setq x (+ x 1))
      ))
    )
  )      

나에게도 내 해결책이 있다아치리눅스 위키

답변3

티먹스 FAQ다음 항목을 포함하는 데 사용됩니다.:

emacs에서 Ctrl 및 Shift 화살표 키를 작동시키는 방법은 무엇입니까?

terminal-init-screen의 기능은 term/screen.el새 프레임에 대해 호출되지만 기능 키를 구성하지는 않습니다.

tmux xterm-keys옵션이 켜져 있으면 xterm과 동일한 키를 정의하는 것으로 충분합니다. 다음을 추가 init.el하거나 .emacs다음을 수행하십시오.

(defadvice terminal-init-screen
  ;; The advice is named `tmux', and is run before `terminal-init-screen' runs.
  (before tmux activate)
  ;; Docstring.  This describes the advice and is made available inside emacs;
  ;; for example when doing C-h f terminal-init-screen RET
  "Apply xterm keymap, allowing use of keys passed through tmux."
  ;; This is the elisp code that is run before `terminal-init-screen'.
  (if (getenv "TMUX")
    (let ((map (copy-keymap xterm-function-map)))
    (set-keymap-parent map (keymap-parent input-decode-map))
    (set-keymap-parent input-decode-map map))))

그리고 " "를 꼭 .tmux.conf포함 해주세요 set -g xterm-keys on.

또는 screen.el파일을 로드 경로에 복사하고 사용자 정의할 수 있습니다.

tmux를 열었습니다이슈 #1349FAQ 항목 복원을 요청하세요.

답변4

일반적으로 이러한 유형의 문제는 터미널 에뮬레이터가 보내는 내용이 클라이언트 응용 프로그램에서 예상하는 내용과 일치하지 않기 때문에 발생합니다.

다양한 터미널 에뮬레이터에는 다양한 수준의 사용자 정의 기능이 있으므로 특정 터미널 에뮬레이터의 에뮬레이션 조정 가능 매개변수에 대해 잘 알고 있어야 합니다.

클라이언트 애플리케이션은 데이터베이스에서 터미널(에뮬레이터) 기능을 조회하는 데 사용되는 값에 따라 달라 $TERM집니다 .terminfotermcap

귀하의 경우 emacs 바인딩은 명시적인 시퀀스를 사용하므로 $TERMterminfo와 관련이 없습니다. 특정 터미널 에뮬레이터가 필요합니다. 이미 알고 있듯이 xterm호환되는 터미널 에뮬레이터입니다.

관련 정보