Otomatis mengaktifkan mode minor dalam mode fundamental

8

Dengan desain, fundamental-modetulang telanjang seperti mode utama lainnya seharusnya berasal dari ini.

Dari halaman info (elisp) Major Modes, kami memiliki:

Ini adalah perintah mode utama untuk mode Fundamental. Tidak seperti perintah mode lainnya, ini tidak menjalankan mode kait apa pun (* perhatikan Konvensi Mode Utama: :), karena Anda tidak seharusnya menyesuaikan mode ini.

Untuk alasan itu,

  • Kami tidak punya fundamental-mode-hook.
  • Juga my-minor-modetidak bisa diaktifkan HANYA dalam mode buffer utama ini meskipun ada (global-my-minor-mode 1)di konfigurasi saya.

Di bawah ini akan berfungsi tetapi hanya jika saya mengetik secara manual M-x fundamental-mode:

(add-hook 'after-change-major-mode-hook #'my-minor-mode)

Ini tidak membantu dalam kasus di bawah ini di mana fundamental-modebuffer (* abcd *) dibuat secara default:

(with-current-buffer (get-buffer-create "*abcd*")
  (insert "Hello world"))

Mengapa saya ingin mengaktifkan mode minor fundamental-mode?

Saya suka menyimpan binding kunci kustom saya di peta mode minor saya. Saya memiliki mode minor ini diaktifkan secara global (tetapi itu tidak bisa diaktifkan hanya dalam fundamental-modebuffer).

Berikut ini adalah kasus penggunaan yang membuat ini mengajukan pertanyaan ini di sini. Saat melakukan M-x esup( esuppaket), ia menciptakan *esup-log*buffer dengan fundamental-modesebagai mode utamanya. Tetapi setiap kali saya perlu mengaktifkan mode minor saya secara manual di dalamnya untuk menggunakan binding nyaman saya.

Saya ingin mengaktifkan my-minor-modesecara global, fundamental-modeatau tidak.

Pembaruan 1:

Berikut adalah definisi modus kecil saya: modi-mode.

Pembaruan 2:

Berdasarkan komentar @npostavs , saya meninjau apa yang berbeda antara mode minor saya modi-modedan override-global-modein use-package/bind-key.el. Dan ternyata bahwa nilai init dari modus saya adalah nildan bahwa override-global-modeadalah t.

Jika saya mengubah nilai init dari mode saya ke t, itu juga akan diaktifkan di buffer mode dasar! Tetapi tindakan (global-modi-mode 1)tidak berakhir dengan hasil yang sama. Apakah itu aneh? Mungkin bug?

Kaushal Modi
sumber
Mode pengikatan kunci khusus serupa diaktifkan di fundamental-modebuffer untuk saya, jadi mungkin masalahnya ada pada definisi mode Anda. override-global-mode
npostavs
@npostavs Terima kasih. Saya akan mengulas bagaimana use-packagemengimplementasikannya.
Kaushal Modi
@npostavs Harap periksa pertanyaan yang diperbarui .. ternyata saya menghadapi masalah ini hanya karena nilai init dari mode saya adalah nil; tapi saya mengaktifkannya secara global.
Kaushal Modi
1
Dalam buffer.c, sepertinya get-buffer-createmenjalankan bagian buffer-list-update-hookpaling akhir dari fungsinya, mungkin Anda bisa melampirkan fungsi Anda sendiri dengan kondisi ke kait itu?
hukum
1
Emacs menggunakan buffer sementara "internal" untuk semua jenis tujuan (misalnya melakukan konversi sistem pengkodean untuk I / O ke / dari file atau proses dapat menggunakan buffer sementara). Buffer ini menggunakan mode dasar dan saya pikir itu benar bahwa mereka tidak mengaktifkan mode minor Anda. Adapun buffer lain, aturannya bagi saya adalah: jika Anda ingin melihat buffer ini (selain untuk tujuan debugging) maka mungkin tidak boleh menggunakan mode fundamental.
Stefan

Jawaban:

4

Satu-satunya cara saya bisa mengaktifkan mode minor secara default di fundamental-modebuffer adalah dengan menetapkan nilai init dari mode minor ke t.

(define-minor-mode my-minor-mode
 "My minor mode"
 :init-value t)

