Sembunyikan daftar mode minor dalam mode-line

22

Saya menggunakan beberapa mode minor dan biasanya saya tahu mode minor mana yang diaktifkan di setiap mode utama. Jika saya benar-benar ingin melihat daftar lengkapnya, saya bisa lari C-h v minor-mode-list.

Pada saat yang sama, garis mode saya menjadi sangat tersumbat, jadi ketika saya membagi bingkai secara vertikal, kadang-kadang saya tidak bisa membaca akhir dari garis mode.

Pertanyaan aktual: bagaimana cara menonaktifkan tampilan daftar mode minor di baris mode? Misalnya, sekarang mungkin terlihat seperti ini:

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

Saya ingin terlihat lebih ringkas:

-:--- main.c        All (7,12)     (C/l) [main] 16:19
Mark Karpov
sumber
2
Anda juga dapat melihat mode kaya-minoritas .
Kaushal Modi

Jawaban:

15

Mode redup (tersedia dalam Melpa) akan melakukan ini.

(diminish 'projectile-mode)
Colin Bell
sumber
2
Jika Anda hanya ingin mempersingkat nama mode minor alih-alih menyembunyikannya sepenuhnya dapat Anda gunakan(diminish 'projectile-mode "p")
erikstokes
5
Perhatikan juga bahwa penggunaan aktual diminish adalah (eval-after-load "filladapt" '(diminish 'filladapt-mode))(menggunakan contoh dari Wiki Emacs) dan tidak hanya (diminish 'filladapt-mode)seperti yang disarankan oleh jawabannya. Anda hanya dapat menggunakan versi singkat jika mode dijamin sudah dimuat.
phils
15

Sebagai mbork berkomentar, Anda dapat menggunakan delight.el untuk secara selektif memodifikasi atau menonaktifkan teks mode minor (dan memang utama) di baris mode.

Salah satu kelebihannya adalah bahwa hal itu membutuhkan perawatan eval-after-load(yang perlu Anda tulis secara manual dengan diminish.el dalam kebanyakan kasus penggunaan), yang menjadikan konfigurasi lebih bersih. Anda masih memerlukan informasi yang sama - nama mode, dan perpustakaan yang mengimplementasikannya (yang Emacs akan memberi tahu Anda jika Anda bertanya tentang mode) - tetapi Anda dapat membungkus semuanya menjadi satu bentuk:

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

(Atau ikuti tautan di atas untuk beberapa contoh penggunaan nyata.)

Saya akan merekomendasikan mengambil pendekatan ini, karena bahkan jika Anda tidak ingin teks ringan mode paling kecil, ada kemungkinan besar Anda akan menemukan beberapa dari mereka berguna (dan Anda masih dapat memodifikasi yang lebih pendek).

Jika Anda benar-benar ingin menghilangkan semua teks ringan mode minor (dan sekali lagi, saya tidak merekomendasikannya), Anda dapat memodifikasi mode-line-modesvariabel. Variabel baris mode berubah beberapa waktu lalu, jadi Anda mungkin ingin menggunakan M-x find-variable RET mode-line-modes RETdan kemudian secara manual menyesuaikan definisi default Anda, mengedit bagian yang terkait minor-modes-alist.

Tentu saja Anda harus mempertahankannya, yang tidak terlalu cepat, jadi Anda mungkin lebih suka mengganti minor-mode-alistsimbol di dalam nilai yang ada. Berikut ini agak spesifik implementasi, tetapi tentu saja lebih baik daripada pengaturan mode-line-modessecara keseluruhan, dan Anda dapat mengaktifkan dan menonaktifkannya.

(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)
phils
sumber
Yah, sangat menyedihkan bahwa tidak ada paket 'kesenangan'.
Mark Karpov
2
Apa dengan Emacs menjadi tua dan package.el yang baru, ada tumpukan perpustakaan yang berguna yang tidak memiliki paket. Jika Anda membatasi diri Anda seperti itu, saya sarankan melihat el-get yang akan bertindak sebagai manajer (termasuk pembaruan) untuk berbagai jenis sumber pustaka lainnya.
phils
1
@Drew, saya tahu tentang load-pathdan require. Saya dulu 'menginstal' semua paket Emacs dengan cara ini ketika saya mulai menggunakannya setahun yang lalu.
Mark Karpov
3
Saya baru saja menambahkan delightke MELPA.
sanityinc
1
nb delightada di GNU ELPA hari ini, dan tidak di MELPA (disebutkan kalau-kalau ada yang bingung dengan komentar sebelumnya).
phils
8

Gunakan Rich-minoritas dengan konfigurasi:

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

Saya juga memiliki pemikiran seperti Anda, tetapi saya mempersingkat garis mode lebih paranoid :

  • Hapus semua ruang yang tidak diinginkan
  • Hapus semua spasi dan "min-width" dari bidang info posisi buffer.
;; 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"))))))
      )

Sekarang, saya selalu dapat melihat pemberitahuan mode Twittering dan timer mode-Org: D

kuanyui
sumber
5

Inilah yang bekerja untuk saya:

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

Berkat komentar Drew , saya telah meningkatkan realisasi solusi ini. Sekarang menggunakan manfaat daftar asosiasi dan harus sedikit lebih efisien ;-)

Mark Karpov
sumber
FWIW, itu tidak akan menangkap mode minor yang sebelumnya tidak diturunkan yang diaktifkan secara manual, atau mode yang secara dinamis memperbarui teks mereka yang lebih ringan (bukan juga perpustakaan lain yang melakukan yang terakhir). Tetapi sebaliknya itu tampaknya pendekatan yang cukup praktis.
phils
1
Titik minor-mode-alistmenjadi alist adalah bahwa entri dapat ditambahkan dan dihapus di kepala bayangan dan entri unshadow lebih bawah daftar yang memiliki kunci yang sama. Jika Anda ingin melakukan hal-hal yang Anda lakukan, ubah saja entri pertama (ditemukan menggunakan assoc, ubah gunakan setcardll.) Untuk setiap tombol, sehingga Anda tidak kehilangan fitur bermanfaat yang dimaksudkan ini.
Drew
@Rew, Anda benar, lihat solusi saya ditingkatkan.
Mark Karpov
Ya; itu yang saya maksud.
Drew
3

Saya akan melemparkan solusi saya untuk ini ke atas ring juga:

(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-lightermemungkinkan Anda untuk mengatur pemantik dari mode minor ke string apa pun yang Anda suka. modeline-remove-lightermemungkinkan Anda untuk menghapus pemantik mode minor sepenuhnya.

Kemudian, pada akhir file init saya, saya hanya memanggil fungsi-fungsi ini untuk mode minor yang pemantiknya ingin saya ubah:

(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))
itu hanya
sumber
2

Anda juga dapat menghapus semua mode minor, dengan cara berikut:

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

Ini juga akan bekerja untuk mode minor yang didefinisikan di masa depan, karena hanya benar-benar menghapus penggunaan minor-mode-alistdari mode-line-format.

Stefan
sumber
1

Perlu dicatat bahwa use-package dukungan berkurang dan menyenangkan . Jika Anda menggunakannya untuk mengelola paket Anda, Anda dapat menyembunyikan mode minor di baris mode dengan menambahkan kata kunci: diminish atau: delight.

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

Saya tidak melihat titik menginstal ekstensi bernama mewah untuk sesuatu yang sederhana seperti:

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

Sebagai contoh:

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

Anda dapat melakukan segala hal dengan cara ini. Mengganti teks sudah jelas dari atas. Juga, misalnya, untuk menempatkan mode flymake di awal daftar:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
memeplex
sumber