モードラインでいくつかのアイテムを右揃えする方法は?


9

次のモードライン構成があるとします。

(setq-default mode-line-format
   (list
    ;; Current buffer name
    "%b "
    ;; Major mode
    "[%m] "
    ;; Modified status
    "[%*] "
    ;; Cursor position
    "Line: %l/%i Column: %c"))

最後のアイテムを右揃えで表示してください。


1
ここでは、関連するスレッドへのリンクです: stackoverflow.com/q/16775855/2112489
lawlist

1
あなたが特定のために尋ねたので、mode-line-formatこれは適切な答えではありませんが、smart-mode-line右揃えmode-line-misc-info、デフォルトでは、それが設定することで、マイナーモードの一覧を右揃えることができますsml/mode-width'right
Malabarba 14

回答:


11

コメントの回答と同様に、適切な間隔の文字列を返すコードを記述することで、自分でこれを行うことができます。

これは、仕様に適用される左揃えと右揃えのテキストのみをサポートする簡単な方法です。

;; write a function to do the spacing
(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT
 aligned respectively."
  (let* ((available-width (- (window-width) (length left) 2)))
    (format (format " %%s %%%ds " available-width) left right)))


;; use the function in conjunction with :eval and format-mode-line in your mode-line-format
(setq mode-line-format
      '((:eval (simple-mode-line-render
                ;; left
                (format-mode-line "%b [%m] [%*]")
                ;; right
                (format-mode-line "Line: %l/%i Column: %c")))))

最終的には次のようになります。 ここに画像の説明を入力してください

また、指定したとおりにモードライン形式の引数を使用しましたが、%iを誤って使用しているため、行数ではなく、バッファのバイトサイズが出力されることに注意してください。(line-number-at-pos (point-max))バッファの行数を取得するようなものを使用できます。


1つの追加- window-total-widthリナムとフリンジの追加のパディングも計算するために使用する必要があります。
サンドリック

この回答には、返されたモードラインが再びモードラインとして評価されるというバグがあります。意味のある%文字は2度フォーマットされます。私の答え、emacs.stackexchange.com / a / 37270/2418 でもこれを説明しています-使用しますwindow-total-width(ありがとう!)
ideasman42

この回答のバグを解決しました:emacs.stackexchange.com/a/372​​70/2418
ideasman42

2

@ jordon-biondoの回答を拡張し、表示されているバグを解決する%

この例は、モードモードの行変数を整列でどのように使用できるかを示しています。

(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT aligned respectively."
  (let* ((available-width (- (window-total-width) (+ (length (format-mode-line left)) (length (format-mode-line right))))))
    (append left (list (format (format "%%%ds" available-width) "")) right)
    )
  )

(setq-default
  mode-line-format
  '
  (
    (:eval
      (simple-mode-line-render
        ;; left
        (quote ("%e " mode-line-buffer-identification " %l : %c" evil-mode-line-tag "[%*]"))
        ;; right
        (quote ("%p " mode-line-frame-identification mode-line-modes mode-line-misc-info))
        )
      )
    )
  )
)

出力例:

init.el 1 : 0 <N> [-] Top -F1 (Emacs-Lisp WK ivy drag AC GitGutter)


0

これはそのままではサポートされていませんが、smart-mode-lineパッケージではサポートされています。そのパッケージを使用するか、必要以上の機能がある場合は、必要な機能を実装するビットのみを抽出します。


opがフォローアップしなかったので、@ Malabarbaのコメントを回答に変えました。このように、質問は「未回答」ではなく、このパッケージは、同じ質問を持つ他のユーザーが使用したいと思うものである可能性があります。
tarsius 2015年

それが結局私がやったことであり、関連する機能を抽出smart-mode-lineして私のdotemacsに追加しました。どれだけ右にスペースを確保したいかを考える必要がありますが、何もないよりはましです。手動でcharを数える方法を取り除く方法を誰かが投稿しない限り、私は答えを受け入れません。
mkaito

0

単純な代替案がある場合、整列のためだけに左と右を完全に評価することは少し重いので、「正しい」左/右整列を実行して別の方法を追加することは可能ですが。

右側に一定量のスペースしか必要ないことがわかっている場合は、N文字を除くすべてを入力できます。これは、適切なサイズが固定長である限り機能します。

文字列のフォーマット%12sなどを使用して、文字列のサイズが変更されないようにすることができます。

(defun mode-line-fill (face reserve)
  "Return empty space using FACE and leaving RESERVE space on the right."
  (when
    (and window-system (eq 'right (get-scroll-bar-mode)))
    (setq reserve (- reserve 3)))
  (propertize " "
    'display
    `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))
    'face face
    )
  )

(setq-default
  mode-line-format
  (list
    ;; left align
    "%e %b [%*]"
    ;; right align
    (mode-line-fill 'mode-line 18)
    "%6l, %4c, %8p"
    )
  )
)

例えば:

CMakeLists.txt [-] 1590, 0, 94%

これは、この例のように、行/列/パーセントのように、右側にいくつかの項目を表示する場合にのみ機能することに注意してください。たとえば、すべてのマイナーモードを表示すると、うまく機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.