Wie aktiviere ich den Semantikmodus nur für bestimmte Hauptmodi?

8

Ich habe diese Frage oft gesehen. Aber keine der Antworten hat mein Problem behoben: Der Nebenmodus bleibt in anderen Modi aktiviert.

Bisher habe ich versucht:

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

Mein Problem mit diesen beiden Ansätzen ist, dass semantic-modesie in allen wichtigen Modi aktiviert bleiben, sobald ich einen Python-Puffer besucht habe.

Wie kann ich semantic-modein allen anderen Modi ausschalten ? Muss ich es manuell ausschalten prog-mode-hook?


Kaushalmodis Lösung versuchen:

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

Ergibt mich:

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
quelle

Antworten:

2

Die beste Lösung, die ich gefunden habe, um den Semantikmodus nur auf bestimmte Puffer zu beschränken, ist das Setzen semantic-inhibit-functions. Beispielsweise können Sie eine Funktion hinzufügen, die die Semantik in Puffern, die sich nicht im Python-Modus befinden, wie folgt verhindert

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

Wenn man sich den Quellcode semantic.elanschaut, sieht es so aus, als wäre semantic-modees ein globaler Nebenmodus. Sobald es aktiviert ist, wird es in allen Puffern aktiviert. und sobald es deaktiviert ist, wird es in allen deaktiviert.


Sie können wahrscheinlich so etwas wie das Folgende haben, das den semantischen Modus nur aktiviert, wenn Sie einen bestimmten Moduspuffer öffnen ( aber ich bin nicht sicher, wie gut er sich verhält, wenn Puffer mit verschiedenen Hauptmodi geöffnet sind ):

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

Von 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
quelle
Okay, das sieht sauberer aus als das, was ich wollte prog-mode-hook(wenn es überhaupt funktioniert hat). Können Sie mir jedoch sagen, warum Sie a verwendet haben # ? Bedeutet bytekompiliert, dass es im ersten Schritt von .elc berechnet wird?
Mathieu Marques
1
Es ist eine gute Codierungspraxis #'(scharfes Anführungszeichen), wenn ein Funktionssymbolargument erwartet wird. [Mehr lesen ]
Kaushal Modi
Ich habe fehler Frage aktualisiert.
Mathieu Marques
@MathieuMarques Ein paar Dinge .. Sie würden (progn stattdessen (lambda ()dort verwenden, um die Dinge zu verpacken, die passieren sollten, wenn die ifBedingung erfüllt ist. Auch ich würde require stickyfunc-enhanceganz am Anfang in der :initvor Ihnen genannten global-semantic-stickyfunc-mode. Was den eigentlichen Fehler betrifft, würde ich eine neue Frage mit einer gezielteren Frage + Tags beginnen. Ich denke jedoch, dass das Problem bei Ihnen liegt, lambdaanstatt progn.
Kaushal Modi
Ja, mir ist jetzt klar, dass ich beide verwechselt habe, danke für die Hilfe :).
Mathieu Marques