Terminal kullanırken keybind ile ilgili sorunlar


30

Aşağıdaki satır var init.el:

(global-set-key [(control \;)] 'comment-region)

GUI penceresinde çok iyi çalışıyor, ancak emacsbu -nwseçenek ile çağrılırsa C-;bölgeyi yorumlamaz, sadece ;karakter ekler . M-x comment-region RETancak iyi çalışıyor.

Benzer cevabı bu cevabı takip etmeye çalıştım , ama yine de C-q C-;geri ;döndüm ve kesinlikle çıplak bağlamak istemiyorum ;.

İstenilen etki nasıl elde edilir?


4
Terminalinizin (bu arada ne kullanıyorsunuz?) Bu komut sırasını tanımıyor olması olasıdır. Birleştirmeyi kullanmayı deneyin C-;ve daha sonra M-x view-lossageEmacs'a ulaşıp ulaşmadığını görmek için kullanın.
Dan

Ben kullanıyorum gnome-terminalve M-x view-lossageiadeler:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
WeSenseASoulInSearchOfAnswers

3
Bir terminal sorununa benziyor: eğer bu anahtar birleşim Emacs'a ulaşmak olsaydı , (ya da en azından, anladığım kadar ) C-;değil gibi görünürdü . c ;C-;
Dan

@Dan: Bunu bir cevap olarak verebilir misiniz? Bu, soruyu cevaplanmış olarak işaretler ve aynı sorunu yaşayan diğer insanlar için iyi olan çözümü görmeyi kolaylaştırır. Teşekkürler!
Tikhon Jelvis 10:14

Daha fazla okuma için ek bir bağlantı ile özetlenmiş ve gönderilmiştir. Ayrıca biraz daha genel hale getirmek için soru başlığını düzenleme.
Dan

Yanıtlar:


17

İlk olarak, daha genel bir konu: terminal emülatörleri genellikle gönderebilecekleri kontrol ve kaçış dizileriyle sınırlıdır. Öyleyse: Terminal Emacs'a ulaşmadan önce özel karakterlerinizi yutarsa ​​olabilir. Genel bir teşhis olarak, anahtar kombinasyonlarınızın Emacs haline getirip getirmediğini görmek için C-h l(veya M-x view-lossage) tuşuna basabilirsiniz.

Bu konuyla ilgili daha fazla tartışma için, bu Yığın Taşması iş parçacığına ve içindeki bağlantılara bir bakın .

Yorumlardaki ileri geri özetini özetlemek için, özel sorununuz, sorunun Emacs yerine terminal olduğunu öne sürüyor. Denedim C-;ve sonra M-x view-lossageanladın blah blah blah c ; ESC v i e w - l o s s a g e RET. Bu bir terminal sorununa benziyor: eğer tuş kombinasyonu Emacs'a ulaşıyor c ;olsaydı , parça böyle görünürdü C-;.


33

Gelen + Yukarı bir terminal Emacs tarafından tanınmayan Shift terminalleri kaçış dizileri içine en fonksiyon tuşları tercüme nasıl açıklamak için uygulamalar ve terminaller ileten karakterleri (ya da daha doğrusu bayt) değil, anahtarlar arasındaki arayüz. Yalnızca birkaç değiştirici + karakter kombinasyonu kendi karakterine sahiptir:

  • Ctrlartı bir harf veya @[\]^_0–31 baytlık dönüşlerden biri (ASCII kontrol karakterleri ).
  • Genellikle Ctrl+ ?bayt 127'ye dönüşür ve Ctrl+ + (bayt 0) Spaceile eşdeğerdir .Ctrl@
  • Bazı fonksiyon tuşları kontrol karakterlerine eşdeğerdir: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
  • Ve yapılandırmaya bağlı olarak Backspace= Ctrl+ Hveya Ctrl+ ?. Ctrl+ ?Beri Emacs için daha uygundur Ctrl+ Hyardımdır.
  • Meta+ karakteriyle takip edilen characterşekilde gönderilir .Esc

Peki diğer gibi kombinasyonları hakkında Ctrl+ ;veya Ctrl+ Shift+ letter? Karşılık gelen bir karakter olmadığından, terminal bir karakteri tekrar kullanmak veya bir kaçış sırası göndermek zorundadır. Hiçbir karşılık gelen karakter olduğunda bilgi sahibi ile bitirmek böylece birçok terminalde değiştiricileri görmezden Ctrl+ ;göndererek ;, Ctrl+ Shift+ lettereşdeğer Ctrl+ lettervb

Terminal satıcıları uzun süre basit olanı yapmaya devam etti. Kendiliğinden devam eden kaçış dizileri için bir standart yoktu - terminal satıcıları bunu uygulamıyor, uygulamalar desteklemiyor, kullanıcılar beklemiyor. Bazı terminal emülatörleri isteğe bağlı kaçış dizileri gönderecek şekilde yapılandırılabilir, böylece sizinkini kurabilir ve kaçış dizilerini Emacs'a bildirebilirsiniz (daha fazlası için).

Son zamanlarda, durum değişiyor, çünkü kaçış dizilerini standart hale getirmek için iki teklif var. Biri LeoNerd'in sözdizimi olan libtermkey'idir . Bir diğeri ise Thomas Dickey'in sözdizimi ile olan xterm'sidir . Xterm'in (≥216) geçerli sürümleri, kaynak ayarlanarak her iki sözdizimi için yapılandırılabilir ; özellik sıfır olmayan bir değere ayarlanarak etkinleştirilmelidir .ESC [ codepoint ; modifier uESC [ 2 7 ; modifier ; codepoint ~formatOtherKeysmodifyOtherKeys

Terminal emülatörünüz bu sözdizimlerini desteklemiyor ancak yapılandırılabilirse, ikisinden birini seçin.

Emacs modifyOtherKeys24.4'ten bu yana, terminalin xterm versiyonu m216 olduğunu tespit ettiğinde Emacs özelliği otomatik olarak açar. Emacs'in tuşları kodlamak için kaçış dizileri tespiti değişkende işe yarar local-function-key-map. Emacs 24.4'ten itibaren, tüm kaçış dizileri desteklenmemektedir. İşi tamamlamak için init dosyanızda aşağıdaki kodu kullanabilirsiniz.

;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3u" meta)
                ("\e\[%d;5u" control)
                ("\e\[%d;6u" control shift)
                ("\e\[%d;7u" control meta)
                ("\e\[%d;8u" control meta shift)))
        (setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))

