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: ESC
aslı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 ESC
yeni meta-prefix-char
haritanı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-map
değ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 [ A
iken, 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ı ESC
yazdığı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.el
xterm 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["