From 1ba75cc6fc57e27c489d49f9fba0f7d6788e030b Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Sun, 31 Aug 2025 21:23:05 +0300 Subject: [PATCH] New user option 'tab-line-define-keys' * lisp/tab-line.el (tab-line-define-keys): New defcustom. (tab-line--define-keys, tab-line--undefine-keys): New functions that explicitly bind commands from 'tab-line-mode-map' to 'ctl-x-map'. (tab-line-mode-map): Leave this keymap empty by default to avoid breaking 'ctl-x-map' (bug#79323). (global-tab-line-mode): Call either 'tab-line--define-keys' or 'tab-line--undefine-keys'. --- etc/NEWS | 6 +++++ lisp/tab-line.el | 59 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 4bf5f1dee9c..02a556a557d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -434,6 +434,12 @@ docstring for arguments passed to a help-text function. When non-nil, it truncates the tab bar, and therefore prevents wrapping and resizing the tab bar to more than one line. +--- +*** New user option 'tab-line-define-keys'. +When t, the default, it redefines window buffer switching keys +such as 'C-x ' and 'C-x ' to tab-line specific variants +for switching tabs. + --- *** New command 'tab-line-move-tab-forward' ('C-x M-'). Together with the new command 'tab-line-move-tab-backward' diff --git a/lisp/tab-line.el b/lisp/tab-line.el index 7caae8bc2c1..fbf7f79eda8 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -1277,14 +1277,54 @@ However, return the correct mouse position list if EVENT is a (event-start event))) +(defcustom tab-line-define-keys t + "Define specific tab-line key bindings. +If t, the default, key mappings for switching and moving tabs +are defined. If nil, do not define any key mappings." + :type 'boolean + :initialize #'custom-initialize-default + :set (lambda (sym val) + (tab-line--undefine-keys) + (set-default sym val) + ;; Enable the new keybindings + (tab-line--define-keys)) + :group 'tab-line + :version "31.1") + +(defun tab-line--define-keys () + "Install key bindings to switch between tabs if so configured." + (when tab-line-define-keys + (when (eq (keymap-lookup ctl-x-map "") 'previous-buffer) + (keymap-set ctl-x-map "" #'tab-line-switch-to-prev-tab)) + (when (eq (keymap-lookup ctl-x-map "C-") 'previous-buffer) + (keymap-set ctl-x-map "C-" #'tab-line-switch-to-prev-tab)) + (unless (keymap-lookup ctl-x-map "M-") + (keymap-set ctl-x-map "M-" #'tab-line-move-tab-backward)) + (when (eq (keymap-lookup ctl-x-map "") 'next-buffer) + (keymap-set ctl-x-map "" #'tab-line-switch-to-next-tab)) + (when (eq (keymap-lookup ctl-x-map "C-") 'next-buffer) + (keymap-set ctl-x-map "C-" #'tab-line-switch-to-next-tab)) + (unless (keymap-lookup ctl-x-map "M-") + (keymap-set ctl-x-map "M-" #'tab-line-move-tab-forward)))) + +(defun tab-line--undefine-keys () + "Uninstall key bindings previously bound by `tab-line--define-keys'." + (when tab-line-define-keys + (when (eq (keymap-lookup ctl-x-map "") 'tab-line-switch-to-prev-tab) + (keymap-set ctl-x-map "" #'previous-buffer)) + (when (eq (keymap-lookup ctl-x-map "C-") 'tab-line-switch-to-prev-tab) + (keymap-set ctl-x-map "C-" #'previous-buffer)) + (when (eq (keymap-lookup ctl-x-map "M-") 'tab-line-move-tab-backward) + (keymap-set ctl-x-map "M-" nil)) + (when (eq (keymap-lookup ctl-x-map "") 'tab-line-switch-to-next-tab) + (keymap-set ctl-x-map "" #'next-buffer)) + (when (eq (keymap-lookup ctl-x-map "C-") 'tab-line-switch-to-next-tab) + (keymap-set ctl-x-map "C-" #'next-buffer)) + (when (eq (keymap-lookup ctl-x-map "M-") 'tab-line-move-tab-forward) + (keymap-set ctl-x-map "M-" nil)))) + (defvar-keymap tab-line-mode-map - :doc "Keymap for keys of `tab-line-mode'." - "C-x " #'tab-line-switch-to-prev-tab - "C-x C-" #'tab-line-switch-to-prev-tab - "C-x M-" #'tab-line-move-tab-backward - "C-x " #'tab-line-switch-to-next-tab - "C-x C-" #'tab-line-switch-to-next-tab - "C-x M-" #'tab-line-move-tab-forward) + :doc "Keymap for keys of `tab-line-mode'.") (defvar-keymap tab-line-switch-repeat-map :doc "Keymap to repeat tab/buffer cycling. Used in `repeat-mode'." @@ -1374,7 +1414,10 @@ of `tab-line-exclude', are exempt from `tab-line-mode'." (define-globalized-minor-mode global-tab-line-mode tab-line-mode tab-line-mode--turn-on :group 'tab-line - :version "27.1") + :version "27.1" + (if global-tab-line-mode + (tab-line--define-keys) + (tab-line--undefine-keys))) (global-set-key [tab-line down-mouse-3] 'tab-line-context-menu)