Subject: Re: bug#25308: Shorten long "ui-lines" in Custom buffers

From: Stefan Kangas <[email-masked]>
Date: Sun, 03 Nov 2019 14:13:05 +0100

Eli Zaretskii <[email-masked]> writes:

>> From: Jonas Bernoulli <[email-masked]>
>> Date: Sat, 31 Dec 2016 14:26:06 +0100
>> 
>> Custom buffers contain two long lines, the first separating the initial
>> buttons from the options shown below, and the second is for symmetry, I
>> suppose.  This is implemented in `custom-group-value-create'.
>> 
>> These lines are 999 characters long.  When point ends up on the "line
>> line", then it ends up at the *end* of that line, scrolling all content
>> except for the line itself off-window.  This happens both with C-n/C-p,
>> as well as when using the mouse scroll wheel.
>
> The scrolling only happens for me if I set truncate-lines to a non-nil
> value.  Is that what you see?  Or perhaps you invoke Customize in a
> partial-width window, in which case truncate-partial-width-windows is
> non-nil by default?
>
> If lines are not truncated, there's no horizontal scrolling.

I see the same thing here.

>> If that is considered to be too ugly, then I would suggest setting the
>> `:align-to' to be just long enough to reach the edge of the window (but
>> never longer) at the time `custom-group-value-create' is called, using
>> something like:
>> 
>> (list 'space :align-to
>>       `(+ (0 . right)
>>           ,(min (window-hscroll)
>>                 (- (line-end-position)
>>                    (line-beginning-position)))))
>
> Does this really work when a window has its lines truncated?

Yes, it works on both text based and graphical displays.  Please see
the attached patch.

Lars suggested to remove the lines entirely, but I think I prefer to
not change that for now.  Perhaps it would make more sense as part of
a bigger overhaul of the look and feel of customize.

Any comments?

Best regards,
Stefan Kangas

>From 432de377610215219ad9c61ad63950fd914eb883 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <[email-masked]>
Date: Sun, 3 Nov 2019 14:07:37 +0100
Subject: [PATCH] Handle truncate-lines in customize-group

* lisp/cus-edit.el (custom-group--draw-horizontal-line): New
function to draw horizontal lines which handles a non-nil value of
'truncate-lines'.  (Bug#25308)
(custom-group-value-create): Use it.

Co-authored-by: Jonas Bernoulli <[email-masked]>
---
 lisp/cus-edit.el | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index b9fd3e0a2d..081d4c9213 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -4062,6 +4062,22 @@ custom-group-members
 	  (push entry members)))
       (nreverse members))))
 
+(defun custom-group--draw-horizontal-line ()
+  "Draw a horizontal line at point.
+This works for both graphical and text displays."
+  (let ((p (point)))
+    (insert "\n")
+    (put-text-property p (1+ p) 'face '(:underline t))
+    (overlay-put (make-overlay p (1+ p))
+		 'before-string
+		 (propertize "\n" 'face '(:underline t)
+		             'display
+                             (list 'space :align-to
+                                   `(+ (0 . right)
+                                       ,(min (window-hscroll)
+                                             (- (line-end-position)
+                                                (line-beginning-position)))))))))
+
 (defun custom-group-value-create (widget)
   "Insert a customize group for WIDGET in the current buffer."
   (unless (eq (widget-get widget :custom-state) 'hidden)
@@ -4188,15 +4204,7 @@ custom-group-value-create
 
 	  ;; Nested style.
 	  (t				;Visible.
-	   ;; Draw a horizontal line (this works for both graphical
-	   ;; and text displays):
-	   (let ((p (point)))
-	     (insert "\n")
-	     (put-text-property p (1+ p) 'face '(:underline t))
-	     (overlay-put (make-overlay p (1+ p))
-			  'before-string
-			  (propertize "\n" 'face '(:underline t)
-				      'display '(space :align-to 999))))
+           (custom-group--draw-horizontal-line)
 
 	   ;; Add parent groups references above the group.
 	   (when (eq level 1)
@@ -4287,13 +4295,7 @@ custom-group-value-create
 	     (widget-put widget :children children)
 	     (custom-group-state-update widget))
 	   ;; End line
-	   (let ((p (1+ (point))))
-	     (insert "\n\n")
-	     (put-text-property p (1+ p) 'face '(:underline t))
-	     (overlay-put (make-overlay p (1+ p))
-			  'before-string
-			  (propertize "\n" 'face '(:underline t)
-				      'display '(space :align-to 999))))))))
+           (custom-group--draw-horizontal-line)))))
 
 (defvar custom-group-menu
   `(("Set for Current Session" custom-group-set
-- 
2.20.1