Hi, Arsen Arsenović writes: > I've just dug through the Elisp manual a little and I think (elisp) > Specified Space is precisely what's needed here. I've tried the > following: > > modified lisp/ruler-mode.el > @@ -632,12 +632,7 @@ ruler-mode-ruler > (let* ((w (ruler-mode-text-scaled-window-width)) > (m (window-margins)) > (f (window-fringes)) > - (i (if display-line-numbers > - ;; FIXME: ruler-mode relies on I being an integer, so > - ;; the column numbers might be slightly off if the > - ;; line-number face is customized. > - (round (line-number-display-width 'columns)) > - 0)) > + (i 0) > (j (ruler-mode-text-scaled-window-hscroll)) > ;; Setup the scrollbar, fringes, and margins areas. > (lf (ruler-mode-space > @@ -739,7 +734,13 @@ ruler-mode-ruler > (setq i (1+ i) > j (1+ j))) > > - (let ((ruler-str (concat ruler)) > + (let ((ruler-indent > + (if (not display-line-numbers) > + "" > + (propertize " " 'display > + `(space :width > + (,(- (line-number-display-width t) 1)))))) > + (ruler-str (concat ruler)) > (len (length ruler))) > (add-text-properties 0 len ruler-wide-props ruler-str) > (dolist (p (nreverse props)) > @@ -747,13 +748,14 @@ ruler-mode-ruler > > ;; Return the ruler propertized string. Using list here, > ;; instead of concat visually separate the different areas. > - (if (nth 2 (window-fringes)) > - ;; fringes outside margins. > - (list "" (and (eq 'left sbvt) sb) lf lm > - ruler-str rm rf (and (eq 'right sbvt) sb)) > - ;; fringes inside margins. > - (list "" (and (eq 'left sbvt) sb) lm lf > - ruler-str rf rm (and (eq 'right sbvt) sb)))))) > + (let ((ruler-str-ind (concat ruler-indent ruler-str))) > + (if (nth 2 (window-fringes)) > + ;; fringes outside margins. > + (list "" (and (eq 'left sbvt) sb) lf lm > + ruler-str-ind rm rf (and (eq 'right sbvt) sb)) > + ;; fringes inside margins. > + (list "" (and (eq 'left sbvt) sb) lm lf > + ruler-str-ind rf rm (and (eq 'right sbvt) sb))))))) > > (provide 'ruler-mode) > > This is almost perfect. The (- ... 1) in the :width pixel spec is > obviously a hack (and breaks this patch in emacs -nw). I have no idea > why an extra pixel is inserted in GUI mode. If you apply the above but > remove (- ... 1), you'll see the following: [...] I've refined the patch: diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el index 003dcae560f..64568e06cc9 100644 --- a/lisp/ruler-mode.el +++ b/lisp/ruler-mode.el @@ -632,12 +632,7 @@ ruler-mode-ruler (let* ((w (ruler-mode-text-scaled-window-width)) (m (window-margins)) (f (window-fringes)) - (i (if display-line-numbers - ;; FIXME: ruler-mode relies on I being an integer, so - ;; the column numbers might be slightly off if the - ;; line-number face is customized. - (round (line-number-display-width 'columns)) - 0)) + (i 0) (j (ruler-mode-text-scaled-window-hscroll)) ;; Setup the scrollbar, fringes, and margins areas. (lf (ruler-mode-space @@ -745,6 +740,12 @@ ruler-mode-ruler (dolist (p (nreverse props)) (add-text-properties (nth 0 p) (nth 1 p) (nthcdr 2 p) ruler-str)) + ;; Attach an alignment indent. + (if display-line-numbers + (setq ruler-str + (concat (ruler-mode-space `(,(line-number-display-width t))) + ruler-str))) + ;; Return the ruler propertized string. Using list here, ;; instead of concat visually separate the different areas. (if (nth 2 (window-fringes)) This works perfectly on PGTK (and with -nw) - that extra pixel I mentioned seems to be an artifact, or perhaps a bug, of the Lucid toolkit. What do you think of the above? Have a lovely day. -- Arsen Arsenović