Làm cách nào để kích hoạt chế độ ngữ nghĩa cho các chế độ chính cụ thể?


8

Tôi đã thấy câu hỏi này rất nhiều. Nhưng không có câu trả lời nào khắc phục được vấn đề của tôi: chế độ nhỏ vẫn ở chế độ khác.

Cho đến nay, tôi đã thử:

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

Vấn đề của tôi với 2 cách tiếp cận đó là semantic-modesẽ tồn tại trong tất cả các chế độ chính khi tôi truy cập bộ đệm Python.

Làm thế nào tôi có thể tắt semantic-modetrong tất cả các chế độ khác? Tôi có phải tự tắt nó prog-mode-hookkhông?


Đang thử giải pháp của kaushalmodi's:

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

Mang lại cho tôi:

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!

Câu trả lời:


2

Giải pháp tốt nhất tôi đã tìm thấy để hạn chế chế độ ngữ nghĩa đối với một số bộ đệm nhất định là đặt semantic-inhibit-functions. Ví dụ: bạn có thể thêm một hàm ức chế ngữ nghĩa trong bộ đệm không ở chế độ python như sau

(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

Nhìn vào mã nguồn semantic.el, có vẻ như semantic-modelà một chế độ nhỏ toàn cầu . Vì vậy, một khi được kích hoạt, nó sẽ được kích hoạt trong tất cả các bộ đệm; và một khi ngừng hoạt động, nó sẽ bị hủy kích hoạt.


Bạn có thể có một cái gì đó như bên dưới chỉ bật chế độ ngữ nghĩa khi bạn mở bộ đệm chế độ cụ thể ( nhưng tôi không chắc nó sẽ hoạt động tốt như thế nào khi bạn mở bộ đệm với các chế độ chính khác nhau ):

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

Từ 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 --

Được rồi, điều đó có vẻ sạch hơn những gì tôi sẽ làm prog-mode-hook(nếu thậm chí nó đang hoạt động). Tuy nhiên, bạn có thể cho tôi biết tại sao bạn sử dụng một # ? Liệu byte được biên dịch có nghĩa là nó sẽ được tính trong bước đầu tiên .elc là?
Mathieu Marques

1
Đó là một cách thực hành mã hóa tốt để sử dụng #'(trích dẫn sắc nét) trong đó đối số ký hiệu hàm được mong đợi. [Đọc thêm ]
Kaushal Modi

Tôi có lỗi. Cập nhật câu hỏi.
Mathieu Marques

@MathieuMarques Vài điều .. bạn sẽ sử dụng (progn thay vì (lambda ()ở đó để bọc những thứ sẽ xảy ra nếu ifđiều kiện là đúng. Ngoài ra tôi sẽ require stickyfunc-enhancengay từ đầu trong :inittrước khi bạn tham khảo global-semantic-stickyfunc-mode. Đối với lỗi thực tế, tôi sẽ bắt đầu một câu hỏi mới với thẻ + câu hỏi được định hướng nhiều hơn. Tôi nghĩ rằng mặc dù vấn đề là với bạn sử dụng lambdathay vì progn.
Kaushal Modi

Có tôi nhận ra bây giờ tôi đã trộn lẫn cả hai, cảm ơn vì sự giúp đỡ :).
Mathieu Marques
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.