From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 9B8766DE00AC for ; Sat, 15 Oct 2016 04:50:48 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.038 X-Spam-Level: X-Spam-Status: No, score=0.038 tagged_above=-999 required=5 tests=[AWL=-0.092, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nLubbtBCIAFM for ; Sat, 15 Oct 2016 04:50:47 -0700 (PDT) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by arlo.cworth.org (Postfix) with ESMTPS id 193C86DE0005 for ; Sat, 15 Oct 2016 04:50:47 -0700 (PDT) Received: by mail-wm0-f66.google.com with SMTP id 191so2248118wmr.0 for ; Sat, 15 Oct 2016 04:50:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=p9+avAAf7NndqIh6w8nw16KVa9Z9ICeWExkscp2btD4=; b=u1gSVMmrNyzMGSs28QaEMmZIEBiPxB83wXJvaKJ4LSjPb6IvKJPdGaiHzZ4DYWsww9 pX0CRpmH0zb4Cxfg1bGvHitJwxLin3NXwk70OyH9Bor5iFuzk9wd423BCVnkLj6LMuhY iXj3p2IdPGMnN8y6pExjCVT/IuPJe1LuF7IWh+cnli2PMaemzgKO0C/5EHlSHF5W1yda SigPTMJGOobr5F+nMgIN9FGtKdqutCVwDK3HoPOc/H9I0DQESI32DnjdLEk8nUdNaGZ8 +cPTfN4XQ+2Q2UjN996gLmKusk4OQFVNWw3kYBlkYB2wDLKYkcuhPo1KBOMaFSB/oGtT 6S6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=p9+avAAf7NndqIh6w8nw16KVa9Z9ICeWExkscp2btD4=; b=ZSc3aLBZcbnYU1OeH9sc0vlMIhQ9T84+mVJsHMBWZlsO1Ol9jt9utkjpyKoN3nFn+Z Ygr3hmkluxlsOiHhgvLUjXuW9MJdBeJFmpkoQyuaejijUZJkhTkakMV0Cvf6ui/BBdC6 Dg9oJudEBJ34Px2v6EaVyZr1I2qoSFS/GO7uVt+i6AIi9gMU0l10hhjIBOkRPId03gy9 5vs8eD/fnEWd01gSkElg9UIh/fNz5Qr7+V7RfYJIPyAJRS7WtnQ+F6O34MHkT/G7az6w INa9ktf/CGJW9mIexrDa4kJM6sNeZhcIBxchEfmR0vtbYY/FGRcoSwkT9n/D92IuS4h3 1CZQ== X-Gm-Message-State: AA6/9RnVo7/qwDmUOCCdv/36QVWTmAB3Eb32BVueKYQheIKu95S6euMj2PF2NLj1bVJWug== X-Received: by 10.28.74.216 with SMTP id n85mr2021449wmi.39.1476532245409; Sat, 15 Oct 2016 04:50:45 -0700 (PDT) Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162]) by smtp.gmail.com with ESMTPSA id c17sm3166923wmc.0.2016.10.15.04.50.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Oct 2016 04:50:44 -0700 (PDT) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH] emacs: jump: make multilevel keys do multilevel jump Date: Sat, 15 Oct 2016 12:50:42 +0100 Message-Id: <1476532242-2349-1-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <87y41xwxr8.fsf@zancas.localnet> References: <87y41xwxr8.fsf@zancas.localnet> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Oct 2016 11:50:48 -0000 notmuch jump allows the user to specify a key sequence rather than just a single key for its bindings. However, it doesn't show what has already been typed so it can be difficult to see what has happened. This makes each key press appear, and the jump menu reduce to the possible follow up keys. We also bind backspace (emacs symbol DEL) to go back up a level in the subjumpmaps, and to exit from the top level. --- This removes the no-op `,() construct from the previous version of this patch, but is otherwise unchanged. Best wishes Mark emacs/notmuch-jump.el | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/emacs/notmuch-jump.el b/emacs/notmuch-jump.el index 963253c..3e20b8c 100644 --- a/emacs/notmuch-jump.el +++ b/emacs/notmuch-jump.el @@ -104,7 +104,7 @@ not appear in the pop-up buffer. (copy-sequence minibuffer-prompt-properties) 'face)) ;; Build the keymap with our bindings - (minibuffer-map (notmuch-jump--make-keymap action-map)) + (minibuffer-map (notmuch-jump--make-keymap action-map prompt)) ;; The bindings save the the action in notmuch-jump--action (notmuch-jump--action nil)) ;; Read the action @@ -161,18 +161,47 @@ buffer." (set-keymap-parent map minibuffer-local-map) ;; Make this like a special-mode keymap, with no self-insert-command (suppress-keymap map) + (define-key map (kbd "DEL") 'exit-minibuffer) map) "Base keymap for notmuch-jump's minibuffer keymap.") -(defun notmuch-jump--make-keymap (action-map) +(defun notmuch-jump--make-keymap (action-map prompt) "Translate ACTION-MAP into a minibuffer keymap." (let ((map (make-sparse-keymap))) (set-keymap-parent map notmuch-jump-minibuffer-map) (dolist (action action-map) - (define-key map (first action) - `(lambda () (interactive) - (setq notmuch-jump--action ',(third action)) - (exit-minibuffer)))) + (if (= (length (first action)) 1) + (define-key map (first action) + `(lambda () (interactive) + (setq notmuch-jump--action ',(third action)) + (exit-minibuffer))))) + ;; By doing this in two passes (and checking if we already have a + ;; binding) we avoid problems if the user specifies a binding which + ;; is a prefix of another binding. + (dolist (action action-map) + (if (> (length (first action)) 1) + (let* ((key (elt (first action) 0)) + (keystr (string key)) + (new-prompt (concat prompt (format-kbd-macro keystr) " ")) + (action-submap nil)) + (unless (lookup-key map keystr) + (dolist (act action-map) + (when (= key (elt (first act) 0)) + (push (list (substring (first act) 1) + (second act) + (third act)) + action-submap))) + ;; We deal with backspace specially + (push (list (kbd "DEL") + "Backup" + (apply-partially #'notmuch-jump action-map prompt)) + action-submap) + (setq action-submap (nreverse action-submap)) + (define-key map keystr + `(lambda () (interactive) + (setq notmuch-jump--action + ',(apply-partially #'notmuch-jump action-submap new-prompt)) + (exit-minibuffer))))))) map)) ;; -- 2.1.4