나는 최근에 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
먼저 모든 위치에서 용어가 올바른지 확인하세요.
xterm
xterm-256color
- 로컬 셸에서 실행되는 것(예:)iTerm2창문xterm
- Linux 시스템에 SSH 연결한 후의 셸 내용
로컬에서 사용하는 내용과 동일해야 합니다.iTerm2, SSH가 이를 원격 측에 전달해야 하기 때문입니다(그리고 중요한 것은 원격 측이 쉘 초기화 파일의 값을 맹목적으로 덮어쓰면 안 된다는 것입니다).screen
screen-256color
- 쉘 내부에서 실행되는 것(예:)멀티플렉서Linux 시스템에서는 항상 내부적으로 TERM을 사용해야
합니다 .screen
멀티플렉서.
xterm
즉시 야외에서 한 학기를 보내세요.멀티플렉서허용할 것이다멀티플렉서수정된 화살표 키를 인식하지만 xterm-keys
창 옵션도 켜져 있지 않으면 전달되지 않습니다. ~/.tmux.conf
Linux 시스템에 넣으십시오 .
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
집니다 .terminfo
termcap
귀하의 경우 emacs 바인딩은 명시적인 시퀀스를 사용하므로 $TERM
terminfo와 관련이 없습니다. 특정 터미널 에뮬레이터가 필요합니다. 이미 알고 있듯이 xterm
호환되는 터미널 에뮬레이터입니다.