C- [nasıl gerçek?


10

C-[ABD İngilizcesi klavyelerindeki escape tuşuna eşdeğerdir, bu nedenle, onu bağlama girişimi M-davranışı bozar.

Emacs hiçbir ayıramıyorsanız var gibi görünüyor <escape>ve C-[GUI çerçevelerde arayla. Aşağıdaki işler iyi çalışır ve M-çalışmaya başlayan ciltler çalışmaya devam eder:

(global-set-key (kbd "<escape>") (lambda () (interactive) (message "<escape>")))

Ancak, eğer bağlanırsam

(global-set-key (kbd "C-[") (lambda () (interactive) (message "C-[")))

aniden emacs deliriyor ve M-xmola gibi bağlanıyor. Dahası, basmak C-[bağlı lambda'yı tetiklemeyi reddediyor. İlginçtir, C-x @ c [(açık parantez için değiştirici kontrolü uygulayın) diyor C-[ is undefined.

C-[Emacs'ı kırmadan bir şeyleri bağlamanın bir yolu var mı ?

Yanıtlar:


7

C-[Kullanıcı düzeyindeki haritalarda olduğu gibi bağlamayı gerçekten değiştiremezsiniz global-set-key. Ancak, bu tuş haritalarına ulaşmadan önce bir klavye etkinliği olarak değiştirebilirsiniz. Örneğin şöyle diyebilirsiniz:

(define-key input-decode-map 
    (kbd "C-[") 
    [control-bracketleft])

ve daha sonra [control-bracketleft]tuş haritalarınızda kullanın . Çok basit değil mi?

Yönetmenin seçtikleri

Ne yazık ki, bu kadar basit değil ve bu çözüm çok acı verici görünecek bazı ayarlamalar gerektiriyor. Uyarılmıştın. Ama önce kullanıcı seviyesi haritalarının neden soruya cevap veremediğini görelim. Aşağıda, daha hassas bir şekilde "bir şey gör" dediğimde emacs 26.1 için Emacs Lisp kılavuzuna başvuruyorum.

C-[ASCII kontrol karakteri olarak çok erken bir aşamada yorumlanır ESC(bkz. 21.7.1 - Klavye Olayları ). Bu kod, daha uzun sekanslar için önek olarak diğer tüm alanlara yayılır. Bunun bir nedeni var: ESCaslında meta önek (bkz. meta-prefix-char) Ve bir M-şey okuyan tüm ciltler ile başlayan bir diziye dönüşecektir ESC. Bu nedenle, global haritayı değiştirmek yeterli olmayacaktır: önce değiştirmeniz meta-prefix-char, ardından güvenle haritalayabilmeniz için kullanılan her haritada ESCyeni meta-prefix-charharitanızı yeniden eşleştirmeniz gerekir .M-C-[

Tamam o zaman, tabii ki: kullanalım input-decode-map. Kullanmaya cazip gelebileceğimiz birkaç benzer harita var (bkz. Bölüm 21.8.3 ve 22.14), ama buna sadık kalalım. Ve iyi ... bu işe yarıyor! İşlemi tamamladın, değil mi?

Aslında hayır, hikaye burada bitmiyor. Bu bir pencere sistemi kullandığınız sürece çalışır. Kötü şans nedeniyle acil durumda linux konsolunda hapsedilirseniz, durumun ne kadar dramatik hale geldiğini fark edersiniz: ok tuşları Homeve elbette M-bağlamalar hepsi çöptür. Neden? Çünkü terminal ESC(yazarken bunu yapar) dediğinde C-[, bu gerçekten anlamına gelir ESC ve ASCII olmayan karakterleri iletmek için kullandığı türden bir diziyi başlatır.

Felaketi gözlemleyerek, yukarıdaki input-decode-mapdeğişikliği sadece bir pencere sisteminin klavyeyi kontrol etmesi durumunda etkinleştirilecek şekilde korumanın akıllıca olduğunu düşünebilirsiniz :

(let ((frame (framep (selected-frame))))
  (or (eq  t  frame)
      (eq 'pc frame)

      (define-key input-decode-map 
                  (kbd "C-[") 
                  [control-bracketleft])
     )))

Terminaller daha sonra eskisi gibi çalışır.

Şimdi C-[terminallerle ilgilenebilir miyiz ? Aslında evet, linux konsolunda ve oynayabileceğim diğer terminal emülatörlerinde yapabiliriz. Ancak bu, yeni karakterler sahneye girdiğinde hikayeyi oldukça uzun bir hale getiriyor. Çünkü artık sadece emac yok: terminal artık merkezi bir role sahip.

Linux konsolunun söylediklerine kulak verelim. Düzgün C-vduymak için bazı tuşlardan önce yazın. C-[olduğu ESC; öyle Esc. Yukarı gibi sesler ok ESC [ Aiken, M-aolduğu ESC A. Hmm ... Görünüşe göre bu meta anahtar emacs içindeki engeller değil mi? Neyse.

Karakter olaylar (bu arada hangi ayırt etmeyecek arasında geçen zamana dayalı bazı hileler oynamaya hazır sizsiniz, biz sürece Escdan C-[başka seçeneğimiz var ama konsolu söylemek, o) görünüyor aslında ortalama neyi yapmayacağını ESCyazdığımızda C-[. Ayrıca, C-[stok terminal kodları ile ilgili tek sorun bu çok yakında görünmüyor: değiştiriciler çoğunlukla iletilen bilgileri siler. Terminali emacs'ı özelleştirmemizle aynı şekilde özelleştirmeliyiz: eğer yaparsak çok daha pratik olurdu.

Bu noktada, terminalinizin belgelendirme gözlerine derinlemesine bakmaya cesaret edeceksiniz: loadkeys(1)linux konsolu için man sayfaları , Özel Anahtar Bağlamalarıxterm(1) bölümündeki xterm ve diğer terminaller için bilmedikleriniz . 'De , özel çevirileri Ayarlar / Geçerli Profili Düzenle ... ve ardından Klavye' de tanımlayabilirsiniz . İşte bu son iletişim kutusuyla oynadıktan sonra bir alıntı :KDE konsole~/.local/share/konsole/Test.keytab

key [+Ctrl+AnyModifier : "\EO*["

Eğer Terminal gönderin sahiptir kez ESC O 5 [için C-[(yukarıda yapılandırmada olduğu gibi) kullanarak, emacs'dan geri gidebilir. Elbette, henüz işiniz bitmedi.

Emac'lara belirli bir terminalin ne lehçesini kullandığını bildirmek için ayarlayabilirsiniz input-decode-map. Evet, bu hikâyenin başlangıcında değiştirdiğimiz şey tesadüfen ve term/xterm.elxterm söz konusu olduğunda buna dokunan da bu. Ayarlama için iyi bir yer tty-setup-hook(bkz. Bölüm 40.1.3):

(add-hook 'tty-setup-hook 
   (lambda ()
    (let ((term (getenv "TERM")))
      (cond 
        (;; xterm-function-map not in doc, but in term/xterm.el
         (boundp 'xterm-function-map) 
         (map-my-term-codes xterm-function-map))

        ((equal term "linux")
         (map-my-term-codes input-decode-map))
        )
      )))

Bu kancanın yalnızca terminalde çalıştığınızı unutmayın. Böylece, pencere sistemi başlatma kodunu buraya ekleyemezsiniz. Çeviri işlevinin kendisi:

(defun map-my-term-codes (map)
      (define-key map (kbd "M-O 5 [") 
                      [control-bracketleft])
      )

Ve sonra biraz dinlenebilirsiniz: bu yolculuğun sonu. Tabii ki, terminalleri umursamıyorsanız, tüm acılı kısmı atlayacağınız için hızlıdır. Ancak bunun da eksik olduğunu kabul edeceksiniz.

Son iki not:

  • ESC O 5 [Kod yazmayı seçiyorum C-[. Bu sadece bir örnek: İyi bir seçim gibi davranmayacağım . Sadece bir 5 kısmı, yani bir C-çeşit yerleşik sözleşmeye uyuyor gibi görünüyor

  • linux konsolunun yapılandırılması kötü bir tat bırakır: mevcut bir ara sembol kullanmadan bağlamayı yapmak mümkün görünmüyor ve ihtiyacım olanlar yok . Çoğu internet örneğinde olduğu gibi F21- F246aralığında semboller kullanıyorum , ancak çok tatmin edici değil. İlgisiz birkaç bağlantı için sorun değil, ancak sistematik bir şema sunmaz.

Düzenle

  • Bunu Esckendi kişiliği olan dava ile tamamladım - başka bir gönderide: ESC önek anahtarına bağlamalar nasıl kaldırılır
  • işte beslenecek bir yapılandırmanın bir parçası loadkeys. Bunu /root/custom.kmap içine koydum ve gerektiğinde yüklüyorum (ki bu nadirdir). Gerçek yapılandırmam aynı zamanda okları ve farklı değiştirici kombinasyonlarını da eşleştiriyor, ancak oldukça uzun, sembol ve sekans seçimi tartışmalı ve klavyemin anahtar kodlarının sizinkine uyduğundan emin değilim. Öyleyse onu uygun düzeyinde tutalım: bu bir örnek olmaktan başka bir şey değil.

    keymaps 0-127
    
    # http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html
    # web+man:keymaps
    # web+man:loadkeys
    
    # escape
    keycode  1  = F100
        alt keycode  1 = Escape # keep the Escape behavior somewhere          
    
    # keycode  26 = bracketleft
        control keycode 26 = F115 # Control_bracketleft does not exist          
    
    string F100     = "\033OO" # map this to [escape] in map-my-term-codes
    string F115     = "\033O5["
    

1
Teşekkürler, bu harika bir cevap. Ancak elbette bunun gibi büyük bir cevabın bile ön sayfanın üst kısmına 34 kez çarpılması gerekmez. Her bir çıkışın topluluk tarafından paylaşılan küçük bir maliyeti vardır: spam olup olmadığını kontrol etmek, yeni ilginç içerik olup olmadığını aramak, vb. Belki küçük iyileştirmeleri birlikte gruplayabilirsiniz? Ya da sadece sahip olduklarına sadık kal. Deneyimden bahsetmişken, mükemmel gönderi diye bir şey yoktur, bir noktada ilerlemeniz gerekir.
Gilles 'SO- kötü olmayı bırak

@Gilles Anladım ve bunun için üzgünüm. Bu isteği ayarlamak bazı sorun olduğunu farkında değildi.
Champignac

0

Aşağıdaki çözüm biraz kludky, ancak işe yarıyor gibi görünüyor:

~/.xbindkeysrcAşağıdakileri içermesine izin verin :

"xvkbd -xsendevent -text '\[Control_L]\[F13]'"
  m:0x14 + c:34

"xvkbd -xsendevent -text '\[Control_L]\[F14]'"
  m:0x14 + c:35

Şimdi xbindkeysçevirecek C-[kadar C-<f13>ve C-]hiç C-<f14>serbestçe emacs'taki bağlı olabilir, böylece. Muhtemelen , örneğin abort-recursive-editbaşka bir şeye bağlanmak isteyeceksiniz .C-]C-S-g

Dezavantajı, şimdi C-[tuş kombinasyonunun emac'lara gönderilip gönderilmediğini test etmek için bazı mantık ekleyerek düzeltilebilen Emacs hariç her uygulamada kırılmış olmasıdır ...


FWIW, özel bir şey olduğunu sanmıyorum C-].
Malabarba

Evet, ben de, ama tuhaf bir nedenden ötürü C-]Xbindkey'leri kovduktan sonra bağlantımın çalışması durdu, bu yüzden ben de onu geri bağladım.
Kristóf Marussy
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.