branch: elpa/jabber
commit e49a9afab964086d33dcb35a58283438e5fff89d
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>
keymap: Separate shared command maps
---
lisp/jabber-console.el | 1 +
lisp/jabber-iq.el | 1 +
lisp/jabber-keymap.el | 71 +++++++++++++++++++++++++++++++++++++++++++++++
lisp/jabber-util.el | 47 -------------------------------
lisp/jabber.el | 1 +
tests/jabber-test-menu.el | 4 ++-
6 files changed, 77 insertions(+), 48 deletions(-)
diff --git a/lisp/jabber-console.el b/lisp/jabber-console.el
index 6767a01a3e..5a1b0ca2e8 100644
--- a/lisp/jabber-console.el
+++ b/lisp/jabber-console.el
@@ -25,6 +25,7 @@
;;; Code:
+(require 'jabber-keymap)
(require 'jabber-util)
(require 'jabber-truncate)
(require 'xml)
diff --git a/lisp/jabber-iq.el b/lisp/jabber-iq.el
index a1b200b4d9..317d54c6ea 100644
--- a/lisp/jabber-iq.el
+++ b/lisp/jabber-iq.el
@@ -29,6 +29,7 @@
(require 'jabber-util)
(require 'jabber-alert)
+(require 'jabber-keymap)
(define-obsolete-variable-alias '*jabber-open-info-queries*
'jabber-open-info-queries "0.11.0")
diff --git a/lisp/jabber-keymap.el b/lisp/jabber-keymap.el
new file mode 100644
index 0000000000..eb21906d2e
--- /dev/null
+++ b/lisp/jabber-keymap.el
@@ -0,0 +1,71 @@
+;;; jabber-keymap.el --- Shared Jabber keymaps -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Thanos Apollo
+
+;; Maintainer: Thanos Apollo <[email protected]>
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;;; Commentary:
+
+;; Shared keymaps are assembled from command symbols without loading their
+;; owning feature modules. The main Jabber entry point establishes the full
+;; feature load order.
+
+;;; Code:
+
+(require 'keymap-popup)
+
+(defconst jabber-keymap--common-bindings
+ '(("C-c C-i" "Info/Discovery" jabber-info-menu)
+ ("C-c C-m" "MUC" jabber-muc-menu)
+ ("C-c C-s" "Services" jabber-service-menu))
+ "Bindings shared by Jabber `special-mode' maps.")
+
+(defconst jabber-keymap--global-bindings
+ '(("C-c" "Connect" jabber-connect-all)
+ ("C-d" "Disconnect" jabber-disconnect)
+ ("C-r" "Roster" jabber-roster-popup)
+ ("C-j" "Chat with" jabber-chat-with)
+ ("C-l" "Next unread" jabber-activity-switch-to)
+ ("C-a" "Away" jabber-send-away-presence)
+ ("C-o" "Online" jabber-send-default-presence)
+ ("C-x" "Extended away" jabber-send-xa-presence)
+ ("C-p" "Set presence" jabber-send-presence)
+ ("C-b" "Switch buffer" jabber-chat-buffer-switch)
+ ("C-m" "Join MUC" jabber-muc-join))
+ "Bindings exposed through `jabber-global-keymap'.")
+
+(defun jabber-keymap--add-bindings (keymap bindings)
+ "Install BINDINGS and their popup descriptions in KEYMAP."
+ (dolist (binding bindings)
+ (pcase-let ((`(,key ,description ,command) binding))
+ (keymap-popup-add-entry keymap key description command))))
+
+(keymap-popup-define jabber-common-keymap
+ "Common Jabber commands."
+ :parent special-mode-map
+ "TAB" ("Next button" forward-button)
+ "<backtab>" ("Previous button" backward-button))
+
+(jabber-keymap--add-bindings jabber-common-keymap
+ jabber-keymap--common-bindings)
+
+(keymap-popup-define jabber-global-keymap
+ "Global Jabber commands."
+ "C-g" ("Quit" keyboard-quit))
+
+;; keymap-popup 0.3 cannot add entries before a map has popup metadata.
+(keymap-popup-remove-entry jabber-global-keymap "C-g")
+(jabber-keymap--add-bindings jabber-global-keymap
+ jabber-keymap--global-bindings)
+(define-key ctl-x-map "\C-j" jabber-global-keymap)
+
+(provide 'jabber-keymap)
+
+;;; jabber-keymap.el ends here
diff --git a/lisp/jabber-util.el b/lisp/jabber-util.el
index 4833c47b96..b5619f9220 100644
--- a/lisp/jabber-util.el
+++ b/lisp/jabber-util.el
@@ -34,7 +34,6 @@
(require 'jabber-sm)
(require 'fsm)
(require 'password-cache)
-(require 'keymap-popup)
(condition-case nil
(require 'auth-source)
@@ -46,30 +45,14 @@
;; Global reference declarations
(declare-function auth-source-search "auth-source" (&rest spec))
-(declare-function jabber-chat-buffer-switch "jabber-chatbuffer.el" ())
(declare-function jabber-chat-with "jabber-chat.el"
(jc jid &optional other-window))
-(declare-function jabber-connect-all "jabber-core.el" (&optional arg))
-(declare-function jabber-disconnect "jabber-core.el"
- (&optional arg interactivep))
(declare-function jabber-ahc-execute-command "jabber-ahc.el" (jc to node))
(declare-function jabber-get-register "jabber-register.el" (jc to))
-(declare-function jabber-info-menu "jabber-disco.el" ())
-(declare-function jabber-muc-menu "jabber-muc.el" ())
(declare-function jabber-muc-read-my-nickname "jabber-muc.el"
(jc group &optional default))
(declare-function jabber-muc-join "jabber-muc.el"
(jc group nickname &optional popup))
-(declare-function jabber-roster-popup "jabber-roster.el" ())
-(declare-function jabber-send-away-presence "jabber-presence.el"
- (&optional status jc))
-(declare-function jabber-send-default-presence "jabber-presence.el"
- (&optional jc))
-(declare-function jabber-send-presence "jabber-presence.el"
- (show status priority &optional jc))
-(declare-function jabber-send-xa-presence "jabber-presence.el"
- (&optional status jc))
-(declare-function jabber-service-menu "jabber-disco.el" ())
(defvar jabber-delay-xmlns) ; jabber-xml.el
(defvar jabber-delay-legacy-xmlns) ; jabber-xml.el
(defvar jabber-stanzas-xmlns) ; jabber-xml.el
@@ -1084,35 +1067,5 @@ obtained from `xml-parse-region'."
"Return non-nil if SASL library is available."
(featurep 'sasl))
-;;; Shared keymaps
-
-(declare-function jabber-activity-switch-to "jabber-activity.el"
- (&optional jid-param))
-
-(keymap-popup-define jabber-common-keymap
- "Common Jabber commands."
- :parent special-mode-map
- "C-c C-i" ("Info/Discovery" jabber-info-menu)
- "C-c C-m" ("MUC" jabber-muc-menu)
- "C-c C-s" ("Services" jabber-service-menu)
- "TAB" ("Next button" forward-button)
- "<backtab>" ("Previous button" backward-button))
-
-(keymap-popup-define jabber-global-keymap
- "Global Jabber commands."
- "C-c" ("Connect" jabber-connect-all)
- "C-d" ("Disconnect" jabber-disconnect)
- "C-r" ("Roster" jabber-roster-popup)
- "C-j" ("Chat with" jabber-chat-with)
- "C-l" ("Next unread" jabber-activity-switch-to)
- "C-a" ("Away" jabber-send-away-presence)
- "C-o" ("Online" jabber-send-default-presence)
- "C-x" ("Extended away" jabber-send-xa-presence)
- "C-p" ("Set presence" jabber-send-presence)
- "C-b" ("Switch buffer" jabber-chat-buffer-switch)
- "C-m" ("Join MUC" jabber-muc-join))
-
-(define-key ctl-x-map "\C-j" jabber-global-keymap)
-
(provide 'jabber-util)
;;; jabber-util.el ends here
diff --git a/lisp/jabber.el b/lisp/jabber.el
index 852e82fc0a..be6d85f7f9 100644
--- a/lisp/jabber.el
+++ b/lisp/jabber.el
@@ -154,6 +154,7 @@ One disabled account with a non-standard port:
:group 'jabber)
;;; guess internal dependencies!
+(require 'jabber-keymap)
(require 'jabber-util)
(require 'jabber-xml)
(require 'jabber-conn)
diff --git a/tests/jabber-test-menu.el b/tests/jabber-test-menu.el
index 4edf7b8dff..79764cca34 100644
--- a/tests/jabber-test-menu.el
+++ b/tests/jabber-test-menu.el
@@ -30,7 +30,9 @@ inherited bindings from parent mode keymaps."
(ert-deftest jabber-test-menu-popup-commands-defined ()
"Every command in a jabber popup keymap must be fboundp."
- (let ((maps (list jabber-chat-operations-menu-map
+ (let ((maps (list jabber-common-keymap
+ jabber-global-keymap
+ jabber-chat-operations-menu-map
jabber-chat-encryption-menu-map
jabber-roster-popup-map
jabber-roster-presence-map