* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful @ 2024-03-06 7:56 Gerd Möllmann 2024-03-06 17:45 ` Juri Linkov 2024-03-11 14:23 ` Jonas Bernoulli 0 siblings, 2 replies; 12+ messages in thread From: Gerd Möllmann @ 2024-03-06 7:56 UTC (permalink / raw) To: 69578 tab-bar--define-keys makes bindings for TAG like this: (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)) These bindings stop taking effect if a mode has its own bindings for control tab, for instance. A prominent example is Magit. So, maybe these bindings should not be done? In GNU Emacs 30.0.50 (build 1, x86_64-apple-darwin23.3.0, NS appkit-2487.40 Version 14.3.1 (Build 23D60)) of 2024-03-05 built on Pro.fritz.box Repository revision: a3d7092114db09fee392ccc8187fde03376f2089 Repository branch: HEAD Windowing system distributor 'Apple', version 10.3.2487 System Description: macOS 14.3.1 ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 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-11 14:23 ` Jonas Bernoulli 1 sibling, 1 reply; 12+ messages in thread From: Juri Linkov @ 2024-03-06 17:45 UTC (permalink / raw) To: Gerd Möllmann; +Cc: 69578 > tab-bar--define-keys makes bindings for TAG like this: > > (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)) > > These bindings stop taking effect if a mode has its own bindings for > control tab, for instance. A prominent example is Magit. The developers of Org mode took courage and replaced their C-TAB bindings with C-c C-TAB: https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-09/msg00341.html The developers of Magit could do the same. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-06 17:45 ` Juri Linkov @ 2024-03-10 5:31 ` Gerd Möllmann 2024-03-10 6:28 ` Eli Zaretskii 0 siblings, 1 reply; 12+ messages in thread From: Gerd Möllmann @ 2024-03-10 5:31 UTC (permalink / raw) To: Juri Linkov; +Cc: 69578 Juri Linkov <juri@linkov.net> writes: >> tab-bar--define-keys makes bindings for TAG like this: >> >> (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)) >> >> These bindings stop taking effect if a mode has its own bindings for >> control tab, for instance. A prominent example is Magit. > > The developers of Org mode took courage and > replaced their C-TAB bindings with C-c C-TAB: > https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-09/msg00341.html > The developers of Magit could do the same. I've submitted https://github.com/magit/magit/issues/5106 to the Magit project. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-10 5:31 ` Gerd Möllmann @ 2024-03-10 6:28 ` Eli Zaretskii 2024-03-10 6:36 ` Gerd Möllmann 0 siblings, 1 reply; 12+ messages in thread From: Eli Zaretskii @ 2024-03-10 6:28 UTC (permalink / raw) To: Gerd Möllmann; +Cc: 69578, juri > Cc: 69578@debbugs.gnu.org > From: Gerd Möllmann <gerd.moellmann@gmail.com> > Date: Sun, 10 Mar 2024 06:31:48 +0100 > > Juri Linkov <juri@linkov.net> writes: > > >> tab-bar--define-keys makes bindings for TAG like this: > >> > >> (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)) > >> > >> These bindings stop taking effect if a mode has its own bindings for > >> control tab, for instance. A prominent example is Magit. > > > > The developers of Org mode took courage and > > replaced their C-TAB bindings with C-c C-TAB: > > https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-09/msg00341.html > > The developers of Magit could do the same. > > I've submitted https://github.com/magit/magit/issues/5106 to the Magit > project. Thanks, should we therefore close this bug? ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-10 6:28 ` Eli Zaretskii @ 2024-03-10 6:36 ` Gerd Möllmann 0 siblings, 0 replies; 12+ messages in thread From: Gerd Möllmann @ 2024-03-10 6:36 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 69578, juri Eli Zaretskii <eliz@gnu.org> writes: > Thanks, should we therefore close this bug? I'll close it in a second, thanks. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 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-11 14:23 ` Jonas Bernoulli 2024-03-11 14:52 ` Gerd Möllmann 2024-03-11 17:50 ` Juri Linkov 1 sibling, 2 replies; 12+ messages in thread From: Jonas Bernoulli @ 2024-03-11 14:23 UTC (permalink / raw) To: 69578 > The developers of Org mode took courage and replaced their C-TAB > bindings with C-c C-TAB: It indeed takes courage to change key bindings; there will always be a few users who get very upset by such a change. > These bindings stop taking effect if a mode has its own bindings for > control tab, for instance. A prominent example is Magit. I have addressed this in Magit as described in this commit message: magit-section-cycle: Pivot to tab-next if there is a binding conflict If `tab-bar-mode' is enable, then "C-<tab>" is bound to `tab-next' in the global map. That conflicts with our local (and much older) binding for `magit-section-cycle'. Address this conflict by teaching `magit-section-cycle' to pivot to `tab-next', but only if `tab-bar-mode' is enabled. That way, users who do not use `tab-bar-mode' (i.e., the majority), are not affected by this unfortunate conflict. `tab-bar-mode' users will have to get used to the much less convenient "C-c TAB" binding to cycle section visibility. Alternatively they can advice `tab-bar--define-keys' to bind another key to `tab-next'. It would be nice if `tab-bar-mode', instead of modifying the global map, used a mode map, and thus didn't make it so very hard to change its key bindings. > 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). 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.) >> Thanks, should we therefore close this bug? > > I'll close it in a second, thanks. This seems premature, making it so hard for users to change the tab-bar bindings seems like something that needs to be fixed. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 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 17:50 ` Juri Linkov 1 sibling, 1 reply; 12+ messages in thread From: Gerd Möllmann @ 2024-03-11 14:52 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 69578 Jonas Bernoulli <jonas@bernoul.li> writes: >>> Thanks, should we therefore close this bug? >> >> I'll close it in a second, thanks. > > This seems premature, making it so hard for users to change the tab-bar > bindings seems like something that needs to be fixed. No problem, I've re-opened it. Thanks, Jonas! ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-11 14:52 ` Gerd Möllmann @ 2024-03-11 15:02 ` Gerd Möllmann 2024-03-11 16:44 ` Eli Zaretskii 0 siblings, 1 reply; 12+ messages in thread From: Gerd Möllmann @ 2024-03-11 15:02 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 69578 Gerd Möllmann <gerd.moellmann@gmail.com> writes: > No problem, I've re-opened it. Thanks, Jonas! At least I tried, but reopen doesn't seem to take effect. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-11 15:02 ` Gerd Möllmann @ 2024-03-11 16:44 ` Eli Zaretskii 0 siblings, 0 replies; 12+ messages in thread From: Eli Zaretskii @ 2024-03-11 16:44 UTC (permalink / raw) To: Gerd Möllmann; +Cc: jonas, 69578 > Cc: 69578@debbugs.gnu.org > From: Gerd Möllmann <gerd.moellmann@gmail.com> > Date: Mon, 11 Mar 2024 16:02:26 +0100 > > Gerd Möllmann <gerd.moellmann@gmail.com> writes: > > > No problem, I've re-opened it. Thanks, Jonas! > > At least I tried, but reopen doesn't seem to take effect. It did. The bug is now open. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-11 14:23 ` Jonas Bernoulli 2024-03-11 14:52 ` Gerd Möllmann @ 2024-03-11 17:50 ` Juri Linkov 2024-03-20 17:40 ` Juri Linkov 1 sibling, 1 reply; 12+ messages in thread From: Juri Linkov @ 2024-03-11 17:50 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 69578 [-- 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 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-11 17:50 ` Juri Linkov @ 2024-03-20 17:40 ` Juri Linkov 2024-04-05 16:23 ` Juri Linkov 0 siblings, 1 reply; 12+ messages in thread From: Juri Linkov @ 2024-03-20 17:40 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 69578 > 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: > > diff --git a/etc/NEWS b/etc/NEWS > +--- > +*** 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'. I still feel uneasy about this backward incompatibility since users will suddenly get tab-switching on C-TAB when they use another global keybinding for C-TAB. So we need to rethink this change. ^ permalink raw reply [flat|nested] 12+ messages in thread
* bug#69578: 30.0.50; tab-bar-mode binding of (control tab) not always useful 2024-03-20 17:40 ` Juri Linkov @ 2024-04-05 16:23 ` Juri Linkov 0 siblings, 0 replies; 12+ messages in thread From: Juri Linkov @ 2024-04-05 16:23 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 69578 close 69578 30.0.50 thanks >> 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: >> >> diff --git a/etc/NEWS b/etc/NEWS >> +--- >> +*** 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'. > > I still feel uneasy about this backward incompatibility > since users will suddenly get tab-switching on C-TAB > when they use another global keybinding for C-TAB. > So we need to rethink this change. Ok, now pushed a backward-compatibile fix. So can close now. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-04-05 16:23 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 2024-03-20 17:40 ` Juri Linkov 2024-04-05 16:23 ` Juri Linkov
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).