Mengapa mode interaksi lisp ada, dan apakah kita pernah membutuhkannya?

20

T: Mengapa lisp-interaction-modeada, dan apakah ada alasan untuk menggunakannya bukan emacs-lisp-mode?

The pengguna menyatakan bahwa emacs-lisp-modedan lisp-interaction-modeidentik kecuali bahwa mengikat kedua C-juntuk 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:

Motivasi untuk pertanyaan ini adalah bahwa, saat ini, saya mengikat kunci dua kali (dalam dua mode) sehingga *scratch*buffer saya berperilaku seperti buffer mengunjungi *.elfile. Jika tidak ada alasan praktis untuk tetap bertahan lisp-interaction-mode, saya akan adil (setq initial-major-mode 'emacs-lisp-mode)dan selesai melakukannya.

Dan
sumber
1
Mungkin Anda akan berhenti menambahkan setiap pertanyaan Anda dengan " Q: " :)
nicael
Anda dapat menggunakan mode utama apa pun yang Anda suka *scratch*.
Stefan
3
@nicael: T: apa yang tidak disukai tentang Q ? Anda luka saya, Pak! ;)
Dan

Jawaban:

13

Kecuali Anda membenci C-jperilakunya (dan saya yakin sebagian besar penulis elisp merasa nyaman), biarkan saja semuanya tetap seperti itu.

Tentukan kunci Anda untuk lisp-mode-shared-mapalih - alih menduplikasiinya untuk tombol khusus mode.

Semua lisp-mode-map, emacs-lisp-mode-map, dan lisp-interaction-mode-mapmemiliki lisp-mode-shared-mapsebagai keymap orang tua mereka.

phils
sumber
15

Mode turunan baru murah: lisp-interaction-modemewarisi dari emacs-lisp-mode, implementasinya hanya selusin baris kode atau lebih. Ini berbeda dari emacs-lisp-modehanya dalam beberapa cara berikut:

  • itu memiliki nama yang berbeda;
  • memiliki keymap yang berbeda;
  • ini memiliki tabel sintaks yang berbeda;
  • ia memiliki kait tambahan.

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-modedan lisp-interaction-modeberbagi induk yang sama lisp-mode-shared-map,. Oleh karena itu tidak ada alasan untuk menduplikasi ikatan kunci - cukup mendefinisikannya lisp-mode-shared-map, dan mereka akan berlaku untuk kedua mode (dan lisp-modejuga, tapi itu mungkin baik-baik saja).

Apakah akan ada konsekuensi tak terduga untuk mengubah *scratch*mode buffer emacs-lisp-mode?

Konsekuensi yang paling jelas adalah bahwa lisp-interaction-mode-hooktidak lagi dijalankan di *scratch*buffer.

jch
sumber
3
Ini memiliki kait tambahan . emacs-lisp-mode-hookberjalan lisp-interaction-modekarena 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).
phils
Sial, kau benar. Semoga benar sekarang.
jch
4

FWIW, saya gunakan emacs-lisp-modedi *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.

Harald Hanche-Olsen
sumber
Saya mulai melakukan ini sendiri berabad-abad yang lalu karena saya ingin C-jterikat newline-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.
Harald Hanche-Olsen
Saya juga, untuk apa nilainya - telah melakukannya untuk waktu yang lama. Atau saya menggunakan *.elbuffer file sekali pakai .
Drew