Come attivare la modalità semantica solo per specifiche modalità principali?


8

Ho visto questa domanda molto. Ma nessuna delle risposte ha risolto il mio problema: la modalità minore rimane attiva in altre modalità.

Finora ho provato:

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

Il mio problema con questi 2 approcci è che semantic-moderimarrà attivo in tutte le principali modalità una volta che ho visitato un buffer Python.

Come posso disattivare semantic-modein tutte le altre modalità? Devo spegnerlo manualmente prog-mode-hook?


Provando la soluzione di 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))

Mi cede:

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!

Risposte:


2

La migliore soluzione che ho trovato per limitare la modalità semantica solo a determinati buffer è quella di impostare semantic-inhibit-functions. Ad esempio è possibile aggiungere una funzione che inibisce la semantica nei buffer non in modalità Python come segue

(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

Guardando il codice sorgente semantic.el, sembra che semantic-modesia una modalità secondaria globale . Quindi una volta attivato, verrà attivato in tutti i buffer; e una volta disattivato, verrà disattivato in tutto.


Probabilmente puoi avere qualcosa di simile al di sotto che abilita la modalità semantica solo quando apri un buffer di modalità specifico ( ma non sono sicuro di come si comporterà quando avrai buffer aperti con diverse modalità principali ):

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

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

Va bene, sembra più pulito quello con cui stavo andando prog-mode-hook(anche se funzionava). Tuttavia, puoi dirmi perché hai usato un # ? Il byte-compilato significa che verrà calcolato nel primo passaggio che è .elc?
Mathieu Marques,

1
È una buona pratica di programmazione da usare #'(virgoletta) in cui è previsto un argomento simbolo di funzione . [Altre letture ]
Kaushal Modi,

Ho degli errori Domanda aggiornata.
Mathieu Marques,

@MathieuMarques Un paio di cose .. useresti (progn invece di (lambda ()lì per avvolgere le cose che dovrebbero accadere se la ifcondizione è vera. Inoltre vorrei require stickyfunc-enhanceall'inizio del :initriferimento prima global-semantic-stickyfunc-mode. Per quanto riguarda l'errore reale, vorrei iniziare una nuova domanda con una domanda più diretta + tag. Penso che il problema sia che tu usi lambdainvece di progn.
Kaushal Modi,

Sì, mi rendo conto che ora ho confuso entrambi, grazie per l'aiuto :).
Mathieu Marques,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.