From: Juri Linkov <juri@linkov.net>
To: Jonas Bernoulli <jonas@bernoul.li>
Cc: 69578@debbugs.gnu.org
Subject: bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful
Date: Mon, 11 Mar 2024 19:50:20 +0200 [thread overview]
Message-ID: <86h6hcd5er.fsf@mail.linkov.net> (raw)
In-Reply-To: <87y1aog83s.fsf@bernoul.li> (Jonas Bernoulli's message of "Mon, 11 Mar 2024 15:23:51 +0100")
[-- Attachment #1: Type: text/plain, Size: 1528 bytes --]
>> So, maybe these bindings should not be done?
>
> Too late for that now, but they should definitely be done in a way that
> users can customize, without having to advice tab-bar--define-keys (and
> tab-bar--undefine-keys).
Thanks for bringing up this issue. Customization of keys was not supported
since no once asked for it, I guess because tab-bar--define-keys
respected the existing global keybindings before defining own.
But indeed this doesn't work for local keymaps.
> Maybe by using a mode map? If there is some reason this cannot be
> done, then maybe a "dummy keymap" could be used? (User could then
> manipulate the fake tab-bar-mode-map like any keymap, but the bindings
> it contains would then somehow be "transplanted" into the global map
> by tab-bar--define-keys.)
Just adding a simple mode map completely makes it customizable
since 'define-minor-mode' is able to pick it by naming convention:
(defvar tab-bar-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [(control tab)] #'tab-next)
(define-key map [(control shift tab)] #'tab-previous)
(define-key map [(control shift iso-lefttab)] #'tab-previous)
map)
"Tab Bar mode map.")
The rest of complexity in the following patch comes
from the need to address the customization of
'tab-bar-select-tab-modifiers'.
There is a slight backward incompatibility for users who have own
global keybindings for C-TAB. They will need to unbind these keys
in the new map. Then this change should be announced in NEWS:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: tab-bar-mode-map.patch --]
[-- Type: text/x-diff, Size: 4358 bytes --]
diff --git a/etc/NEWS b/etc/NEWS
index 19cd170e5c7..0aab2d04ca2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -285,6 +285,11 @@ selected or deselected at the end of executing the current command.
** Tab Bars and Tab Lines
+---
+*** New keymap 'tab-bar-mode-map'.
+If you have global keybinding for 'C-TAB', then you might want
+to unbind the same keybinding in 'tab-bar-mode-map'.
+
---
*** New user option 'tab-bar-tab-name-format-functions'.
It can be used to add, remove and reorder functions that change
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 61efa332e0b..07470f072e1 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -104,10 +104,11 @@ tab-bar-select-tab-modifiers
(const alt))
:initialize #'custom-initialize-default
:set (lambda (sym val)
+ (when tab-bar-mode
+ (tab-bar--undefine-keys))
(set-default sym val)
;; Reenable the tab-bar with new keybindings
(when tab-bar-mode
- (tab-bar--undefine-keys)
(tab-bar--define-keys)))
:group 'tab-bar
:version "27.1")
@@ -115,21 +116,17 @@ tab-bar-select-tab-modifiers
(defun tab-bar--define-keys ()
"Install key bindings to switch between tabs if so configured."
(when tab-bar-select-tab-modifiers
- (global-set-key (vector (append tab-bar-select-tab-modifiers (list ?0)))
- #'tab-recent)
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers (list ?0)))
+ #'tab-recent)
(dotimes (i 8)
- (global-set-key (vector (append tab-bar-select-tab-modifiers
- (list (+ i 1 ?0))))
- #'tab-bar-select-tab))
- (global-set-key (vector (append tab-bar-select-tab-modifiers (list ?9)))
- #'tab-last))
- ;; Don't override user customized key bindings
- (unless (global-key-binding [(control tab)])
- (global-set-key [(control tab)] #'tab-next))
- (unless (global-key-binding [(control shift tab)])
- (global-set-key [(control shift tab)] #'tab-previous))
- (unless (global-key-binding [(control shift iso-lefttab)])
- (global-set-key [(control shift iso-lefttab)] #'tab-previous))
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers
+ (list (+ i 1 ?0))))
+ #'tab-bar-select-tab))
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers (list ?9)))
+ #'tab-last))
;; Replace default value with a condition that supports displaying
;; global-mode-string in the tab bar instead of the mode line.
@@ -144,12 +141,18 @@ tab-bar--define-keys
(defun tab-bar--undefine-keys ()
"Uninstall key bindings previously bound by `tab-bar--define-keys'."
- (when (eq (global-key-binding [(control tab)]) 'tab-next)
- (global-unset-key [(control tab)]))
- (when (eq (global-key-binding [(control shift tab)]) 'tab-previous)
- (global-unset-key [(control shift tab)]))
- (when (eq (global-key-binding [(control shift iso-lefttab)]) 'tab-previous)
- (global-unset-key [(control shift iso-lefttab)])))
+ (when tab-bar-select-tab-modifiers
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers (list ?0)))
+ nil)
+ (dotimes (i 8)
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers
+ (list (+ i 1 ?0))))
+ nil))
+ (define-key tab-bar-mode-map
+ (vector (append tab-bar-select-tab-modifiers (list ?9)))
+ nil)))
(defun tab-bar--load-buttons ()
"Load the icons for the tab buttons."
@@ -239,6 +242,14 @@ tab-bar--update-tab-bar-lines
(if (and tab-bar-mode (eq tab-bar-show t)) 1 0))
(assq-delete-all 'tab-bar-lines default-frame-alist)))))
+(defvar tab-bar-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [(control tab)] #'tab-next)
+ (define-key map [(control shift tab)] #'tab-previous)
+ (define-key map [(control shift iso-lefttab)] #'tab-previous)
+ map)
+ "Tab Bar mode map.")
+
(define-minor-mode tab-bar-mode
"Toggle the tab bar in all graphical frames (Tab Bar mode)."
:global t
next prev parent reply other threads:[~2024-03-11 17:50 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-06 7:56 bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful Gerd Möllmann
2024-03-06 17:45 ` Juri Linkov
2024-03-10 5:31 ` Gerd Möllmann
2024-03-10 6:28 ` Eli Zaretskii
2024-03-10 6:36 ` Gerd Möllmann
2024-03-11 14:23 ` Jonas Bernoulli
2024-03-11 14:52 ` Gerd Möllmann
2024-03-11 15:02 ` Gerd Möllmann
2024-03-11 16:44 ` Eli Zaretskii
2024-03-11 17:50 ` Juri Linkov [this message]
2024-03-20 17:40 ` Juri Linkov
2024-04-05 16:23 ` Juri Linkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86h6hcd5er.fsf@mail.linkov.net \
--to=juri@linkov.net \
--cc=69578@debbugs.gnu.org \
--cc=jonas@bernoul.li \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.