Anggaplah saya telah mengunduh mode utama yang disebut magical-mode
, dan ia memiliki keymap ajaib yang disebut magical-mode-map
. Mode ini juga menyediakan hook magical-mode-hook
yang dijalankan setiap kali magical-mode
menjadi mode utama buffer. Sekarang saya ingin memodifikasi file init saya untuk menambahkan beberapa binding kunci kustom untuk digunakan dalam mode itu.
Tampaknya ada (setidaknya) dua cara untuk mengatur ikatan kunci khusus magical-mode
. Yang paling sering saya lihat adalah ini:
(defun my-magical-keys ()
(local-set-key (kbd "C-i") 'previous-line)
(local-set-key (kbd "C-k") 'next-line)
(local-set-key (kbd "C-j") 'backward-char)
(local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)
Tetapi juga mungkin untuk melakukannya dengan cara ini:
(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)
Metode kedua sebenarnya tampak lebih bersih bagi saya. Apakah ada keuntungan untuk melakukannya satu arah dari yang lain?
elisp
key-bindings
major-mode
nispio
sumber
sumber
C-n
danC-p
. Contohnya hanyalah kode dummy. Saya ingin membuat beberapa contoh mode yang sangat sederhana dan contoh binding, tepatnya agar binding itu sendiri tidak mengalihkan perhatian dari tujuan sebenarnya dari pertanyaan itu.Jawaban:
Pendekatan kedua lebih disukai karena memodifikasi keymap mode hanya sekali.
Jika Anda melakukannya menggunakan pengait mode maka itu akan dipanggil setiap kali mode tersebut diaktifkan di beberapa buffer. Melakukannya lagi biasanya tidak akan benar-benar berpengaruh karena kunci hanya terikat pada apa yang sudah terikat. Kunci mode utama adalah "lokal" ke mode utama, bukan buffer individual yang menggunakan mode itu, jadi jika Anda mengubah pengikatan di salah satu buffer ini menggunakan
local-set-key
maka yang mempengaruhi semua buffer dengan mode utama yang sama.local-set-key
terutama dimaksudkan untuk digunakan sebagai perintah. Setelah Anda menentukan bahwa Anda ingin membuat beberapa perubahan tetap, gunakandefine-key
dengan mode keymap sebagai argumen pertama.Jika Anda menggunakan pengait untuk memodifikasi keymap berulang kali maka itu dapat bertentangan dengan tujuan penggunaan
local-set-key
. Katakanlah Anda menggunakanM-x local-set-key RET C-i fancy-previous-line RET
karena Anda ingin mencoba varian ituprevious-line
. Jika sekarang Anda membuka buffer baru yang menggunakan mode mayor yang sama, maka hook akan berjalan lagi dan mengesampingkan binding sementara Anda, di semua buffer menggunakan mode mayor itu, termasuk buffer yang sebelumnya Anda gunakanlocal-set-key
.sumber
(eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...))
.Penggunaan
(define-key my-magical-mode-map …)
adalah cara biasa.Saat Anda menggunakan kait dan
local-set-key
, tombol ditambahkan setiap kali Anda memasuki mode Magis Saya di beberapa buffer. Ini aneh karenalocal-set-key
mempengaruhi semua buffer yang berada dalam mode yang sama (lebih umum, semua buffer menggunakan keymap yang sama). Jadi, jika Anda telah membuat perubahan pada peta tombol, mereka akan diganti setiap kali Anda memasuki mode Magical Saya di buffer.Metode kedua juga dapat membingungkan jika Anda menyesuaikan keymap di tempat yang berbeda. Kait dieksekusi dalam urutan terbalik dari urutan ditambahkan, dan sampai pertama kali dieksekusi, Anda tidak akan melihat jejak kustomisasi Anda.
sumber
Anda tampaknya tidak bertanya tentang mendefinisikan keymap mode-utama tetapi tentang kode pengguna untuk menambah atau mengubah beberapa keybindings dalam keymap mode-utama yang ada . Anda mengatakan "kebiasaan", yang menyarankan ini, tetapi kami mungkin juga menjelaskannya.
Yang pasti, apa yang Anda katakan paling sering Anda lihat untuk ini bukanlah apa yang digunakan secara umum untuk menentukan keymap mode-utama. Hal ini tidak apa yang Anda temukan dalam kode sumber Emacs, misalnya. Dan bukan itu yang direkomendasikan dalam manual Elisp (node
Major Mode Conventions
).Hanya ingin menyingkirkan hal itu, menjadi jelas bagi orang lain: Anda biasanya tidak ingin menggunakan pengait mode untuk menentukan peta mode-utama.
Untuk pertanyaan Anda tentang penyesuaian kunci pengguna -
Dalam hal apapun itu bukan
local-set-key
yang harus Anda gunakan dalam mode hook. Gunakan sajadefine-key
keymap mode-utama, persis seperti pada contoh pertama Anda. @tarsius sudah menjelaskan ini dengan baik.Selain itu, jawabannya adalah: itu membuat sedikit perbedaan, secara umum , apakah Anda mengikat kunci (menggunakan
define-key
dengan mode peta) sekali dan untuk semua atau Anda menggunakan kait untuk mengikatnya setiap kali Anda memasuki mode.Tapi itu bisa membuat perbedaan jika binding di peta berubah - misalnya, dengan memuat beberapa kode lain yang mengubahnya. Dalam hal ini, menempatkan binding pada hook mode-utama memastikan bahwa ketika mode dimasukkan binding akan terbentuk. Yaitu, memastikan bahwa mereka akan dibuat, tetapi tidak memastikan bahwa tidak ada lagi yang mengubahnya sesudahnya (misalnya fungsi lain pada kait yang sama, dipanggil setelah itu). Ingatlah bahwa Anda memiliki sedikit kendali atas apa yang dijalankan pada hook dan kapan - kecuali, tentu saja Anda yakin bahwa hanya kode Anda sendiri yang mengacaukannya.
Itulah satu-satunya perbedaan efek, yang dapat saya pikirkan. Bagi Anda untuk memutuskan kapan Anda menganggap perbedaan itu sebagai keuntungan dari satu atau lain pendekatan. FWIW, melihat kode saya sendiri, saya rasa saya tidak pernah mengikat kunci pada mode hook.
sumber
Penamaan Anda sedikit membingungkan (saya pikir Anda harus menghapus
my
bagian kedua dari pertanyaan Anda).Lagi pula dengan asumsi
my-magical-keys
adalah fungsi kustomisasi penggunamagical-mode
, saya melihat satu keuntungan yang jelas. Sangat mudah untuk menghapus (denganremove-hook
) kait dalam sekali jalan.Keuntungan kedua adalah untuk apa fungsi dimaksudkan. Maksud saya mereka dapat digunakan kembali. Anda dapat mengaitkannya ke mode lain.
Edit:
Seperti yang ditunjukkan oleh @tarsius, melepas kait tidak akan mengembalikan perilaku asli dan mengubah fungsi menjadi mode minor mungkin lebih baik.
sumber
my-magical-mode
. Namun, jika penggunaanmy-
awalan membingungkan saya tentu dapat mengedit pertanyaan.my-
ditambahkan untuk fungsi pengguna.my-
sehingga tidak ada yang akan berpikir bahwa saya bertanya bagaimana mengkonfigurasi mode nyata yang disebutmagical-mode
(jika ada).