Bagaimana cara mengaktifkan mode semantik hanya untuk mode utama tertentu?

8

Saya sudah sering melihat pertanyaan ini. Tapi tidak ada balasan yang memperbaiki masalah saya: mode minor tetap ada di mode lain.

Sejauh ini, saya sudah mencoba:

(use-package stickyfunc-enhance
  :config
  ;; (add-to-list 'semantic-default-submodes 'global-semantic-stickyfunc-mode)
  ;; (defun turn-on-semantic () (semantic-mode 1) (require 'stickyfunc-enhance))
  ;; (add-hook 'python-mode-hook 'turn-on-semantic)
  (add-hook 'python-mode-hook
            (lambda ()
              (add-to-list 'semantic-default-submodes 'global-semantic-stickyfunc-mode)
              (semantic-mode 1)
              (require 'stickyfunc-enhance))))

Masalah saya dengan 2 pendekatan itu adalah bahwa semantic-modeakan tetap ada di semua mode utama setelah saya mengunjungi buffer Python.

Bagaimana saya bisa mematikan semantic-modesemua mode lainnya? Apakah saya harus mematikannya secara manual prog-mode-hook?


Mencoba solusi kaushalmodi:

(use-package stickyfunc-enhance
  :init
  (add-to-list 'semantic-default-submodes 'global-semantic-stickyfunc-mode)
  :config
  (defun me/enable-semantic-maybe ()
    "Maybe enable `semantic-mode'."
    (if (derived-mode-p 'python-mode)
        (lambda ()
          (semantic-mode 1)
          (require 'stickyfunc-enhance))
      (semantic-mode -1)))
  (add-hook 'change-major-mode-hook #'me/enable-semantic-maybe))

Menghasilkan saya:

Making python-shell-interpreter local to  *Python Internal [792caf12c778150badeeede64c068cee]* while let-bound!
Making python-shell-interpreter-args local to  *Python Internal [792caf12c778150badeeede64c068cee]* while let-bound!
Mathieu Marques
sumber

Jawaban:

2

Solusi terbaik yang saya temukan untuk membatasi mode semantik hanya untuk buffer tertentu adalah dengan mengatur semantic-inhibit-functions. Misalnya Anda bisa menambahkan fungsi yang menghambat semantik di buffer bukan dalam mode python sebagai berikut

(defun my-inhibit-semantic-p ()
  (not (equal major-mode 'python-mode)))

(with-eval-after-load 'semantic
      (add-to-list 'semantic-inhibit-functions #'my-inhibit-semantic-p))
Iqbal Ansari
sumber
2

Melihat kode sumber dalam semantic.el, sepertinya semantic-modeadalah mode minor global . Jadi sekali diaktifkan, itu akan diaktifkan di semua buffer; dan setelah dinonaktifkan, semuanya akan dinonaktifkan.


Anda mungkin dapat memiliki sesuatu seperti di bawah ini yang memungkinkan mode semantik hanya ketika Anda membuka buffer mode tertentu ( tapi saya tidak yakin seberapa baik itu akan berperilaku ketika Anda memiliki buffer terbuka dengan mode utama yang berbeda ):

(defun my/enable-semantic-mode-maybe ()
  (if (derived-mode-p 'python-mode)
      (semantic-mode 1)
    (semantic-mode -1)))
(add-hook 'change-major-mode-hook #'my/enable-semantic-mode-maybe)

Dari semantic.el:

(define-minor-mode semantic-mode
  "Toggle parser features (Semantic mode).
With a prefix argument ARG, enable Semantic mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
Semantic mode if ARG is omitted or nil.

;; -- snip --     

\\{semantic-mode-map}"
  :global t ; <-- GLOBAL MODE

;; -- snip --
Kaushal Modi
sumber
Baiklah, itu terlihat lebih bersih dengan apa yang saya lakukan prog-mode-hook(jika itu bekerja). Namun, dapatkah Anda memberi tahu saya mengapa Anda menggunakan # ? Apakah byte-compiled berarti akan dihitung pada langkah pertama dari .elc?
Mathieu Marques
1
Ini adalah praktik pengkodean yang baik untuk digunakan #'(sharp-quote) di mana argumen simbol fungsi diharapkan. [Baca selengkapnya ]
Kaushal Modi
Saya memiliki kesalahan. Pertanyaan diperbarui.
Mathieu Marques
@MathieuMarques Beberapa hal .. Anda akan menggunakan (progn bukannya di (lambda ()sana untuk membungkus hal-hal yang harus terjadi jika ifkondisinya benar. Juga saya akan require stickyfunc-enhancedi awal :initsebelum referensi Anda global-semantic-stickyfunc-mode. Adapun kesalahan yang sebenarnya, saya akan memulai pertanyaan baru dengan tag + pertanyaan yang lebih terarah. Saya pikir meskipun masalahnya adalah Anda menggunakan lambdabukan progn.
Kaushal Modi
Ya saya sadar sekarang saya mencampuradukkan keduanya, terima kasih atas bantuannya :).
Mathieu Marques