ซ่อนรายการโหมดย่อยในโหมดบรรทัด


22

ฉันใช้โหมดรองค่อนข้างน้อยและปกติฉันรู้ว่าโหมดรองเปิดใช้งานในโหมดหลักทุกโหมด C-h v minor-mode-listถ้าผมอยากจะดูรายการเต็มรูปแบบฉันสามารถเรียกใช้

ในขณะเดียวกันบรรทัดโหมดของฉันจะถูกอุดตันจริงๆดังนั้นเมื่อฉันแยกเฟรมในแนวตั้งบางครั้งฉันไม่สามารถอ่านจุดสิ้นสุดของโหมดบรรทัดได้

คำถามที่เกิดขึ้นจริง: วิธีการปิดการแสดงรายการโหมดย่อยในบรรทัดโหมด? ตัวอย่างเช่นตอนนี้อาจมีลักษณะเช่นนี้:

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

ฉันต้องการให้กระชับยิ่งขึ้น:

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


2
คุณยังสามารถดูในโหมดrich-ชนกลุ่มน้อย
Kaushal Modi

คำตอบ:


15

โหมด Diminish (มีให้ใน Melpa) จะทำเช่นนี้

(diminish 'projectile-mode)

2
หากคุณต้องการย่อชื่อโหมดย่อยให้สั้นลงแทนที่จะซ่อนไว้ทั้งหมดคุณสามารถใช้ได้(diminish 'projectile-mode "p")
erikstokes

5
โปรดทราบว่าการใช้งานจริงของการลดน้อยลงคือ(eval-after-load "filladapt" '(diminish 'filladapt-mode))(ใช้ตัวอย่างจาก Emacs Wiki) และไม่ใช่เพียงแค่(diminish 'filladapt-mode)คำแนะนำ คุณสามารถเพียงใช้เวอร์ชั่นสั้นถ้าอยู่ในโหมดรับประกันได้ว่าจะแล้วจะโหลด
Phils

15

ตามที่ mbork แสดงความคิดเห็นคุณสามารถใช้delight.elเพื่อเลือกแก้ไขหรือปิดใช้งานข้อความโหมดรอง (และที่สำคัญที่สุด) ในบรรทัดโหมด

ข้อดีอย่างหนึ่งคือมันดูแลeval-after-load(ซึ่งคุณจำเป็นต้องเขียนด้วยตนเองด้วย diminish.el ในการใช้งานส่วนใหญ่กรณี) ซึ่งทำให้การกำหนดค่าทำความสะอาด คุณยังต้องการข้อมูลเดียวกัน - ชื่อของโหมดและไลบรารีที่ใช้งาน (ซึ่ง Emacs จะบอกคุณว่าคุณถามเกี่ยวกับโหมด) - แต่คุณสามารถห่อมันทั้งหมดในรูปแบบเดียว:

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

(หรือไปตามลิงก์ด้านบนเพื่อดูตัวอย่างการใช้งานจริง)

ฉันขอแนะนำให้ใช้วิธีการนี้เนื่องจากแม้ว่าคุณไม่ต้องการข้อความที่เบากว่าโหมดรองส่วนใหญ่แต่ก็มีโอกาสดีที่คุณจะพบว่ามีประโยชน์บางส่วน (และคุณยังสามารถปรับเปลี่ยนข้อความให้สั้นลงได้)

หากคุณต้องการกำจัดข้อความที่จางกว่าโหมดรองทั้งหมด (และอีกครั้งฉันไม่แนะนำ) คุณสามารถแก้ไขmode-line-modesตัวแปรได้ ตัวแปรบรรทัดโหมดการเปลี่ยนแปลงในขณะที่กลับดังนั้นคุณอาจต้องการที่จะใช้แล้วด้วยตนเองปรับตัวเข้ากับความหมายของคุณเริ่มต้นการแก้ไขจากส่วนที่เกี่ยวข้องกับM-x find-variable RET mode-line-modes RETminor-modes-alist

แน่นอนว่าคุณต้องบำรุงรักษาซึ่งไม่กระพริบดังนั้นคุณอาจต้องการแทนที่minor-mode-alistสัญลักษณ์ภายในค่าที่มีอยู่ ต่อไปนี้เป็นการใช้งานที่เฉพาะเจาะจง แต่ค่อนข้างดีกว่าการตั้งค่าmode-line-modesทั้งหมดและคุณสามารถสลับเปิดและปิด

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

มันเป็นเรื่องน่าเศร้าที่ไม่มีแพ็คเกจ 'ความสุข'
Mark Karpov

2
อะไรกับ Emacs ที่เก่าและ package.el เป็นของใหม่มีกองห้องสมุดที่มีประโยชน์ซึ่งไม่มีแพ็คเกจ หากคุณกำลังจะ จำกัด ตัวเองด้วยวิธีนี้ฉันขอแนะนำให้ดูที่el-getซึ่งจะทำหน้าที่เป็นผู้จัดการ (รวมอยู่ในการอัปเดต) สำหรับประเภทแหล่งไลบรารีอื่น ๆ อีกมากมาย
Phils

1
@Drew ฉันรู้เกี่ยวกับและload-path requireฉันเคย 'ติดตั้ง' แพ็คเกจ Emacs ทั้งหมดด้วยวิธีนี้เมื่อฉันเริ่มใช้มันเมื่อปีที่แล้ว
Mark Karpov

3
ฉันเพิ่งเพิ่มdelightไปยัง MELPA
sanityinc

1
nb delightอยู่ใน GNU ELPA วันนี้และไม่ได้อยู่ใน MELPA (กล่าวถึงในกรณีที่ทุกคนสับสนกับความคิดเห็นก่อนหน้านี้)
phils

8

ใช้Rich-ชนกลุ่มน้อยกับการกำหนดค่า:

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

ฉันมีความคิดเหมือนคุณ แต่ฉันทำให้โหมดหวาดระแวงสั้นลง:

  • ลบช่องว่างที่ไม่ต้องการทั้งหมด
  • ลบช่องว่างทั้งหมดและ "ความกว้างขั้นต่ำ" ของฟิลด์ข้อมูลตำแหน่งบัฟเฟอร์
;; 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"))))))
      )

ตอนนี้ฉันสามารถเห็นการแจ้งเตือนในโหมด Twitter และตัวจับเวลาของ Org-mode: D


5

นี่คือสิ่งที่ทำงานให้ฉัน:

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

ขอบคุณที่ความคิดเห็นของ Drewฉันได้ปรับปรุงการใช้งานโซลูชันนี้ให้ดีขึ้น ตอนนี้มันใช้ประโยชน์จากรายการการเชื่อมโยงและควรมีประสิทธิภาพมากขึ้นเล็กน้อย ;-)


