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!

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.