1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-23 00:10:48 -08:00

Add new user option tab-bar-define-keys

* lisp/tab-bar.el (tab-bar-define-keys):
Add new defcustom tab-bar-define-keys.  Reorganize key binding functions
to accommodate.  Also remove checks for tab-bar-mode enabled in
'tab-bar-select-tab-modifiers', as unnecessary and which prevented user
changes from being accepted in cases where the user defers enabling
tab-bar-mode (bug#75918).
This commit is contained in:
shipmints 2025-01-29 13:43:04 -05:00 committed by Juri Linkov
parent 815c4dc0e0
commit 6c46e2a363
2 changed files with 58 additions and 21 deletions

View file

@ -245,6 +245,17 @@ This hook allows you to operate on a reopened tab.
This is useful when you define custom tab parameters that may need
adjustment when a tab is restored, and avoids advice.
---
*** New user option 'tab-bar-define-keys'.
This controls which key bindings tab-bar creates. Values are t, the
default, which defines all keys and is backwards compatible, 'numeric'
(tab number selection only), 'tab' (TAB and SHIFT-TAB keys only), nil
(which defines none).
This is useful to avoid key binding conflicts, such as when folding in
outline mode using TAB keys, or when a user wants to define her own
tab-bar keys without first having to remove the defaults.
** Project
---

View file

@ -86,6 +86,35 @@
:group 'tab-bar-faces)
(defvar tab-bar-mode-map (make-sparse-keymap)
"Tab Bar mode map.")
(defcustom tab-bar-define-keys t
"Define specified tab-bar key bindings.
If t, the default, all key mappings are defined.
If \\='numeric, define only numeric select-tab key mappings, and in
conjunction with `tab-bar-select-tab-modifiers', which see.
If \\='tab, define only TAB and SHIFT-TAB tab-selection key mappings.
If nil, do not define any key mappings.
Customize this option, or use `setopt' to ensure it will take effect."
:type '(choice (const :tag "All keys" t)
(const :tag "Numeric tab selection keys" numeric)
(const :tag "TAB and SHIFT-TAB selection keys" tab)
(const :tag "None" nil))
:initialize #'custom-initialize-default
:set (lambda (sym val)
(tab-bar--undefine-keys)
(set-default sym val)
;; Enable the new keybindings
(tab-bar--define-keys))
:group 'tab-bar
:version "31.1")
(defcustom tab-bar-select-tab-modifiers '()
"List of modifier keys for selecting tab-bar tabs by their numbers.
Possible modifier keys are `control', `meta', `shift', `hyper', `super' and
@ -104,18 +133,17 @@ For easier selection of tabs by their numbers, consider customizing
(const alt))
:initialize #'custom-initialize-default
:set (lambda (sym val)
(when tab-bar-mode
(tab-bar--undefine-keys))
(tab-bar--undefine-keys)
(set-default sym val)
;; Reenable the tab-bar with new keybindings
(when tab-bar-mode
(tab-bar--define-keys)))
;; Enable the new keybindings
(tab-bar--define-keys))
:group 'tab-bar
:version "27.1")
(defun tab-bar--define-keys ()
"Install key bindings to switch between tabs if so configured."
(when tab-bar-select-tab-modifiers
(when (and (memq tab-bar-define-keys '(t numeric))
tab-bar-select-tab-modifiers)
(define-key tab-bar-mode-map
(vector (append tab-bar-select-tab-modifiers (list ?0)))
#'tab-recent)
@ -128,6 +156,14 @@ For easier selection of tabs by their numbers, consider customizing
(vector (append tab-bar-select-tab-modifiers (list ?9)))
#'tab-last))
(when (memq tab-bar-define-keys '(t tab))
(unless (global-key-binding [(control tab)])
(define-key tab-bar-mode-map [(control tab)] #'tab-next))
(unless (global-key-binding [(control shift tab)])
(define-key tab-bar-mode-map [(control shift tab)] #'tab-previous))
(unless (global-key-binding [(control shift iso-lefttab)])
(define-key tab-bar-mode-map [(control shift iso-lefttab)] #'tab-previous)))
;; Replace default value with a condition that supports displaying
;; global-mode-string in the tab bar instead of the mode line.
(when (and (memq 'tab-bar-format-global tab-bar-format)
@ -152,7 +188,11 @@ For easier selection of tabs by their numbers, consider customizing
nil t))
(define-key tab-bar-mode-map
(vector (append tab-bar-select-tab-modifiers (list ?9)))
nil t)))
nil t))
(define-key tab-bar-mode-map [(control tab)] nil t)
(define-key tab-bar-mode-map [(control shift tab)] nil t)
(define-key tab-bar-mode-map [(control shift iso-lefttab)] nil t))
(defun tab-bar--load-buttons ()
"Load the icons for the tab buttons."
@ -242,20 +282,6 @@ a list of frames to update."
(if (and tab-bar-mode (eq tab-bar-show t)) 1 0))
(assq-delete-all 'tab-bar-lines default-frame-alist)))))
(defun tab-bar-mode--tab-key-bind (map key binding)
;; Don't override user customized global key bindings
(define-key map key
`(menu-item "" ,binding
:filter ,(lambda (cmd) (unless (global-key-binding key) cmd)))))
(defvar tab-bar-mode-map
(let ((map (make-sparse-keymap)))
(tab-bar-mode--tab-key-bind map [(control tab)] #'tab-next)
(tab-bar-mode--tab-key-bind map [(control shift tab)] #'tab-previous)
(tab-bar-mode--tab-key-bind 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).