モードラインでマイナーモードのリストを非表示にする


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
リッチマイノリティモードを調べることもできます。
カウ

回答:


15

ディミニッシュモード(Melpaで利用可能)がこれを行います。

(diminish 'projectile-mode)

2
マイナーモードの名前を完全に非表示にするのではなく、単に短縮したい場合は、次のコマンドを使用できます(diminish 'projectile-mode "p")
erikstokes 14年

5
diminish の実際の使用法は(eval-after-load "filladapt" '(diminish 'filladapt-mode))(Emacs Wikiの例を使用)であり(diminish 'filladapt-mode)、答えで示唆されているだけではないことにも注意してください。モードがすでにロードされていることが保証されている場合にのみ、ショートバージョンを使用できます。
フィルス14年

15

mborkがコメントしたように、delight.elを使用して、モード行のマイナー(およびメジャー)モードテキストを選択的に変更または無効にすることができます。

利点の1つは、eval-after-load(ほとんどのユースケースでdiminish.elを使用して手動で記述する必要がある)の面倒を見ることです。これにより、構成がよりクリーンになります。まだ同じ情報が必要です-モードの名前と、それを実装するライブラリ(モードについて尋ねるとEmacsから通知されます)-を1つの形式にまとめることができます:

 (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 RETため、デフォルトの定義を使用してから手動で調整し、についてのセクションを編集することもできますminor-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)

さて、「楽しい」パッケージがないのは悲しいことです。
マークカルポフ14年

2
Emacsが古く、package.elが新しければ、パッケージを持たない便利なライブラリがほどあります。そのように制限する場合は、他のさまざまなライブラリソースタイプのマネージャー(更新を含む)として機能するel-getを検討することをお勧めします。
フィル14年

1
@ドリュー、私は知っているload-pathrequire。1年前にすべてのEmacsパッケージを使い始めたとき、この方法で「インストール」していました。
マークカルポフ14年

3
delightMELPAに追加しました。
sanityinc 14年

1
nb delightは最近、GEL ELPAにあり、MELPAにはありません(以前のコメントで誰かが混乱した場合に言及されています)。
phils 16

8

configでリッチマイノリティを使用します。

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

今、私は常にTwitteringモード通知とOrgモードのタイマーを見ることができます: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、以前にアンロードされた手動で有効にされたマイナーモードや、明るいテキストを動的に更新するモード(他のライブラリが後者を行うわけではありません)をキャッチしません。しかし、そうでなければ、合理的に実用的なアプローチのようです。
フィル14年

1
minor-mode-alistである連想リストは、エントリは、さらに、同じキーを持つドロップダウンリストのエントリを影とunshadowする先頭に追加および削除することができることです。あなたがやっていることをしたい場合は、この便利で意図した機能を失わないように、各キーの最初のエントリを変更します(使用してassoc、使用して変更setcarなど)。
ドリュー

@ドリュー、あなたは正しい、私の改善された私のソリューションを参照してください。
マークカルポフ14年

うん; それが私が意味したことです。
ドリュー

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-alistからとmode-line-format


1

use-package 減少と喜びサポートすること注目に値します。パッケージを管理するために使用する場合は、モード行でマイナーモードを非表示にして、:diminishまたは:delightキーワードを追加できます。

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