From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: low priority minor mode keymap? Date: Fri, 02 Nov 2018 11:22:19 -0400 Message-ID: References: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1541172034 17652 195.159.176.226 (2 Nov 2018 15:20:34 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 2 Nov 2018 15:20:34 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Nov 02 16:20:30 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gIbFN-0004WG-RX for ged-emacs-devel@m.gmane.org; Fri, 02 Nov 2018 16:20:29 +0100 Original-Received: from localhost ([::1]:52137 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gIbHU-0004dB-C2 for ged-emacs-devel@m.gmane.org; Fri, 02 Nov 2018 11:22:40 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:35341) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gIbHO-0004az-P5 for emacs-devel@gnu.org; Fri, 02 Nov 2018 11:22:35 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gIbHK-0008TF-6n for emacs-devel@gnu.org; Fri, 02 Nov 2018 11:22:34 -0400 Original-Received: from [195.159.176.226] (port=49488 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gIbHJ-0008Ss-VT for emacs-devel@gnu.org; Fri, 02 Nov 2018 11:22:30 -0400 Original-Received: from list by blaine.gmane.org with local (Exim 4.84_2) (envelope-from ) id 1gIbFA-0004IJ-4Y for emacs-devel@gnu.org; Fri, 02 Nov 2018 16:20:16 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 53 Original-X-Complaints-To: usenet@blaine.gmane.org Cancel-Lock: sha1:4AY2nwtNfl3+MYGuywnqdkuRBTs= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 195.159.176.226 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:230979 Archived-At: > When configuring god-mode (https://github.com/chrisdone/god-mode) I figure > that I want to put some keys at a lower priority than the local map, but > allowing this to be triggered based on the minor mode. I can simulate this > imperfectly with elisp code that looks up keymaps manually. Here's how crisp-mode (in GNU ELPA) does it: (define-minor-mode crisp-mode "..." :keymap crisp--minor-mode-map :global t (cond (crisp-mode ;; Make menu entries show M-u or f14 in preference to C-x u. (put 'undo :advertised-binding `([?\M-u] [f14] ,@(get 'undo :advertised-binding))) (cl-pushnew crisp-mode-map (cdr global-map)) ...) (t ;; not crisp-mode (cl-callf (lambda (binds) (delq crisp-mode-map binds)) (cdr global-map))))) where `crisp--minor-mode-map` is a dummy keymap. If you want it to be buffer-local, you'd have to add crisp-mode-map to the buffer-local map instead of the global-map, of course, which would need to be done a bit differently. Maybe something like: (let ((map (current-local-map))) (unless (eq crisp-mode-map (keymap-parent map)) (use-local-map (make-composed-keymap map crisp-mode-map)))) and (let ((map (current-local-map))) (when (eq crisp-mode-map (keymap-parent map)) (use-local-map (car (cdr map))))) > A better solution seems to be a minor-mode-low-priority-map-alist that > works similar to minor-mode-map-alist, but takes precedence after > local-map. Is something like this useful enough to get into Emacs? The rules deciding which maps are active at a given time are already pretty long and complex, IMO. What I'd *really* like is for this rule to be replaced by something like (defun current-active-maps (olp position) (funcall current-active-maps-function olp position)) so your mode could tweak the rule any way it likes. This basically requires to change the C code such that any time it needs to know/scan all the keymaps it does it by calling Fcurrent_active_maps. We'd also need to adapt describe-buffer-bindings somehow. Stefan