Perhatikan bahwa hanya mengaktifkan ON mode minor global (lihat C-h i g (elisp) Defining Minor Modes) dengan nilai init nil tidak melakukan hal yang sama. Dalam hal ini, fundamental-modebuffer akan dibuat dengan mode minor ini dinonaktifkan.


Hal di atas, tentu saja, hanya akan berfungsi jika Anda mengontrol sumber mode minor. Untuk semua mode minor lainnya yang datang dengan paket yang berbeda, jika Anda ingin mengaktifkan mode minor secara default di fundamental-modebuffer, Anda perlu melakukan

(setq-default the-minor-mode t)
Kaushal Modi
sumber
1
Saya pikir untuk mode minor lain yang bisa Anda lakukan (setq-default 'the-minor-mode t)untuk mendapatkan efek yang sama.
npostavs
Poin bagus! Saya akan memperbarui jawabannya (menghapus kutipan tunggal itu). Terima kasih!
Kaushal Modi
Jika Anda menambahkan (setq-default modi-mode 1)fungsi turn-on-modi-modedan (setq-default modi-mode nil) to the function mematikan modi-mode`, maka Anda akan selangkah lebih dekat untuk benar - benar mengaktifkan dan menonaktifkan mode secara global.
nispio
@nispio Itu poin bagus. Saya belum perlu melakukan ini. Tetapi sekarang saya tahu apa yang harus saya lakukan jika saya perlu mengaktifkan mode minor saya di buffer mode-fundamental.
Kaushal Modi
2

Jangan gunakan fundamental-mode - setidaknya tidak secara interaktif. Anda jarang ingin berada di fundamental-mode. Hampir selalu ada sesuatu yang lebih baik.

Intinya fundamental-modeadalah tidak memiliki penanganan mode-mayor biasa (kait, dll.). Anda dapat menganggap fundamental-modesebagai semacam kelas abstrak.

Jika beberapa paket menempatkan Anda di buffer yang ada di fundamental-modekemudian lakukan apa yang perlu Anda lakukan untuk mencegah ini - gunakan beberapa mode lain untuk itu.

Pertimbangkan mengkustomisasi major-mode sehingga default untuk sesuatu selain fundamental-mode. (Saya menggunakan indented-text-mode.)


Sebelumnya ada default-major-modeuntuk ini, yang saya pikir sedikit lebih jelas, tetapi mereka memutuskan untuk mencela itu (masih berfungsi, tentu saja).

default-major-mode is a variable defined in `C source code`.
Its value is indented-text-mode

  This variable is obsolete since 23.2;
  use `major-mode' instead.

Documentation:
Value of `major-mode` for new buffers.
Drew
sumber
Saya tidak menggunakan fundamental-mode. Inti masalahnya adalah bahwa ketika setiap paket menggunakan get-buffer-createuntuk menghasilkan buffer sementara, buffer itu dibuat dengan fundamental-modemode utama. Dalam buffer itu, mode minor saya tidak akan diaktifkan secara default (karena nilai init-nya adalah nihil; walaupun saya mengaktifkannya secara global).
Kaushal Modi
Beberapa paket seperti saya bisa daftar: esup,keyfreq
Kaushal Modi
Paket yang hanya menelepon get-buffer-createtidak melakukan apa pun untuk menetapkan mode utama (atau mode minor apa pun). Haruskah (untuk paket yang dimaksud)? Jika perlu, pertimbangkan untuk menghubungi pengelola paket. Jika tidak, pertimbangkan untuk mengaktifkan sendiri mode utama atau minor pilihan Anda. TKI, jika ini tentang apa yang Anda inginkan, dan bukan apa yang harus diatur oleh paket secara umum, maka terserah Anda untuk mengaturnya seperti yang Anda inginkan.
Drew
Saya ingin tahu mengapa hal ini dibatalkan.
Drew
@Drew karena tidak mengatasi masalah. OP secara eksplisit menyatakan bahwa mode lain membuat buffer dalam mode fundamental, dan solusi yang Anda usulkan adalah tidak menggunakan mode fundamental.
nispio
0

Fungsi get-buffer-createini didefinisikan dalam buffer.c, dan pada akhir fungsi itu ia memanggil buffer-list-update-hook. Pengait seperti itu dapat digunakan untuk menjalankan fungsi kustom, tetapi kondisi tertentu mungkin perlu ditambahkan untuk mencegah fungsi kustom tersebut menembaki momen yang tidak menguntungkan setiap kali kait itu dipanggil oleh fungsi lain.

daftar hukum
sumber