¿Cómo activar el modo semántico solo para modos principales específicos?

8

He visto mucho esta pregunta. Pero ninguna de las respuestas solucionó mi problema: el modo menor permanece activado en otros modos.

Hasta ahora, he intentado:

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

Mi problema con esos 2 enfoques es que semantic-modepermanecerá en todos los modos principales una vez que visite un búfer de Python.

¿Cómo puedo desactivar semantic-modeen todos los demás modos? ¿Tengo que apagarlo manualmente prog-mode-hook?


Probar la solución 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 rinde

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
fuente

Respuestas:

2

La mejor solución que he encontrado para restringir el modo semántico solo a ciertos buffers es establecer semantic-inhibit-functions. Por ejemplo, puede agregar una función que inhiba la semántica en buffers que no están en modo python de la siguiente manera

(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
fuente
2

Mirando el código fuente semantic.el, parece que semantic-modees un modo menor global . Entonces, una vez activado, se activará en todos los buffers; y una vez desactivado, se desactivará en todos.


Probablemente pueda tener algo como a continuación que habilita el modo semántico solo cuando abre un búfer de modo específico ( pero no estoy seguro de qué tan bien se comportará cuando tenga búferes abiertos con diferentes modos principales ):

(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
fuente
Muy bien, eso parece más limpio con lo que estaba buscando prog-mode-hook(incluso si funcionaba). Sin embargo, ¿puedes decirme por qué usaste un # ? ¿Byte-compilado significa que se calculará en el primer paso que es .elc?
Mathieu Marques
1
Es una buena práctica de codificación usar #'(comillas nítidas) donde se espera un argumento de símbolo de función . [Más lectura ]
Kaushal Modi
Tengo errores Pregunta actualizada
Mathieu Marques
@MathieuMarques Un par de cosas ... usarías en (progn lugar de (lambda ()allí para envolver las cosas que deberían suceder si la ifcondición es verdadera. También lo haría require stickyfunc-enhancedesde el principio en la :initreferencia anterior global-semantic-stickyfunc-mode. En cuanto al error real, comenzaría una nueva pregunta con una pregunta más dirigida + etiquetas. Sin embargo, creo que el problema es con usted usando en lambdalugar de progn.
Kaushal Modi
Sí, me doy cuenta de que ahora mezclé ambos, gracias por la ayuda :).
Mathieu Marques