2011-07-26 27 views
17

Tôi đã làm trung tâm-con trỏ-mode kích hoạt tổng thể, như thế này:tự động vô hiệu hóa một chế độ nhỏ toàn cầu cho một chế độ chính cụ thể

(require 'centered-cursor-mode) 
(global-centered-cursor-mode 1) 

Nó hoạt động tốt, nhưng có một số chế độ chính nơi tôi muốn vô hiệu hóa nó tự động. Ví dụ slime-repl và shell.

Có một câu hỏi khác liên quan đến cùng một vấn đề, nhưng một chế độ phụ khác. Thật không may, câu trả lời chỉ cung cấp cách giải quyết cho chế độ nhỏ cụ thể này (chế độ toàn cầu-tab-thông minh), không hoạt động với chế độ con trỏ ở giữa.

Tôi đã thử móc này, nhưng nó không có hiệu lực. Biến không thay đổi.

(eval-after-load "slime" 
    (progn 
    (add-hook 'slime-repl-mode-hook (lambda() 
             (set (make-local-variable 'centered-cursor-mode) nil))) 
    (slime-setup '(slime-repl slime-autodoc)))) 

Trả lời

11

tôi đã thực hiện một chế độ nhỏ toàn cầu mới, điều đó không được kích hoạt trong chế độ nhất định. Hàm lambda là hàm được gọi trong mỗi bộ đệm mới để kích hoạt chế độ phụ. Đó là nơi thích hợp để tạo ngoại lệ.

(require 'centered-cursor-mode) 

(define-global-minor-mode my-global-centered-cursor-mode centered-cursor-mode 
    (lambda() 
    (when (not (memq major-mode 
        (list 'slime-repl-mode 'shell-mode))) 
     (centered-cursor-mode)))) 

(my-global-centered-cursor-mode 1) 

Nó sẽ hoạt động cho mọi chế độ nhỏ toàn cục khác. Chỉ cần sao chép định nghĩa toàn cầu-xxx-mode và làm cho các trường hợp ngoại lệ đúng.

+0

Nó dường như không hoạt động khi bạn chuyển từ chế độ này sang chế độ khác – xuhdev

10

chế độ nhỏ toàn cầu tạo ra với define-globalized-minor-mode vĩ mô là một chút khéo léo. Lý do mã của bạn không xuất hiện để làm bất cứ điều gì là chế độ toàn cầu hóa sử dụng after-change-major-mode-hook để kích hoạt chế độ nhỏ đệm cục bộ mà họ kiểm soát; và móc đó chạy ngay lập tức sau móc riêng của chế độ chính .

Chế độ riêng lẻ có thể triển khai các cách tùy chỉnh chỉ định một số loại danh sách đen hoặc phương pháp ngăn chế độ này trong một số trường hợp nhất định, vì vậy nói chung sẽ xem xét các tùy chọn M-x customize-group có liên quan các cơ sở như vậy tồn tại. Tuy nhiên, một cách tổng quát tốt đẹp để đạt được điều này cho BẤT CỨ chế độ nhỏ toàn cầu hóa đang né tránh tôi cho thời điểm này.

Thật đáng tiếc khi chức năng MODE-enable-in-buffers được xác định bởi macro đó không thực hiện kiểm tra tương tự (with-current-buffer buf (if ,global-mode ...)) được thực hiện bởi chức năng chế độ chung. Nếu có, bạn có thể chỉ cần sử dụng chế độ slime-repl-mode-hook để tạo bộ đệm biến chế độ toàn cục cục bộ và không.

Một hack nhanh chóng là để kiểm tra gì đối số turn-on là dành cho các định nghĩa chế độ nhỏ toàn cầu (trong trường hợp này đó là centered-cursor-mode tự), và viết một số xung quanh những lời khuyên để ngăn việc đó được đánh giá cho các phương thức trong câu hỏi.

(defadvice centered-cursor-mode (around my-centered-cursor-mode-turn-on-maybe) 
    (unless (memq major-mode 
       (list 'slime-repl-mode 'shell-mode)) 
    ad-do-it)) 
(ad-activate 'centered-cursor-mode) 

Something chúng tôi thể do (với một mô hình tái sử dụng được dễ dàng) là ngay lập tức vô hiệu hóa chế độ nhỏ đệm cục bộ một lần nữa sau khi nó đã được kích hoạt. Một after-change-major-mode-hook chức năng bổ sung với APPEND lập luận để add-hook đáng tin cậy sẽ chạy sau khi chế độ nhỏ toàn cầu hóa đã hành động, và vì vậy chúng tôi có thể làm những việc như:

(add-hook 'term-mode-hook 'my-inhibit-global-linum-mode) 

(defun my-inhibit-global-linum-mode() 
    "Counter-act `global-linum-mode'." 
    (add-hook 'after-change-major-mode-hook 
      (lambda() (linum-mode 0)) 
      :append :local)) 

hoặc bí danh của nó define-global-minor-mode mà tôi cảm thấy nên tránh được, do khả năng nhầm lẫn với chế độ phụ "toàn cầu" được tạo với define-minor-mode. Chế độ nhỏ "toàn cầu hóa", trong khi vẫn liên quan đến chế độ nhỏ toàn cầu, hoạt động rất khác trong thực tế, vì vậy tốt hơn nên gọi chúng là "toàn cầu hóa" thay vì "toàn cầu".

C-hfdefine-globalized-minor-modeRET cho thấy turn-on là số thứ ba, và chúng tôi kiểm tra xem trong định nghĩa chế độ với M-xfind-functionRETglobal-centered-cursor-modeRET.

với phương pháp này, thực tế sẽ ngăn bạn bật chế độ nhỏ này với bộ đệm chế độ slime-repl-mode hoặc chế độ shell, trong khi chế độ phụ toàn cầu hóa có chức năng bật riêng biệt được gọi dưới dạng không toàn cục nếu bạn muốn.

https://stackoverflow.com/a/19295380/324105

+0

Cảm ơn câu trả lời của bạn. Tôi đã thử móc này: – chrm

Các vấn đề liên quan