Terkadang binding kunci global saya ditimpa oleh mode utama. Contoh mudah adalah pengaturan berikut di file init saya
(global-set-key (kbd "C-j") 'newline-and-indent)
Tapi yang menjengkelkan keybinding ini disembunyikan oleh mode utama "Interaksi Lisp" yang merupakan mode default dari buffer awal.
Ketika saya menemukan diri saya dalam situasi di mana mode utama (atau mode minor) menyembunyikan kunci global saya, bagaimana saya bisa mendapatkannya kembali?
Catatan: Pertanyaan saya adalah tidak "Bagaimana saya bisa mengikat C-j
ke newline-and-indent
'? Mode' di" Lisp Interaksi Saya tertarik pada jawaban yang jauh lebih umum tentang bagaimana menangani keymaps yang berbenturan atau pengguna keybindings yang disembunyikan oleh beberapa mode utama / minor.
key-bindings
major-mode
keymap
minor-mode
nispio
sumber
sumber
Jawaban:
Ada juga pendekatan "jalan pintas" untuk solusi yang sama jika Anda tidak ingin mendefinisikan mode minor Anda sendiri (yang saya bicarakan dalam jawaban pertama saya).
Anda dapat menginstal
use-package
paket yang tersedia dari Melpa dan memanfaatkanbind-key*
ataubind-keys*
makro yang merupakan bagian daribind-key
paket yang dikirimkan bersamause-package
.Dari dokumentasi
bind-key.el
:sumber
emulation-mode-map-alists
untuk menegakkan prioritas).(bind-key* "C-M-&" 'override-global-mode)
, ke init Anda, dan Anda biasanya bisa mendapatkan binding dengan cepat jika perlu. Karenaoverride-global-mode
ini bukan mode minor "global", Anda masih harus menonaktifkannya berdasarkan per-buffer. Jadi, jika Anda sering menonaktifkan kunci timpa global maka solusi ini tidak nyaman.Anda dapat menentukan mode minor Anda sendiri dan peta kuncinya dan memilikinya yang menimpa semua mode lainnya (minor + utama). Itulah mengapa saya memilih untuk menulis mode minor saya sendiri.
Langkah-langkah untuk membuat binding kunci Anda menimpa semua binding:
(define-key my-mode-map (kbd "C-j") #'newline-and-indent)
Demikian pula binding kunci Anda lainnya yang diatur dalam mode minor Anda akan menimpa yang di mode lain.
Saya sangat merekomendasikan membaca posting blog oleh Christopher Wellons tentang cara menulis mode minor. Blog itu ditambah gangguan karena harus mengatur beberapa ikatan kunci
nil
dalam beberapa mode mayor dan minor mengilhami saya untuk menulis mode minor saya sendiri.Bagian terbaik dari menggunakan pendekatan ini adalah ketika Anda ingin memeriksa apa yang dilakukan ikatan kunci dalam konfigurasi default emacs, Anda cukup mematikan mode minor Anda; Anda kemudian menyalakannya kembali dan Anda mendapatkan kembali binding kunci kustom Anda.
sumber
Untuk membuat pengikatan global menimpa pengikatan mode mayor, cukup atur pengikatan ke
nil
dalam mode mayor:Pengikatan global tidak mungkin diutamakan daripada semua mode secara umum (jika tidak, tidak ada gunanya memiliki mode utama), tetapi Anda dapat meretasnya dengan membuat mode minor sendiri dengan binding paling penting. Maka Anda setidaknya akan didahulukan dari sebagian besar (walaupun tidak semua) mode.
sumber
(define-key foo-mode (kbd "C-j") nil)
file .emacs saya dan berharap ini berfungsi?foo-mode-map
(contoh saya dalam jawaban itu buruk), tapi ya, itu akan menonaktifkan penjilidan kunci dalam mode utama sehingga penjilidan kunci global akan digunakan sebagai gantinya (kecuali ada mode minor berbeda yang menggunakannya).foo-mode
akan dipanggilfoo-mode-map
?Anda dapat menggunakan makro ini:
EDIT :
Lihat contoh di bawah ini:
Jika keymap X mengungguli Y global binding Anda, Anda menulis:
(expose-bindings X '("Y"))
Dan kemudian override akan menjadi 'dibatalkan'.
sumber
other map
, dengan demikian, mengekspos peta global yang mengikat melaluiother map
. Yang kedua hanya memungkinkan Anda menerapkan yang pertama untuk daftar binding.expose-bindings
pertama, dan kemudian secara global mengikat kunci-kunci itu ke perintah yang saya inginkan? Mungkin Anda bisa menunjukkan contoh apa yang mungkin saya masukkan ke file init saya untuk membuat ini berfungsi.