Shift-arrow ไม่ทำงานใน emacs ภายใน tmux


26

ฉันเพิ่งเริ่มใช้ tmux (เคยเป็นผู้ใช้หน้าจอมาก่อน) และฉันรักมันยกเว้นปัญหาเล็ก ๆ อย่างหนึ่ง ฉันใช้ emacs ภายในเซสชัน tmux ของฉันและฉันคุ้นเคยกับการใช้แป้น Shift-arrow เพื่อย้ายไปมาระหว่างหน้าต่าง emacs (ไม่ใช่หน้าต่าง tmux) เมื่อทำงานภายใน tmux การผูกเหล่านี้ดูเหมือนจะหยุดทำงานอย่างสมบูรณ์ (เหมือนว่าพวกเขาไม่ได้ลงทะเบียนกับ emacs เลย) ถ้าฉันออกจาก tmux และเรียกใช้ emacs ในเปลือกของฉันพวกเขาทำงานได้ดี

ฉันใช้ iTerm2, ssh ลงในกล่อง Linux, รัน tmux / emacs ที่นั่น ฉันได้ตั้งค่าการเชื่อมโยงคีย์ Shift-arrow ดังต่อไปนี้ใน. emacs ของฉัน:

(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 ฉันสามารถยืนยันได้ว่าลำดับเหล่านั้นเป็นลำดับอักขระที่ถูกต้องสำหรับชุดคีย์ลูกศร Shift โดยทำ Cq เป็น emacs จากนั้นกดลำดับคีย์ ภายใน tmux แม้จะไม่ได้ผลเพราะดูเหมือนจะไม่เห็นข้อมูลใด ๆ จากปุ่มกด Shift-arrow (มันอยู่ที่พรอมต์ Cq)

เมื่อมองไปที่การเชื่อมโยงคีย์สำหรับ tmux ฉันไม่คิดว่าจะมีอะไรผูกอยู่กับปุ่ม Shift-arrow และแม้ว่าจะเป็นเช่นนั้นพวกเขาจะลงทะเบียนหลังจากป้อนคำนำหน้าเท่านั้น (ซึ่งผูกไว้กับ Co ในกรณีของฉัน)

มีความคิดเกี่ยวกับวิธีทำให้ปุ่ม shift-arrow ทำงานอีกครั้งภายใน tmux หรือไม่?


1
ฉันพบคำตอบนี้จริงๆแล้ว แต่ StackExchange จะไม่ให้ฉันตอบคำถามของตัวเองอย่างเป็นทางการอีก 7 ชั่วโมงเพราะฉันยังไม่มีชื่อเสียงเพียงพอ อย่างไรก็ตามถ้าใครสนใจก็ลองทำ xterm-key บน set-window-option ฉันตั้งค่านี้เป็นตัวเลือกระดับโลกโดยใส่สิ่งนี้ลงใน. tmux.conf ของฉันและฉันดูเหมือนจะกลับมาทำธุรกิจ: set-window-option -g xterm-keys on
triangle_man

ลองลงคะแนนเพื่อปิดคำถามถ้าคุณทำไม่ได้จริงๆ
Eir Nym

คำตอบ:


13

ก่อนอื่นตรวจสอบให้แน่ใจว่า TERM ของคุณถูกต้องในแต่ละสถานที่:

  • xterm- บางอย่าง (เช่นxterm-256color) ภายในเชลล์ท้องถิ่นของคุณทำงานในหน้าต่างiTerm2ของคุณ
  • xterm- บางอย่างภายในเชลล์ของคุณหลังจาก SSHing ไปยังระบบ Linux
    นี่ควรจะเหมือนกับสิ่งที่คุณใช้ในเครื่องในiTerm2เนื่องจาก SSH ควรจะส่งผ่านไปยังด้านไกล ค่าในไฟล์การเริ่มต้นเชลล์)
  • screenบางสิ่งบางอย่าง (เช่นscreen-256color) ภายในเปลือกของคุณทำงานภายใต้tmuxบนระบบ Linux
    คุณควรใช้screenระยะชั่นภายในtmux

การมีxtermTERM ทันทีภายนอกtmuxจะอนุญาตให้tmuxจดจำปุ่มลูกศรที่แก้ไข แต่จะไม่ส่งผ่านจนกว่าคุณจะxterm-keysเปิดใช้งานตัวเลือกหน้าต่าง วางสิ่งนี้~/.tmux.confลงในระบบ Linux ของคุณ:

set-window-option -g xterm-keys on

ตอนนี้ลำดับสำหรับคีย์ที่เลื่อนจะทำให้ผ่านไปยังEmacsซึ่งทำงานภายในtmuxผ่านการเชื่อมต่อ SSH ภายในหน้าต่างiTerm2


