TMUX 내의 emacs에서 Shift- 화살표가 작동하지 않습니다


26

나는 최근에 tmux (이전에는 스크린 사용자였습니다)를 사용하기 시작했으며 작은 문제 하나를 제외하고는 그것을 좋아합니다. 내 tmux 세션 내에서 emacs를 사용하고 Shift 키를 사용하여 emacs 창 (tmux 창이 아님) 사이를 이동하는 데 익숙합니다. tmux 내에서 실행하면 이러한 바인딩이 완전히 작동하지 않는 것 같습니다 (이맥에 전혀 등록하지 않는 것과 같습니다). tmux를 종료하고 쉘에서 emacs를 실행하면 정상적으로 작동합니다.

iTerm2를 사용하고 있으며 Linux 상자에 ssh'd 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
실제로이 답변을 직접 찾았지만 아직 명성이 충분하지 않아 StackExchange에서 공식적으로 7 시간 동안 내 자신의 질문에 대답 할 수 없습니다. 어쨌든 누군가 관심이 있다면 set-window-option xterm-keys를 켜는 것이 문제를 해결하는 것 같습니다. 나는 이것을 내 .tmux.conf에 넣어서 글로벌 옵션으로 설정했고 사업에 돌아간 것 같습니다 : set-window-option -g xterm-keys on
triangle_man

당신이 정말로 할 수 없다면 질문을 닫으려고 투표하십시오
Eir Nym

답변:


13

먼저 각 위치에서 TERM이 올바른지 확인하십시오.

  • xterm-iTerm2 창 xterm-256color에서 실행되는 로컬 쉘 내부의 무언가 (예 :)
  • xtermLinux 시스템에 SSH를
    사용한 후 쉘 내부의 무언가 SSH가 원격 측으로 전달해야하기 때문에 iTerm2 에서 로컬로 사용하는 것과 동일 해야합니다 (중요하게는 원격 측이 맹목적으로 무시해서는 안됩니다) 쉘 초기화 파일의 값).
  • screenLinux 시스템의 tmux 에서 screen-256color실행중인 쉘 내부의 무언가 (예 : tmux ) 는 항상 tmux 내부 에서 기반 TERM을 사용해야 합니다.
    screen

갖는 xtermTERM 즉시 외부 TMUX는TMUX 키 화살표 수정 인식 할 수 있지만, 당신은 또한이 없으면 통해 전달되지 않습니다 xterm-keys창 옵션이 켜져. 이것을 ~/.tmux.confLinux 시스템에 넣으십시오 .

set-window-option -g xterm-keys on

이동 된 키의 순서는 지금까지 그것을해야 이맥스 내부 실행, TMUX을 내부, SSH 연결을 통해, iTerm2의 창.


이것이 바로 tmux에서 textadept를 사용하는 데 필요한 것입니다.
윌리엄 힐튼

1
이 솔루션은 저에게 효과적이지 않았습니다. 나는 그놈 터미널을 사용하여 Fedora-23을 사용하고 있습니다. 내 TERM과 .tmux.conf는 답변에 설명 된대로 설정됩니다. 그러나 질문에 설명 된대로 바인딩을 설정하면 작동합니다. 나는이 미스터리를 해결하고 싶습니다. 왜냐하면 내가 작업중 인 ncurses 앱을 정리하고 있기 때문입니다.
gogators 2016 년

1
@gogators는 여기에 동일합니다. 위의 해결책은 내가 제안한 것을 정확히 가지고 있었지만 나에게는 효과가 없습니다.
Fingolfin

Ctrl + Shift는 작동하지 않으며 Ctrl + <f #>은 작동하지 않습니다. Ctrl + d는 작동합니다.
avp

이 방법은 실제로 : export XTERM=xterm-256color(I, 나는 그것을 설명하는 코멘트를 찾고 있던 답 수단에 무엇을 "당신의 TERM"몰랐 I 변경할 수 없기이 쓰고 ... 아무도 없었다, 지금 일이 있습니다.)
jhegedus의

3

먼저 xterm-keystmux 구성에서 활성화해야합니다 . 따라서 다음을 넣으십시오.~/.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))
      ))
    )
  )      

또한 archlinux wiki에 솔루션이 있습니다.


@JeffKlukas가 남긴 주석 : "오블 리크의 대답은 Windows에서 PuTTY를 통해이 작업을 수행하는 데 필요한 것입니다 (댓글로 추가 할 평판이 없으므로 대신 답을 만드십시오). tmux의 xterm-keys 옵션 인 Shift- 화살표는 emacs에서 2C와 같은 텍스트를 생성합니다. 위의 elisp 코드를 init.el에 추가하면 예상되는 기능을 얻습니다 (특히 org 모드에서 유용함). "
slm

1

다음 항목을 포함하는 데 사용되는 tmux 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파일을로드 경로로 복사하고 사용자 정의 할 수 있습니다.

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


0

일반적으로 이와 같은 문제는 터미널 에뮬레이터가 보내는 것과 클라이언트 응용 프로그램이 기대하는 것 사이의 불일치 때문에 발생합니다.

다른 터미널 에뮬레이터는 사용자 정의 가능성이 다르므로 특정 터미널의 에뮬레이션 튜너 블에 익숙해지는 것이 필요합니다.

클라이언트 응용 프로그램은 (또는 ) 데이터베이스 $TERM에서 터미널 (에뮬레이터)의 기능을 조회하는 데 사용되는 값에 따라 다릅니다 .terminfotermcap

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


터미널 입력의 이러한 차이점 / 결함을 표준화하기위한 제안은 터미널 수정- 참조하십시오 . 그것은 iterm2 토론 에서 제기 되었지만 아무도 그것을 구현하지 않았다고 생각합니다.
ephemient
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.