From 56e9270dc202b940d18f5c34807a6f719faa9909 Mon Sep 17 00:00:00 2001 From: Hugo Heagren Date: Sun, 4 Aug 2024 12:54:27 +0100 Subject: [PATCH] Add commands to interactively set/unset keyboard translations * lisp/keymap.el (key-translate): Add an interactive form, prompting for keys to translate, and update docstring to reflect this. (key-translate-selection-function): New custom option. (key-select-translation): New function, default value of above option. (key-translate-remove): New command, for removing entries from `keyboard-translate-table'. --- lisp/keymap.el | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lisp/keymap.el b/lisp/keymap.el index 861d6724c9e..4e1deecff51 100644 --- a/lisp/keymap.el +++ b/lisp/keymap.el @@ -392,9 +392,16 @@ key-translate and then modifies one entry in it. Both FROM and TO should be specified by strings that satisfy `key-valid-p'. -If TO is nil, remove any existing translation for FROM." +If TO is nil, remove any existing translation for FROM. + +Interactively, prompt for FROM and TO with `read-char'." (declare (compiler-macro (lambda (form) (keymap--compile-check from to) form))) + ;; Using `key-description' is a necessary evil here, so that the + ;; values can be passed to keymap-* functions, even though those + ;; functions immediately undo it with `key-parse'. + (interactive `(,(key-description `[,(read-char "From: ")]) + ,(key-description `[,(read-char "To: ")]))) (keymap--check from) (when to (keymap--check to)) @@ -417,6 +424,48 @@ key-translate (aref from-key 0) (and to (aref to-key 0))))) +(defun key-select-translation () + "Prompt for a current keyboard translation pair with `'completing-read'. + +Each pair is formatted as \"FROM -> TO\". + +Return the \"FROM\" as a key string." + (let* ((minibuffer-allow-text-properties t) + (collection) + ;; Alignment helpers + (pad 0) + (_ (map-char-table + (lambda (k _) + (when (> (length (key-description `[,k])) pad) + (setq pad (length (key-description `[,k]))))) + keyboard-translate-table + )) + (format-func + (lambda (k v) + (setq collection + (cons + (propertize + (format + "%s -> %s" + (string-pad (key-description `[,k]) pad) + (key-description `[,v])) + 'key-translate-from k) + collection))))) + ;; Populate collection + (map-char-table format-func keyboard-translate-table) + (car + (split-string + (completing-read + "Key Translation: " collection nil t))))) + +(defun key-translate-remove (from) + "Remove translation of FROM from `keyboard-translate-table'. + +FROM must satisfy `key-valid-p'. If FROM has no entry in +`keyboard-translate-table', this has no effect." + (interactive (list (key-select-translation))) + (key-translate from nil)) + (defun keymap-lookup (keymap key &optional accept-default no-remap position) "Return the binding for command KEY in KEYMAP. KEY is a string that satisfies `key-valid-p'. -- 2.20.1