T: Mengapa lisp-interaction-mode
ada, dan apakah ada alasan untuk menggunakannya bukan emacs-lisp-mode
?
The pengguna menyatakan bahwa emacs-lisp-mode
dan lisp-interaction-mode
identik kecuali bahwa mengikat kedua C-j
untuk eval-print-last-sexp
. Di luar itu, "semua perintah lain dalam mode Interaksi Lisp sama dengan dalam mode Lis Emacs." Sejauh yang saya tahu, hanya *scratch*
buffer yang menggunakan mode terakhir.
Menurut saya aneh bahwa ada seluruh mode yang berbeda dari yang lain hanya dengan satu keybinding, jadi saya kira saya kehilangan beberapa sejarah atau konteks.
Begitu:
- Kenapa
lisp-interaction-mode
ada? - Tanpa menghitung
C-j
keybinding, apakah ada keadaan yang lebih disukaiemacs-lisp-mode
? - Apakah akan ada konsekuensi tak terduga untuk mengubah
*scratch*
mode bufferemacs-lisp-mode
?
Motivasi untuk pertanyaan ini adalah bahwa, saat ini, saya mengikat kunci dua kali (dalam dua mode) sehingga *scratch*
buffer saya berperilaku seperti buffer mengunjungi *.el
file. Jika tidak ada alasan praktis untuk tetap bertahan lisp-interaction-mode
, saya akan adil (setq initial-major-mode 'emacs-lisp-mode)
dan selesai melakukannya.
*scratch*
.Jawaban:
Kecuali Anda membenci
C-j
perilakunya (dan saya yakin sebagian besar penulis elisp merasa nyaman), biarkan saja semuanya tetap seperti itu.Tentukan kunci Anda untuk
lisp-mode-shared-map
alih - alih menduplikasiinya untuk tombol khusus mode.Semua
lisp-mode-map
,emacs-lisp-mode-map
, danlisp-interaction-mode-map
memilikilisp-mode-shared-map
sebagai keymap orang tua mereka.sumber
Mode turunan baru murah:
lisp-interaction-mode
mewarisi dariemacs-lisp-mode
, implementasinya hanya selusin baris kode atau lebih. Ini berbeda dariemacs-lisp-mode
hanya dalam beberapa cara berikut:Di sisi lain, ia berbagi tabel singkatan dengan
emacs-lisp-mode
.Sunting: seperti yang dicatat oleh @phils dalam jawabannya (yang dapat dilihat), keymap dari
emacs-lisp-mode
danlisp-interaction-mode
berbagi induk yang samalisp-mode-shared-map
,. Oleh karena itu tidak ada alasan untuk menduplikasi ikatan kunci - cukup mendefinisikannyalisp-mode-shared-map
, dan mereka akan berlaku untuk kedua mode (danlisp-mode
juga, tapi itu mungkin baik-baik saja).Konsekuensi yang paling jelas adalah bahwa
lisp-interaction-mode-hook
tidak lagi dijalankan di*scratch*
buffer.sumber
emacs-lisp-mode-hook
berjalanlisp-interaction-mode
karena itulah cara mode turunan bekerja . Ini tidak memiliki keymap yang berbeda, namun kedua mode elisp berbagi induk keymap yang sama (lisp-mode-shared-map
). Itu memang memiliki tabel sintaksis yang terpisah, tetapi identik dengan yang dari mode induknya (karena itu mengalah pada induk untuk pengaturannya).FWIW, saya gunakan
emacs-lisp-mode
di*scratch*
buffer sendiri. Jika saya ingin mengevaluasi sesuatu, saya hanya melakukannya C-x C-e, dengan C-uawalan saat dibutuhkan. Saya melihat tidak ada kerugian dari praktik ini.Mengenai mengapa mode ada di sana, itu hanya beberapa baris kode lisp
elisp-mode.el
, dan sudah ada di sana seperti selamanya , jadi menghapusnya sepertinya tidak ada gunanya.sumber
C-j
terikatnewline-and-indent
, tetapi hari ini, karena lekukan terjadi lebih otomatis, ini bukan masalah serius lagi. Jadi jika saya belum melakukan perubahan ini sejak lama, saya tidak akan repot dengan itu sekarang.*.el
buffer file sekali pakai .