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:
parent
815c4dc0e0
commit
6c46e2a363
2 changed files with 58 additions and 21 deletions
11
etc/NEWS
11
etc/NEWS
|
|
@ -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
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue