Tmux के भीतर emacs में काम नहीं कर रहा शिफ्ट-एरो


26

मैंने हाल ही में tmux का उपयोग शुरू किया था (पहले एक स्क्रीन उपयोगकर्ता था) और मैं इसे प्यार कर रहा हूं, एक छोटी सी समस्या को छोड़कर। मैं अपने tmux सत्र के भीतर emacs का उपयोग करता हूं और मुझे emacs windows (tmux windows नहीं) के बीच स्थानांतरित करने के लिए Shift-arrow कुंजियों का उपयोग करने के लिए उपयोग किया जाता है। Tmux के भीतर चलने पर, ये बाइंडिंग पूरी तरह से काम करना बंद कर देती है (यह ऐसा है जैसे वे emacs पर रजिस्टर नहीं करते हैं)। अगर मैं tmux से बाहर निकलता हूं और अपने शेल में सिर्फ emacs चलाता हूं, तो वे ठीक काम करते हैं।

मैं iTerm2 का उपयोग कर रहा हूं, एक लिनक्स बॉक्स में ssh'd, वहां tmux / emacs चला रहा हूं। मेरे पास .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 में नहीं चल रहा है, तो मैं पुष्टि कर सकता हूं कि उन बदलावों के लिए सही एरो सीक्वेंस हैं, जो इमैक में Cq करके और फिर प्रमुख अनुक्रम को दबाकर कुंजी-संयोजन कुंजी संयोजन हैं। Tmux के भीतर, यहां तक ​​कि यह काम नहीं करता है क्योंकि यह शिफ्ट-एरो कीबोर्ड से कोई इनपुट नहीं दिखता है (यह सिर्फ Cq प्रॉम्प्ट पर बैठता है)।

Tmux के लिए मुख्य बाइंडिंग को देखते हुए, मुझे नहीं लगता कि कुछ भी Shift-arrow कुंजियों के लिए बाध्य है और अगर ऐसा था भी, तो वे केवल उपसर्ग (जो मेरे मामले में Co के लिए बाध्य है) दर्ज करने के बाद ही रजिस्टर करेंगे।

शिफ्ट-एरो कीज़ को tmux के भीतर फिर से काम करने के तरीके पर कोई विचार?


1
मुझे वास्तव में इसका जवाब खुद ही मिल गया, लेकिन StackExchange मुझे आधिकारिक तौर पर एक और 7 घंटे के लिए अपने सवाल का जवाब देने की अनुमति नहीं देगा क्योंकि मेरे पास अभी तक पर्याप्त प्रतिष्ठा नहीं है। वैसे भी अगर किसी को दिलचस्पी है, तो इसे ठीक करने के लिए सेट-विंडो-विकल्प xterm-keys कर रहा है। मैंने इसे अपने .tmux.conf में डालकर एक वैश्विक विकल्प के रूप में सेट किया है और मुझे लगता है कि यह व्यापार में वापस आ रहा है: सेट-विंडो-विकल्प -g xterm-keys on
triangle_man

यदि आप वास्तव में नहीं कर सकते हैं तो प्रश्न को बंद करने की कोशिश करें
Eir Nym

जवाबों:


13

पहले, सुनिश्चित करें कि आपका TERM प्रत्येक स्थान पर सही है:

  • xtermxterm-256colorअपने iTerm2 विंडो में चल रहे अपने स्थानीय शेल के अंदर -something (जैसे )
  • xtermLinux सिस्टम में SSHing के बाद अपने शेल के अंदर
    होना। यह वही होना चाहिए जो आप iTerm2 में स्थानीय रूप से उपयोग कर रहे हैं , क्योंकि SSH इसे दूरस्थ पक्ष के साथ गुजर रहा होना चाहिए (और, महत्वपूर्ण बात यह है कि, दूरस्थ पक्ष को आँख बंद करके नहीं चलना चाहिए एक शेल आरंभीकरण फ़ाइल में मूल्य)।
  • screenLinux सिस्टम पर tmux केscreen-256color नीचे चल रहे आपके शेल के अंदर -something (जैसे ) आपको हमेशा tbux के अंदर -base TERM का उपयोग करना चाहिए ।
    screen

एक के बाद xtermअवधि तुरंत बाहर tmux अनुमति देगा tmux तीर कुंजी संशोधित पहचान करने के लिए, लेकिन यह के माध्यम से जब तक आप भी अपने उन्हें पारित नहीं होगा xterm-keysखिड़की विकल्प चालू। इसे अपने ~/.tmux.confलिनक्स सिस्टम पर रखें :

set-window-option -g xterm-keys on

