特定のメジャーモードでのみセマンティックモードをアクティブにする方法は?


8

この質問はよく見ました。しかし、どの返信も私の問題を修正しませんでした。マイナーモードは他のモードのままです。

これまでのところ、私は試しました:

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

これらの2つのアプローチに関する私の問題semantic-modeは、Pythonバッファーにアクセスした後は、すべての主要モードで機能することです。

semantic-mode他のすべてのモードでどのようにオフにできますか?手動でオフにする必要がありprog-mode-hookますか?


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

利回り:

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!

回答:


2

semantic-modeを特定のバッファーのみに制限するために私が見つけた最良の解決策は、を設定することsemantic-inhibit-functionsです。たとえば、次のように、Pythonモードではなく、バッファのセマンティックを抑制する関数を追加できます。

(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

のソースコードをsemantic.el見るsemantic-modeと、グローバルマイナーモードのようです。したがって、アクティブ化されると、すべてのバッファでアクティブ化されます。一度無効にすると、全体で無効になります。


おそらく、特定のモードバッファーを開いたときにのみセマンティックモードを有効にする以下のようなものがあります(ただし、さまざまなメジャーモードでバッファーを開いたときに、バッファーがどのように動作するかはわかりません)。

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

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

よし、それは私が何をしようとしていたのかよりきれいに見えますprog-mode-hook(たとえそれが機能していたとしても)。しかし、なぜ使用したの# ですか?バイトコンパイルは、それが.elcである最初のステップで計算されることを意味しますか?
Mathieu Marques

1
関数のシンボル引数が期待される#'場所で(シャープ引用符)を使用することは、良いコーディング方法です。[もっと読む ]
Kaushal Modi

エラーがあります。質問を更新しました。
Mathieu Marques

@MathieuMarquesいくつかのもの.. 条件がtrueの場合に発生するものをラップするため(progn に、代わりに使用します。また、私はあなたが参照する前に、非常に最初に思います。実際のエラーについては、より詳細な質問+タグで新しい質問を開始します。問題はの代わりに使用することだと思います。(lambda ()ifrequire stickyfunc-enhance:initglobal-semantic-stickyfunc-modelambdaprogn
Kaushal Modi

はい、私は今私が両方を混同していることに気づきました、助けてくれてありがとう:)。
Mathieu Marques
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.