Ẩn danh sách các chế độ nhỏ trong dòng chế độ


22

Tôi sử dụng khá nhiều chế độ nhỏ và thường tôi biết chế độ nhỏ nào được bật trong mọi chế độ chính. Nếu tôi thực sự muốn xem danh sách đầy đủ, tôi có thể chạy C-h v minor-mode-list.

Đồng thời, dòng chế độ của tôi thực sự bị tắc, vì vậy khi tôi chia khung theo chiều dọc, đôi khi tôi không thể đọc được cuối dòng chế độ.

Câu hỏi thực tế: làm thế nào để tắt hiển thị danh sách các chế độ nhỏ trong dòng chế độ? Ví dụ, bây giờ nó có thể trông như thế này:

-:--- main.c        All (7,12)     (C/l FlyC SScr Abbrev Fill) [main] 16:19 0.45

Tôi muốn nó trông súc tích hơn:

-:--- main.c        All (7,12)     (C/l) [main] 16:19


2
Bạn cũng có thể nhìn vào chế độ giàu thiểu số .
Kaushal Modi

Câu trả lời:


15

Chế độ giảm dần (có sẵn trong Melpa) sẽ làm điều này.

(diminish 'projectile-mode)

2
Nếu bạn chỉ muốn rút ngắn tên của chế độ nhỏ thay vì ẩn hoàn toàn, bạn có thể sử dụng(diminish 'projectile-mode "p")
erikstokes

5
Cũng lưu ý rằng việc sử dụng giảm dần thực tế(eval-after-load "filladapt" '(diminish 'filladapt-mode))(sử dụng ví dụ từ Wiki Emacs) và không chỉ (diminish 'filladapt-mode)như đề xuất của câu trả lời. Bạn chỉ có thể sử dụng phiên bản ngắn nếu chế độ được đảm bảo đã được tải.
phils

15

Như mbork đã nhận xét, bạn có thể sử dụng enjoy.el để sửa đổi hoặc vô hiệu hóa văn bản chế độ nhỏ (và thực sự chính) trong dòng chế độ.

Một trong những lợi thế là nó quan tâm đến eval-after-load(mà bạn cần viết thủ công với diminish.el trong hầu hết các trường hợp sử dụng), giúp cấu hình sạch hơn. Bạn vẫn cần cùng một thông tin - tên của chế độ và thư viện thực hiện nó (Emacs sẽ cho bạn biết nếu bạn hỏi về chế độ) - nhưng bạn có thể gói tất cả thành một dạng duy nhất:

 (require 'delight)
 (delight '((some-mode nil "some-library")
            (some-other-mode nil "some-other-library")))

(Hoặc theo liên kết ở trên để biết một số ví dụ sử dụng thực tế.)

Tôi khuyên bạn nên thực hiện phương pháp này, bởi vì ngay cả khi bạn không muốn hầu hết văn bản nhẹ hơn ở chế độ nhỏ, vẫn có khả năng bạn sẽ thấy một số trong số chúng hữu ích (và bạn vẫn có thể sửa đổi những cái đó ngắn hơn).

Nếu bạn thực sự muốn loại bỏ tất cả văn bản nhẹ hơn ở chế độ nhỏ (và một lần nữa, tôi không khuyến nghị điều đó), bạn có thể sửa đổi mode-line-modesbiến. Các biến dòng chế độ đã thay đổi một lúc trước, vì vậy bạn có thể muốn sử dụng M-x find-variable RET mode-line-modes RETvà sau đó điều chỉnh thủ công định nghĩa mặc định của mình, chỉnh sửa phần liên quan minor-modes-alist.

Tất nhiên sau đó bạn cần duy trì nó, điều này không quá chớp nhoáng, vì vậy bạn có thể muốn thay thế minor-mode-alistbiểu tượng trong giá trị hiện có. Phần sau đây có phần cụ thể về triển khai, nhưng chắc chắn đẹp hơn cài đặt mode-line-modestoàn bộ và bạn có thể bật và tắt.

(define-minor-mode minor-mode-blackout-mode
  "Hides minor modes from the mode line."
  t)

(catch 'done
  (mapc (lambda (x)
          (when (and (consp x)
                     (equal (cadr x) '("" minor-mode-alist)))
            (let ((original (copy-sequence x)))
              (setcar x 'minor-mode-blackout-mode)
              (setcdr x (list "" original)))
            (throw 'done t)))
        mode-line-modes))

(global-set-key (kbd "C-c m") 'minor-mode-blackout-mode)

Chà, thật buồn khi không có gói 'thỏa thích'.
Mark Karpov

2
Gì với Emacs là cũ và package.el là mới, có một đống các thư viện hữu ích mà không có các gói. Nếu bạn định giới hạn bản thân theo cách đó, tôi khuyên bạn nên xem el-get sẽ đóng vai trò là người quản lý (bao gồm cập nhật) cho nhiều loại nguồn thư viện khác.
phils

1
@Drew, tôi biết về load-pathrequire. Tôi đã từng 'cài đặt' tất cả các gói Emac theo cách này khi tôi bắt đầu sử dụng nó một năm trước.
Mark Karpov

3
Tôi vừa mới thêm delightvào MELPA.
sanityinc

1
nb delightđang ở GNU ELPA những ngày này, và không phải trong MELPA (được đề cập trong trường hợp bất kỳ ai bị nhầm lẫn bởi các bình luận trước đó).
phils

8

Sử dụng Đa số thiểu số với cấu hình:

(require 'rich-minority)
(rich-minority-mode 1)
(setf rm-blacklist "")

Tôi cũng có suy nghĩ như bạn, nhưng tôi rút ngắn dòng chế độ hoang tưởng hơn :

  • Xóa tất cả các không gian không mong muốn
  • Xóa tất cả khoảng trắng và "chiều rộng tối thiểu" của trường thông tin vị trí bộ đệm.
;; Remove all unwanted spaces
(setq-default mode-line-format
          '("%e" mode-line-front-space mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-buffer-identification mode-line-position
        (vc-mode vc-mode) " "
        mode-line-modes mode-line-misc-info mode-line-end-spaces))
;; Remove all spaces and "min-width" of position info on mode-line
(setq mode-line-position
      `((1 ,(propertize
         " %p"
         'local-map mode-line-column-line-number-mode-map
         'mouse-face 'mode-line-highlight
         ;; XXX needs better description
         'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu"))
    (size-indication-mode
     (2 ,(propertize
          "/%I"
          'local-map mode-line-column-line-number-mode-map
          'mouse-face 'mode-line-highlight
          ;; XXX needs better description
          'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu")))
    (line-number-mode
     ((column-number-mode
       (1 ,(propertize
        "(%l,%c)"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line number and Column number\n\
mouse-1: Display Line and Column Mode Menu"))
       (1 ,(propertize
        "L%l"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line Number\n\
mouse-1: Display Line and Column Mode Menu"))))
     ((column-number-mode
       (1 ,(propertize
        "C%c"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Column number\n\
mouse-1: Display Line and Column Mode Menu"))))))
      )

Bây giờ, tôi luôn có thể thấy thông báo chế độ Twitter và bộ hẹn giờ của chế độ Org: D


5

Đây là những gì làm việc cho tôi:

(defvar hidden-minor-modes ; example, write your own list of hidden
  '(abbrev-mode            ; minor modes
    auto-fill-function
    flycheck-mode
    flyspell-mode
    inf-haskell-mode
    haskell-indent-mode
    haskell-doc-mode
    smooth-scroll-mode))

(defun purge-minor-modes ()
  (interactive)
  (dolist (x hidden-minor-modes nil)
    (let ((trg (cdr (assoc x minor-mode-alist))))
      (when trg
        (setcar trg "")))))

(add-hook 'after-change-major-mode-hook 'purge-minor-modes)

Nhờ nhận xét của Drew , tôi đã cải thiện nhận thức về giải pháp này. Bây giờ nó sử dụng lợi ích của danh sách liên kết và sẽ hiệu quả hơn một chút ;-)


FWIW, nó sẽ không bắt được các chế độ nhỏ đã được tải trước đó được bật thủ công, cũng không phải các chế độ tự động cập nhật văn bản nhẹ hơn của chúng (không phải các thư viện khác cũng thực hiện sau). Nhưng nếu không, nó có vẻ là một cách tiếp cận hợp lý thực tế.
phils

1
Mục đích của minor-mode-alistlà một alist là mục có thể được thêm vào và lấy ra ở phần đầu để shadow và các mục unshadow tiếp tục xuống danh sách đó có chìa khóa tương tự. Nếu bạn muốn thực hiện loại việc bạn đang làm, chỉ cần thay đổi mục nhập đầu tiên (tìm thấy bằng cách sử dụng assoc, thay đổi bằng cách sử dụng, setcarv.v.) cho mỗi khóa, để bạn không mất tính năng dự định, hữu ích này.
vẽ

@Drew, Bạn nói đúng, hãy xem giải pháp cải thiện của tôi.
Mark Karpov

Yup; đó là những gì tôi muốn nói
vẽ

3

Tôi cũng sẽ ném giải pháp của mình vào vòng này:

(defun modeline-set-lighter (minor-mode lighter)
  (when (assq minor-mode minor-mode-alist)
    (setcar (cdr (assq minor-mode minor-mode-alist)) lighter)))

(defun modeline-remove-lighter (minor-mode)
  (modeline-set-lighter minor-mode ""))

modeline-set-lightercho phép bạn đặt bật lửa của chế độ nhỏ thành bất kỳ chuỗi nào bạn muốn. modeline-remove-lightercho phép bạn loại bỏ hoàn toàn bật lửa của chế độ nhỏ.

Sau đó, ở phần cuối của tệp init tôi chỉ gọi các hàm này cho các chế độ nhỏ có bật lửa tôi muốn sửa đổi:

(modeline-remove-lighter 'auto-complete-mode)
(modeline-remove-lighter 'git-gutter+-mode)
(modeline-remove-lighter 'guide-key-mode)
(modeline-remove-lighter 'whitespace-mode)
(modeline-set-lighter 'abbrev-mode " Abbr")
(modeline-set-lighter 'auto-fill-function (string 32 #x23ce))

2

Bạn cũng có thể xóa thẳng tất cả các chế độ nhỏ, theo cách sau:

(setq mode-line-modes
      (mapcar (lambda (elem)
                (pcase elem
                  (`(:propertize (,_ minor-mode-alist . ,_) . ,_)
                   "")
                  (t elem)))
              mode-line-modes))

Điều này cũng sẽ hoạt động cho các chế độ nhỏ được xác định trong tương lai, vì nó chỉ loại bỏ hoàn toàn việc sử dụng minor-mode-alisttừ mode-line-format.


1

Đáng chú ý là use-package hỗ trợ giảm dần và vui thích . Nếu bạn sử dụng nó để quản lý các gói của mình, bạn có thể ẩn các chế độ nhỏ trong dòng chế độ thêm các từ khóa: giảm dần hoặc: thỏa thích.

(use-package abbrev
  :diminish abbrev-mode
  :config
  (if (file-exists-p abbrev-file-name)
     (quietly-read-abbrev-file)))

0

Tôi không thấy điểm cài đặt các tiện ích mở rộng có tên ưa thích cho một cái gì đó đơn giản như:

(setcar (alist-get minor-mode minor-mode-alist) "")

Ví dụ:

(dolist (mode '(projectile-mode
                whitespace-mode
                hs-minor-mode
                outline-minor-mode
                auto-fill-function))
  (setcar (alist-get mode minor-mode-alist) ""))

Bạn có thể làm bất kỳ loại công cụ theo cách này. Thay thế văn bản là rõ ràng từ trên. Ngoài ra, ví dụ, để đặt chế độ flymake ở đầu danh sách:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
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.