Como ativar o modo semântico apenas para modos principais específicos?

8

Eu já vi muito essa pergunta. Mas nenhuma das respostas resolveu meu problema: o modo secundário permanece ativado nos outros modos.

Até agora, eu tentei:

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

Meu problema com essas duas abordagens é que semantic-modepermanecerá ativado em todos os principais modos quando eu visitar um buffer Python.

Como posso desligar semantic-modeem todos os outros modos? Preciso ativá-lo manualmente prog-mode-hook?


Tentando a solução 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))

Rende-me:

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
fonte

Respostas:

2

A melhor solução que encontrei para restringir o modo semântico apenas a certos buffers é definir semantic-inhibit-functions. Por exemplo, você pode adicionar uma função que inibe a semântica nos buffers que não estão no modo python da seguinte maneira

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

Observando o código-fonte semantic.el, parece que semantic-modeé um modo menor global . Então, uma vez ativado, ele será ativado em todos os buffers; e uma vez desativado, será desativado em todos.


Provavelmente, você pode ter algo como abaixo, que ativa o modo semântico somente quando você abre um buffer de modo específico ( mas não tenho certeza de como ele se comportará quando você tiver buffers abertos com diferentes modos principais ):

(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
fonte
Tudo bem, isso parece mais limpo do que eu estava indo com prog-mode-hook(se até estava funcionando). No entanto, você pode me dizer por que usou um # ? Byte-compiled significa que será computado na primeira etapa que .elc é?
Mathieu Marques
1
É uma boa prática de codificação usar #'(aspas nítidas) onde um argumento de símbolo de função é esperado. [Mais leitura ]
Kaushal Modi
Eu tenho erros Pergunta atualizada.
Mathieu Marques
@MathieuMarques Algumas coisas .. você usaria em (progn vez de (lambda ()lá para embrulhar as coisas que deveriam acontecer se a ifcondição fosse verdadeira. Também eu gostaria require stickyfunc-enhanceno começo :initantes de você fazer referência global-semantic-stickyfunc-mode. Quanto ao erro real, eu começaria uma nova pergunta com uma pergunta mais direcionada + tags. Eu acho que embora o problema esteja com você usando em lambdavez de progn.
Kaushal Modi
Sim, eu percebo agora que misturei os dois, obrigado pela ajuda :).
Mathieu Marques