स्थानांतरित कुंजी के लिए अनुक्रम अब इसे Emacs के माध्यम से बनाना चाहिए , tmux के अंदर चल रहा है , एक SSH कनेक्शन में, एक iTerm2 विंडो के अंदर ।


यह वही है जो मुझे tmux में textadept का उपयोग करने के लिए आवश्यक था।
विलियम हिल्टन

1
यह समाधान मेरे काम नहीं आया। मैं ग्नोम-टर्मिनल का उपयोग कर फेडोरा -23 पर हूं। मेरे TERM's .tmux.conf को उत्तर में वर्णित के रूप में सेट किया गया है। प्रश्न में वर्णित बाइंडिंग को सेट करना हालांकि काम करता है। मैं वास्तव में इस रहस्य को सुलझाना चाहता हूं क्योंकि यह मेरे द्वारा काम कर रहे एक ncurses ऐप को भी मिटा रहा है।
गोगेटर्स

1
@gogators यहाँ एक ही; उपरोक्त समाधान मेरे लिए काम नहीं करता है, भले ही मेरे पास वही था जो सुझाया गया था।
फिंगोल्फिन

Ctrl + Shift काम नहीं करता है, Ctrl + <f #> काम नहीं करता है और इसी तरह। Ctrl + d हालांकि काम करता है।
avp

व्यवहार में इसका अर्थ है: export XTERM=xterm-256color(मैं इस कारण को लिख रहा हूं। मुझे नहीं पता था कि उत्तर में "आपका कार्यकाल" क्या है, मैं यह समझाते हुए एक टिप्पणी की तलाश कर रहा था कि ... कोई नहीं था, और अब एक है।)
jhegedus

3

सबसे पहले आपको xterm-keysअपने tmux config में सक्षम करना होगा । तो निम्नलिखित में डालें~/.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))
      ))
    )
  )      

इसके अलावा, मेरे पास आर्कलिनक्स विकी में मेरा समाधान है


@JeffKlukas द्वारा छोड़ी गई टिप्पणी: "परोक्ष का जवाब है कि मुझे Windows पर PuTTY के माध्यम से यह काम करने के लिए क्या चाहिए (मेरे पास टिप्पणी के रूप में इसे जोड़ने की प्रतिष्ठा नहीं है, इसलिए उत्तर देने के बजाय) जब मैंने इसे चालू किया। tmux में xterm-keys विकल्प, Shift-arrow emacs में 2C जैसे टेक्स्ट का उत्पादन करेगा। मेरे init.el में उपरोक्त क्विज़ कोड को जोड़ने से, मुझे अपेक्षित कार्यक्षमता (विशेष रूप से ऑर्ग मोड में उपयोगी) मिलती है। "
स्लम

1

tmux FAQ में निम्नलिखित प्रविष्टि शामिल है :

कैसे मैं emacs में ctrl और शिफ्ट एरो कीज़ काम करते हैं?

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फ़ाइल को लोड पथ पर कॉपी किया जा सकता है और अनुकूलित किया जा सकता है।

मैंने अक्सर पूछे जाने वाले प्रश्न प्रविष्टि के लिए पुनर्स्थापना का अनुरोध करने के लिए # 1349 अंक जारी किया


0

सामान्य तौर पर, टर्मिनल एमुलेटर क्या भेजता है और क्लाइंट एप्लिकेशन क्या अपेक्षा करता है, के बीच गलतफहमी के कारण इस तरह की समस्याएं होती हैं।

अलग-अलग टर्मिनल एमुलेटर में कस्टमाइज़ेबिलिटी की अलग-अलग डिग्री होती है, इसलिए किसी विशेष के इम्यूलेशन ट्यूबल्स से खुद को परिचित करना आवश्यक है।

क्लाइंट अनुप्रयोग उस मूल्य पर निर्भर करते हैं, $TERMजिसका उपयोग टर्मिनल (एमुलेटर) की क्षमताओं को terminfo(या termcap) डेटाबेस में देखने के लिए किया जाता है ।

आपके मामले में, आपके $TERMईमैक बाइंडिंग इस प्रकार स्पष्ट अनुक्रम का उपयोग करते हैं और टर्मो अप्रासंगिक हैं: एक विशिष्ट टर्मिनल एमुलेटर की उम्मीद है - जैसा कि आप पहले से ही पता लगा चुके हैं, एक-असंगत xterm


फिक्स टर्मिनल देखें - टर्मिनल इनपुट में इनमें से कुछ अंतर / कमियों को मानकीकृत करने के प्रस्ताव के लिए कृपया । यह iterm2-चर्चा पर उठाया गया है, लेकिन मुझे नहीं लगता कि किसी ने इसे अभी तक लागू किया है।
युगांतरकारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.