FWIW มันจะไม่จับโหมดรองที่ไม่ได้โหลดก่อนหน้านี้ซึ่งเปิดใช้งานด้วยตนเองหรือโหมดที่อัปเดตข้อความที่มีน้ำหนักเบาของพวกเขาแบบไดนามิก แต่อย่างอื่นดูเหมือนว่าวิธีการปฏิบัติที่สมเหตุสมผล
Phils

1
จุดของminor-mode-alistการเป็นalistคือรายการที่สามารถเพิ่มและลบที่ส่วนหัวเพื่อเงาและ unshadow รายการเพิ่มเติมลงในรายการที่มีคีย์เดียวกัน หากคุณต้องการทำสิ่งที่คุณกำลังทำเพียงเปลี่ยนรายการแรก (พบว่าใช้assocเปลี่ยนโดยใช้setcarฯลฯ ) สำหรับแต่ละคีย์เพื่อให้คุณไม่สูญเสียคุณลักษณะที่มีประโยชน์และมีประโยชน์นี้
Drew

@ ดึงคุณถูกต้องดูการปรับปรุงโซลูชันของฉัน
Mark Karpov

ได้; นั่นคือสิ่งที่ฉันหมายถึง.
Drew

3

ฉันจะโยนคำตอบของฉันลงในวงแหวนด้วย:

(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-lighterช่วยให้คุณตั้งค่าโหมดเบาของโหมดรองเป็นสตริงที่คุณต้องการ modeline-remove-lighterช่วยให้คุณลบความจางของโหมดรองได้อย่างสมบูรณ์

จากนั้นในตอนท้ายของไฟล์ init ของฉันฉันเพิ่งเรียกใช้ฟังก์ชั่นเหล่านี้สำหรับโหมดรองที่มีไฟแช็คที่ฉันต้องการแก้ไข:

(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

นอกจากนี้คุณยังสามารถลบโหมดรองทั้งหมดโดยวิธีต่อไปนี้:

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

นอกจากนี้ยังจะทำงานสำหรับโหมดเล็ก ๆ น้อย ๆ ที่กำหนดไว้ในอนาคตเพราะมันเป็นเพียงแค่สมบูรณ์เอาการใช้งานจากminor-mode-alistmode-line-format


1

มันน่าสังเกตว่าการสนับสนุนลดลงและความสุขuse-package หากคุณใช้มันเพื่อจัดการแพ็คเกจของคุณคุณสามารถซ่อนโหมดย่อยในบรรทัดโหมดโดยเพิ่ม: ลดระดับหรือ: เพิ่มความสุขให้กับคำค้นหา

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

0

ฉันไม่เห็นจุดของการติดตั้งส่วนขยายที่มีชื่อแฟนซีสำหรับสิ่งที่ง่ายเหมือน:

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

ตัวอย่างเช่น:

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

คุณสามารถทำสิ่งต่าง ๆ ด้วยวิธีนี้ การแทนที่ข้อความนั้นชัดเจนจากด้านบน ตัวอย่างเช่นหากต้องการวางโหมด flymake ที่จุดเริ่มต้นของรายการ:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.