Shift-mũi tên không hoạt động trong emacs trong tmux


26

Gần đây tôi đã bắt đầu sử dụng tmux (là một người dùng màn hình trước đây) và tôi rất thích nó, ngoại trừ một vấn đề nhỏ. Tôi sử dụng emacs trong phiên tmux của mình và tôi đã quen với việc sử dụng các phím mũi tên Shift để di chuyển giữa các cửa sổ emacs (không phải cửa sổ tmux). Khi chạy trong tmux, các ràng buộc này dường như ngừng hoạt động hoàn toàn (có vẻ như chúng không đăng ký với emacs). Nếu tôi thoát khỏi tmux và chỉ chạy emacs trong shell của mình, chúng sẽ hoạt động tốt.

Tôi đang sử dụng iTerm2, ssh'd vào một hộp Linux, chạy tmux / emacs ở đó. Tôi có các ràng buộc phím Shift-mũi tên được thiết lập như sau trong .emacs của tôi:

(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)

Khi không chạy trong tmux, tôi có thể xác nhận đó là các chuỗi ký tự phù hợp cho các tổ hợp phím mũi tên dịch chuyển bằng cách thực hiện Cq trong emacs và sau đó nhấn chuỗi phím. Trong tmux, thậm chí điều đó không hoạt động vì dường như không thấy bất kỳ đầu vào nào từ phím nhấn mũi tên shift (nó chỉ nằm ở dấu nhắc Cq).

Nhìn vào các ràng buộc khóa cho tmux, tôi không nghĩ bất cứ điều gì bị ràng buộc với các phím mũi tên Shift và ngay cả khi đó, chúng sẽ chỉ đăng ký sau khi nhập tiền tố (liên kết với Co trong trường hợp của tôi).

Bạn có ý tưởng nào về cách làm cho các phím mũi tên shift hoạt động trở lại trong tmux không?


1
Tôi thực sự đã tìm thấy câu trả lời này cho mình nhưng StackExchange sẽ không để tôi chính thức trả lời câu hỏi của chính mình trong 7 giờ nữa vì tôi chưa có đủ danh tiếng. Dù sao, nếu bất cứ ai quan tâm, thực hiện các phím xterm tùy chọn cài đặt cửa sổ trên dường như để khắc phục nó. Tôi thiết lập này là một lựa chọn toàn cầu bằng cách đặt này trong .tmux.conf của tôi và tôi dường như được trở lại trong kinh doanh: set-cửa sổ tùy chọn -g xterm-phím trên
triangle_man

Cố gắng bỏ phiếu để đóng câu hỏi nếu bạn thực sự không thể
Eir Nym

Câu trả lời:


13

Trước tiên, hãy đảm bảo HẠN của bạn là chính xác tại mỗi địa điểm:

  • xterm-một cái gì đó (ví dụ xterm-256color) bên trong shell cục bộ của bạn đang chạy trong cửa sổ iTerm2 của bạn
  • xterm-một cái gì đó bên trong vỏ của bạn sau khi SSH vào hệ thống Linux
    Điều này cũng giống như bất cứ thứ gì bạn đang sử dụng cục bộ trong iTerm2 , vì SSH nên chuyển nó sang phía từ xa (và quan trọng là, phía từ xa không được ghi đè một cách mù quáng giá trị trong một tệp khởi tạo shell).
  • screen-một cái gì đó (ví dụ screen-256color) bên trong vỏ của bạn chạy dưới tmux trên hệ thống Linux
    Bạn nên luôn luôn sử dụng screenTERM dựa trên cơ sở bên trong tmux .

Có một xtermTERM ngay bên ngoài tmux sẽ cho phép tmux nhận ra các phím mũi tên đã sửa đổi, nhưng nó sẽ không chuyển chúng qua trừ khi bạn cũng xterm-keysbật tùy chọn cửa sổ của nó . Đặt cái này ~/.tmux.confvào hệ thống Linux của bạn :

set-window-option -g xterm-keys on

Các trình tự cho các phím được dịch chuyển bây giờ sẽ chuyển sang Emacs , chạy bên trong tmux , qua kết nối SSH, bên trong cửa sổ iTerm2 .


Đây chính xác là những gì tôi cần để sử dụng textadept trong tmux.
William Hilton