ตรงนี้เป็นสิ่งที่ฉันต้องการใช้ textadept ใน tmux
วิลเลียมฮิลตัน

1
วิธีนี้ไม่ได้ผลสำหรับฉัน ฉันใช้ Fedora-23 โดยใช้ gnome-terminal TERM ของฉันและ. tmux.conf ถูกตั้งค่าตามที่อธิบายไว้ในคำตอบ อย่างไรก็ตามการตั้งค่าการเชื่อมโยงตามที่อธิบายไว้ในคำถามใช้งานได้ ฉันต้องการที่จะแก้ปัญหาความลึกลับนี้เพราะมันล้อเล่นแอพ ncurses ที่ฉันกำลังทำงานอยู่
gogators

1
@ gogators เหมือนกันที่นี่; การแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉันแม้ว่าฉันจะมีสิ่งที่แนะนำ
Fingolfin

Ctrl + Shift ไม่ทำงาน Ctrl + <f #> ไม่ทำงานเป็นต้น Ctrl + d ทำงานแม้ว่า
avp

ในทางปฏิบัติสิ่งนี้หมายความว่า: export XTERM=xterm-256color(ฉันกำลังเขียนสิ่งนี้เพราะฉันไม่รู้ว่า "คำของคุณ" ในคำตอบหมายถึงอะไรฉันกำลังมองหาความคิดเห็นอธิบายว่า ... ไม่มีเลยและตอนนี้ก็มีอยู่)
jhegedus

3

ก่อนอื่นคุณต้องเปิดใช้งาน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))
      ))
    )
  )      

นอกจากนี้ฉันมีวิธีแก้ไขปัญหาของฉันในarchlinux wiki


ความคิดเห็นที่ออกโดย @JeffKlukas: "คำตอบของเฉียงเป็นเพียงสิ่งที่ฉันต้องการเพื่อให้การทำงานผ่าน PuTTY บน Windows เช่นกัน (ฉันไม่มีชื่อเสียงที่จะเพิ่มสิ่งนี้เป็นความคิดเห็นดังนั้นให้ตอบแทน) เมื่อฉันเปิด ตัวเลือก xterm-keys ใน tmux นั้น Shift-arrow จะสร้างข้อความเช่น 2C ใน emacs โดยการเพิ่มโค้ด elisp ด้านบนให้กับ init.el ของฉันฉันจะได้รับการทำงานที่คาดหวัง (มีประโยชน์โดยเฉพาะในโหมด org) "
slm

1

tmux FAQ ใช้เพื่อให้มีรายการต่อไปนี้ :

ฉันจะทำให้ปุ่ม Ctrl และ Shift เป็นลูกศรทำงานใน emacs ได้อย่างไร

terminal-init-screenฟังก์ชั่นในการterm/screen.elจะเรียกเฟรมใหม่ แต่มันไม่ได้กำหนดค่าปุ่มฟังก์ชันใด ๆ

หากเปิดใช้งานxterm-keysอ็อพชันtmux มันก็เพียงพอที่จะกำหนดคีย์เดียวกันกับ 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 issue # 1349เพื่อขอคืนค่าสำหรับรายการคำถามที่พบบ่อย


0

โดยทั่วไปแล้วปัญหาเช่นนี้เกิดขึ้นเนื่องจากการผิดพลาดระหว่างสิ่งที่เทอร์มินัลอีมูเลเตอร์ส่งและสิ่งที่แอปพลิเคชันไคลเอนต์คาดหวัง

เทอร์มินัลอีมูเลเตอร์ต่าง ๆ มีระดับความสามารถในการปรับแต่งที่แตกต่างกันดังนั้นการทำความคุ้นเคยกับการปรับแต่งอีมูเลชันของอุปกรณ์เฉพาะจึงเป็นสิ่งจำเป็น

แอปพลิเคชันไคลเอนต์ขึ้นอยู่กับค่า$TERMที่ใช้ในการค้นหาความสามารถของเทอร์มินัล (อีมูเลเตอร์) ในฐานข้อมูลterminfo(หรือtermcap)

ในกรณีของคุณการผูก emacs ของคุณใช้ลำดับที่ชัดเจนดังนั้น$TERMและ terminfo นั้นไม่เกี่ยวข้อง: คาดว่าเทอร์มินัลอีมูเลเตอร์เฉพาะ - ตามที่คุณได้คิดแล้ว - ที่xtermเข้ากันได้


ดูFix Terminal - โปรดขอข้อเสนอเพื่อสร้างมาตรฐานความแตกต่าง / ข้อบกพร่องบางอย่างในอินพุตเทอร์มินัล มันได้รับการหยิบยกขึ้นมาบน iterm2- พูดคุยแต่ฉันไม่คิดว่ามีใครใช้มัน
ephemient
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.