Shift-ok tmux içindeki emaklarda çalışmıyor


26

Geçenlerde tmux kullanmaya başladım (daha önce ekran kullanıcısıydı) ve küçük bir sorun dışında seviyorum. Tmux oturumumda emac kullanıyorum ve emacs pencereleri arasında hareket etmek için Shift ok tuşlarını kullanmaya alışkınım (tmux pencereleri değil). Tmux içinde çalışırken, bu bağların tamamen çalışmayı bıraktığı görülüyor (sanki hiç emaklara kayıt yaptırmıyorlar gibi). Eğer tmux'dan çıkıp kabuklarımda emacs çalıştırsam, iyi çalışıyorlar.

ITerm2 kullanıyorum, Linux kutusuna girip orada tmux / emacs çalıştırıyorum. .Emacs'imde Shift ok tuşu bağlantıları aşağıdaki gibi ayarlanmış:

(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’ta çalışmadığım zamanlarda, emacs’de Cq yaparak ve ardından tuş sırasına basarak, kaydırma okları tuş kombinasyonları için bunların doğru karakter dizileri olduğunu onaylayabilirim. Tmux içinde, bu bile işe yaramadı çünkü shift-ok tuşlarına herhangi bir giriş gelmiyor gibi görünüyor (sadece Cq isteminde oturuyor).

Tmux'un anahtar bağlantılarına bakıldığında, Shift-ok tuşlarına hiçbir şey bağlı olduğunu sanmıyorum ve öyle olsa bile, sadece önek girdikten sonra kayıt olurlar (benim durumumda Co'ya bağlı).

Shift-ok tuşlarının tmux içinde tekrar çalışmasını sağlamanın bir fikri var mı?


1
Aslında cevabı kendim buldum ama StackExchange henüz 7 ay boyunca kendi soruma resmen cevap vermeme izin vermiyor çünkü henüz yeterince itibarım yok. Neyse, herhangi biri ilgileniyorsa, set-window-seçenek xterm-key'leri yapmak sorunu çözüyor gibi görünmektedir. Bunu .tmux.conf dosyasına koyarak global bir seçenek olarak belirledim ve işe geri döndüm: set-window-option -g xterm-keys on
triangle_man

Gerçekten yapamıyorsanız, soruyu kapatmak için oy vermeye çalışın
Eir Nym

Yanıtlar:


13

Öncelikle TERM'inizin her yerde doğru olduğundan emin olun:

  • xtermxterm-256color- iTerm2 pencerenizde çalışan yerel kabuğunuzun içinde bir şey (örn. )
  • xterm-SSHU'dan sonra kabuğunuzun içinde bir şeyler var Linux sistemi iTerm2'de
    yerel olarak kullandığınız her şeyle aynı olmalıdır , çünkü SSH onu uzak tarafa geçirmemelidir (ve daha önemlisi uzak taraf kör bir şekilde geçmemelidir) kabuk başlatma dosyasındaki değer).
  • screen- Linux sistemde tmuxscreen-256color altında çalışan kabuğunuzun içinde bir şey (örn. ) Her zaman tmux içinde bir tabanlı TERM kullanmalısınız .
    screen

Bir Having xtermTERM hemen dışında tmux sağlayacak tmux tuşları ok modifiye tanıması, ancak bu aynı zamanda yoksa aracılığıyla geçemez xterm-keyspencere seçeneği açık. Bunu ~/.tmux.confLinux sisteminize koyun :

set-window-option -g xterm-keys on

Kaymıştır tuşlar için diziler artık yansıt yapmalıdır Emacs içinde çalışan, tmux iç, bir SSH bağlantısı üzerinden, iTerm2 penceresinin.


Bu, tmux'ta textadept kullanmak için tam ihtiyacım olan şeydi.
William Hilton

1
Bu çözüm benim için işe yaramadı. Bir gnome-terminal kullanarak Fedora-23'tayım. Terimlerim ve .tmux.conf cevaplarda açıklandığı gibi ayarlandı. Bununla birlikte, bağlamaların soruda açıklandığı şekilde ayarlanması işe yarar. Üzerinde çalıştığım bir ncurses uygulamasını da kullandığı için bu gizemi çözmek istiyorum.
gogators, 19

1
gogators burada aynı; tam olarak önerildiğine rağmen yukarıdaki çözüm benim için işe yaramıyor.
Fingolfin,

Ctrl + Shift çalışmıyor, Ctrl + <f #> çalışmıyor. Ctrl + d olsa çalışır.
avp

Uygulamada bunun anlamı export XTERM=xterm-256colorşudur : (Bu durumu yazıyorum, cevabında "TERM"
inizin

3

İlk xterm-keysönce tmux ayarlarınızı etkinleştirmelisiniz . Öyleyse aşağıdakileri yazın~/.tmux.conf

setw -g xterm-keys on

Ancak, bu diğer anahtar kombinasyonlarını kıracak. Onları düzeltmek için, aşağıdakini ~/.emacsveya ~/.emacs.d/init.elconfig içine yerleştirin.

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

Ayrıca benim çözümüm archlinux wiki'de


@JeffKlukas tarafından bırakılan yorum: "oblik'in cevabı, Windows'ta PuTTY üzerinden çalışmamı sağlamak için ihtiyacım olan şeydi (bunu yorum olarak eklemek için itibarım yok, bu yüzden bunun yerine bir cevap yapıyorum.) tmux'taki xterm-key seçeneği, Shift-ok, emacs'de 2C gibi metinler üretecektir. Yukarıdaki elisp kodunu init.el'ime ekleyerek, beklenen işlevselliği elde ediyorum (özellikle org modunda). "
slm

1

tmux SSS aşağıdaki girişi içerir :

Ctrl ve shift ok tuşlarının emacs'de çalışmasını nasıl sağlayabilirim?

Bu terminal-init-screenişlev term/screen.elyeni kareler için çağrılır, ancak hiçbir işlev tuşunu yapılandırmaz.

Eğer tmux xterm-keysseçeneği açıksa, aynı anahtarları xterm ile tanımlamak yeterlidir. Aşağıdakini init.elveya .emacsbunu yapmak için ekleyin :

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

Ve .tmux.conf" set -g xterm-keys on" içerdiğinden emin olun .

Alternatif olarak, screen.eldosya yükleme yoluna kopyalanabilir ve özelleştirilebilir.

SSS girişi için geri yükleme isteğinde bulunmak üzere 1349 numaralı tmux sayısını açtım .


0

Genel durumda, bunun gibi problemler, terminal emülatörünün ne gönderdiği ile müşteri uygulamasının ne beklediği arasındaki uyuşmazlıktan kaynaklanır.

Farklı terminal emülatörleri, farklı özelleştirilebilirlik derecelerine sahiptir, bu nedenle belirli bir tanenin emülasyon ayarlayıcılarını tanımak gerekir.

İstemci uygulamaları $TERM, terminfo(veya termcap) veritabanındaki terminalin (emülatör) yeteneklerini aramak için kullanılan değere bağlıdır .

Sizin durumunuzda, emacs ciltleriniz açık diziler kullanır, bu nedenle $TERMterminfo ilgisizdir: belirli bir terminal emülatörü beklenir - daha önce de düşündüğünüz gibi, xtermuyumlu bir tane.


Bkz Fix Terminalleri - Lütfen , terminal girişinde bu farklılıklar / bazı eksikliklerini standardize etmek bir öneri için. Bu oldu üzerinde yükseltilmiş iterm2-tartışmak ama herkes en henüz uygulamaya sanmıyorum.
efemient
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.