Comment activer le mode sémantique uniquement pour des modes majeurs spécifiques?

8

J'ai beaucoup vu cette question. Mais aucune des réponses n'a résolu mon problème: le mode mineur reste activé dans les autres modes.

Jusqu'à présent, j'ai essayé:

(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))))

Mon problème avec ces 2 approches est que semantic-modecela restera actif dans tous les modes principaux une fois que j'aurai visité un tampon Python.

Comment puis-je désactiver semantic-modedans tous les autres modes? Dois-je le désactiver manuellement prog-mode-hook?


Essayer la solution de 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))

Me donne:

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
la source

Réponses:

2

La meilleure solution que j'ai trouvée pour restreindre le mode sémantique à certains tampons uniquement est de définir semantic-inhibit-functions. Par exemple, vous pouvez ajouter une fonction qui inhibe la sémantique dans les tampons non en mode python comme suit

(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
la source
2

En regardant le code source semantic.el, il ressemble à semantic-modeun mode mineur global . Donc une fois activé, il sera activé dans tous les tampons; et une fois désactivé, il sera désactivé en tout.


Vous pouvez probablement avoir quelque chose comme ci-dessous qui active le mode sémantique uniquement lorsque vous ouvrez un tampon de mode spécifique ( mais je ne suis pas sûr de savoir comment il se comportera lorsque vous aurez des tampons ouverts avec différents modes principaux ):

(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)

De 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
la source
D'accord, ça a l'air plus propre que ce que j'allais faire prog-mode-hook(si même ça fonctionnait). Cependant, pouvez-vous me dire pourquoi avez-vous utilisé un # ? La compilation d'octets signifie-t-elle qu'elle sera calculée à la première étape qu'est .elc?
Mathieu Marques
1
Il s'agit d'une bonne pratique de codage à utiliser #'(guillemet pointu) lorsqu'un argument de symbole de fonction est attendu. [Plus de lecture ]
Kaushal Modi
J'ai des erreurs. Question mise à jour.
Mathieu Marques
@MathieuMarques Un couple de choses .. vous utiliseriez (progn au lieu de (lambda ()là pour envelopper ce qui devrait arriver si la ifcondition est vraie. Je voudrais également require stickyfunc-enhanceau tout début de la :initréférence avant vous global-semantic-stickyfunc-mode. Quant à l'erreur réelle, je commencerais une nouvelle question avec une question + des balises plus dirigées. Je pense cependant que le problème est que vous utilisez lambdaau lieu de progn.
Kaushal Modi
Oui, je me rends compte maintenant que j'ai mélangé les deux, merci pour l'aide :).
Mathieu Marques