1
Giải pháp này không hiệu quả với tôi. Tôi đang sử dụng Fedora-23 bằng thiết bị đầu cuối gnome. HẠN của tôi và .tmux.conf được đặt như được mô tả trong câu trả lời. Tuy nhiên, đặt các ràng buộc như được mô tả trong câu hỏi không hoạt động. Tôi thực sự muốn giải quyết bí ẩn này vì nó cũng đang làm hỏng ứng dụng ncurses mà tôi đang làm việc.
dị

1
@gogators giống nhau ở đây; giải pháp trên không hiệu quả với tôi mặc dù tôi đã có chính xác những gì được đề xuất.
Fingerolfin

Ctrl + Shift không hoạt động, Ctrl + <f #> không hoạt động và cứ thế. Ctrl + d không hoạt động.
avp

Trong thực tế điều này có nghĩa là: export XTERM=xterm-256color(Tôi đang viết điều này vì tôi không biết "HẠN của bạn" trong câu trả lời có nghĩa là gì, tôi đang tìm kiếm một bình luận giải thích rằng ... không có, và bây giờ có một.)
jhegedus

3

Trước tiên, bạn phải kích hoạt xterm-keystrong cấu hình tmux của bạn. Vì vậy, đặt sau đây trong~/.tmux.conf

setw -g xterm-keys on

Nhưng, điều này sẽ phá vỡ các kết hợp quan trọng khác. Để khắc phục chúng, hãy đặt những thứ sau vào ~/.emacshoặc ~/.emacs.d/init.elcấu hình của bạn

;; 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))
      ))
    )
  )      

Ngoài ra tôi có giải pháp của tôi trong wiki archlinux


bình luận để lại bởi @JeffKlukas: "câu trả lời của xiên chỉ là những gì tôi cần để làm việc này thông qua PuTTY trên Windows tùy chọn khóa xterm trong tmux, Shift-arrow sẽ tạo văn bản như 2C trong emacs. Bằng cách thêm mã elisp ở trên vào init.el của tôi, tôi nhận được chức năng mong đợi (đặc biệt hữu ích trong chế độ org). "
slm

1

Câu hỏi thường gặp về tmux được sử dụng để chứa mục sau :

Làm cách nào để làm cho ctrl và phím mũi tên dịch chuyển hoạt động trong emacs?

Các terminal-init-screenchức năng trong term/screen.elđược gọi là cho khung mới, nhưng nó không cấu hình bất kỳ phím chức năng.

Nếu xterm-keystùy chọn tmux được bật, nó đủ để xác định các khóa giống như xterm. Thêm vào đây để init.elhoặc .emacsđể làm điều này:

(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))))

Và đảm bảo .tmux.confchứa " set -g xterm-keys on".

Ngoài ra, screen.eltập tin có thể được sao chép vào đường dẫn tải và tùy chỉnh.

Tôi đã mở vấn đề tmux # 1349 để yêu cầu khôi phục cho mục FAQ.


0

Trong trường hợp chung, các sự cố như thế này xảy ra do nhầm lẫn giữa những gì trình giả lập thiết bị đầu cuối gửi và những gì ứng dụng khách mong đợi.

Các trình giả lập thiết bị đầu cuối khác nhau có mức độ tùy biến khác nhau, do đó, việc tự làm quen với các điều chỉnh mô phỏng của một thiết bị cụ thể là cần thiết.

Các ứng dụng khách phụ thuộc vào giá trị $TERMđược sử dụng để tra cứu các khả năng của thiết bị đầu cuối (trình giả lập) trong cơ sở dữ liệu terminfo(hoặc termcap).

Trong trường hợp của bạn, các ràng buộc emacs của bạn sử dụng các chuỗi rõ ràng do đó $TERMvà terminfo là không liên quan: dự kiến ​​một trình giả lập thiết bị đầu cuối cụ thể - như bạn đã tìm ra, một trình xtermtương thích.


Xem Thiết bị đầu cuối sửa chữa - Vui lòng đề xuất tiêu chuẩn hóa một số khác biệt / thiếu sót này trong đầu vào thiết bị đầu cuối. Nó đã được nêu ra trên iterm2-thảo luận nhưng tôi không nghĩ có ai thực hiện nó chưa.
ephemient
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.