From 194ead37193a134040ac3f907199cbae2057efbb Mon Sep 17 00:00:00 2001 From: Hugo Heagren Date: Sat, 1 Apr 2023 22:27:25 +0100 Subject: [PATCH] Support right-align in mode-line * lisp/bindings.el (mode-line-format-right-align): New function. If the symbol `mode-line-format-right-align' appears in `mode-line-format', then return return a padding string which aligns everything after that symbol to the right. Padding width is altered with the display property. (mode-line-format-right-align): New variable. Convenience definition for including right alignment in `mode-line-format'. --- lisp/bindings.el | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lisp/bindings.el b/lisp/bindings.el index 34aa8399a96..95a063fbbaf 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -304,6 +304,35 @@ mode-line-process ;;;###autoload (put 'mode-line-process 'risky-local-variable t) +(defun mode-line-format-right-align () + "Right-align all following mode-line constructs. + +When the symbol `mode-line-format-right-align' appears in +`mode-line-format', return a string of one space, with a display +property to make it appear long enough to align anything after +that symbol to the right of the rendered modeline. + +It is important that the symbol `mode-line-format-right-align' be +included in `mode-line-format' (and not another similar construct +such as `(:eval (mode-line-format-right-align)'). This is because +`mode-line-format-right-align' is processed by `format-mode-line' +as a variable." + (let* ((rest (cdr (memq 'mode-line-format-right-align + mode-line-format))) + (rest-str (format-mode-line rest)) + (rest-width (string-pixel-width rest-str))) + (propertize " " 'display + ;; The `right' spec doesn't work on TTY frames + ;; when windows are split horizontally (bug#59620) + (if (window-system) + `(space :align-to (- right-fringe (,rest-width))) + `(space :align-to (,(- (window-pixel-width) rest-width))))))) + +(defvar mode-line-format-right-align '(:eval (mode-line-format-right-align)) + "Mode line construct to right align all following constructs.") +;;;###autoload +(put 'mode-line-format-right-align 'risky-local-variable t) + (defun bindings--define-key (map key item) "Define KEY in keymap MAP according to ITEM from a menu. This is like `define-key', but it takes the definition from the -- 2.20.1