From 7e65998adaea1c398813b7860b1da7423d4d34ae Mon Sep 17 00:00:00 2001 From: Stephen Berman Date: Wed, 17 Apr 2024 19:33:24 +0200 Subject: [PATCH] Allow tabbing between widgets to skip inactive widgets (bug#70413) * doc/misc/widget.texi (Widgets and the Buffer, Customization): Document it. * etc/NEWS: Announce it. * lisp/wid-edit.el (widget-skip-inactive): New user option. (widget-tabable-at): Use it. (cherry picked from commit 91333dacfa1b9f1041ceeebb3d46e8e04048c4c9) --- doc/misc/widget.texi | 14 ++++++++++++++ etc/NEWS | 7 +++++++ lisp/wid-edit.el | 13 +++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/doc/misc/widget.texi b/doc/misc/widget.texi index cfb9d2211cf..f74605c92c0 100644 --- a/doc/misc/widget.texi +++ b/doc/misc/widget.texi @@ -795,6 +795,11 @@ Move point @var{count} buttons or editing fields backward. @end deffn @end table +@noindent +By default, tabbing can put point on an inactive widget. To skip over +inactive widgets when tabbing, set the user option +@code{widget-skip-inactive} to a non-@code{nil} value. +@xref{Customization}. When editing an @code{editable-field} widget, the following commands are available: @@ -3321,6 +3326,15 @@ If non-@code{nil}, toggle when there are just two options. By default, its value is @code{nil}. @end defopt +@defopt widget-skip-inactive +If non-@code{nil}, skip over inactive widgets when using @kbd{@key{TAB}} +(@code{widget-forward}) or @kbd{S-@key{TAB}} (@code{widget-backward}, +also bound to @kbd{M-@key{TAB}}) to navigate between widgets. + +By default, its value is @code{nil} and tabbing does not skip over +inactive widgets. +@end defopt + @defopt widget-documentation-links If non-@code{nil}, add hyperlinks to documentation strings. @end defopt diff --git a/etc/NEWS b/etc/NEWS index 5ff82c99a52..d88314ddd3f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1701,6 +1701,13 @@ This allows disabling JavaScript in xwidget Webkit sessions. 'insert-directory', now supports the '--time=TIME' and '--sort=time' options of GNU 'ls'. +** Widget + ++++ +*** New user option 'widget-skip-inactive'. +If non-nil, moving point forward or backward between widgets by typing +TAB or S-TAB skips over inactive widgets. The default value is nil. + * New Modes and Packages in Emacs 30.1 diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index 4bc1ebc406a..cb6d8ebc2c4 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -1234,11 +1234,20 @@ If nothing was called, return non-nil." (when (commandp command) (call-interactively command)))))) +(defcustom widget-skip-inactive nil + "If non-nil, skip inactive widgets when tabbing through buffer." + :version "30.1" + :group 'widgets + :type 'boolean) + (defun widget-tabable-at (&optional pos) "Return the tabable widget at POS, or nil. -POS defaults to the value of (point)." +POS defaults to the value of (point). If user option +`widget-skip-inactive' is non-nil, inactive widgets are not tabable." (let ((widget (widget-at pos))) - (if widget + (if (and widget (if widget-skip-inactive + (widget-apply widget :active) + t)) (let ((order (widget-get widget :tab-order))) (if order (if (>= order 0) -- 2.39.5