Eğer TERMortam değişkeni ayarlanmamış xtermgibi bir varyant veya xterm-256colorEmacs olan sekansları aktif hale gelmez. Emacs zaten değerinizi TERMdestekliyorsa , adı değeri olan Lisp dosyasını yüklediktenTERM sonra yürütülecek yukarıdakilere benzer bir işlev tanımlayarak destek ekleyebilirsiniz . Emacs böyle bir dayanak varsa, adında bir alt dizin oluşturarak ekleyebilirsiniz termyerde Gözlerinde farklı load-pathve adında bir Lisp dosyası oluşturarak değeridir adlı bir fonksiyon tanımlayan .term/$TERM.el$TERMTERMterminal-init-$TERM

Yazarken, xterm dışındaki birkaç terminal emülatörünün bu kaçış dizilerini benimsediği görülüyor. OSX'te, her bir tuş kombinasyonu için birer birer çıkış sırası seçerek iTerm2'yi yapılandırabilirsiniz .


2
Bu konudaki cevapların her zaman mükemmel, Gilles. Çok takdir.
phils

Harika!. Gerçi bu sekansları göndererek urxvt yapmayı bulmakta zorlanıyorum. Bana yardım eder misin :)
Amos

@Amos rxvt kullanmıyorum. Üzerinde sormalısınız Unix ve Linux urxvt modifyOtherKeys ile xterm'den aynı çıkış sıralarını göndermek nasıl.
Gilles 'SO- kötü olmayı'

macOS xterm-256color üzerinde çalışmaz. M-C-%Tanınmış olmakESC 5
LoranceChen

@LoranceChen modifyOtherKeysÖzellik etkin değilse beklenen davranış budur. Yalnızca yeterince yeni xterm sürümlerinde desteklendiğini ve yalnızca Emacs 24.4'ten bu yana otomatik olarak etkinleştirildiğini unutmayın. OSX'in son sürümleriyle gelip gelmediğini bilmiyorum. Olmazsa ve senin için çalışmıyorsa, yeni bir soru sormanı öneririm. Kullanmakta olduğunuz sürümlerden bahsedin.
Gilles 'SO- kötülük'

2

Gilles'un cevabı şöyle belirtti: On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one. Ben oraya ulaşmakta biraz zorlandım, bu yüzden benim gibi olmanız durumunda, kafanız karıştığında ayrıntılı bir açıklama.

Eğer bir terminalde Emacs çalıştırırken (örn. Mac'in varsayılan Terminal.app) C-x C-;çalışmıyorsa comment-lineve bu işlevselliği istiyorsanız, iTerm2'ye geçmelisiniz (Terminal.app özelliği yoktur) ve bir Anahtar Eşleme oluşturmalısınız. Profiller altında ... Tuşları aşağıdaki gibi:

^;     ^[[59;5u

Bu, +"Klavye Kısayolu" adı verilen küçük bir pencere açan düğmeyi tıklatarak gerçekleştirilir ; bu pencerenin başlangıçta iki alanı vardır; üst kısımda "Set to Click" ve alt kısım "Yoksay" değerine sahiptir. Üst düğmesine tıklayın ve yazın C-;. Bu işlem ve kodu çalıştıracak tuş kombinasyonunu ayarlar. Alt kısımdaki "Action" (Eylem) 'i tıklayın ve yarı yoldan biraz daha aşağıya çıkan "Escape Kaçış Sırası Gönder" i bulup tıklayın. Bunu tıkladıktan sonra, "Esc +" adlı üçüncü bir alan görünecektir. Bu alanın içine şunu yazın:

[59;5u

59Virgülden en ondalık ASCII kodu ve 5kodudur Ctrl. Sonra bitirmek için "Tamam" a basın. Anahtar sırasına doğru anahtar kombinasyonu şimdi iTerm2'nin tercihlerine dahil edilecektir. İTerm'de Emacs'ı başlattığınızda, artık C-x C-;işlevselliğe erişebileceksiniz .

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.