From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Robert Pluim Newsgroups: gmane.emacs.devel Subject: Re: The new keymap functions Date: Thu, 18 Nov 2021 11:25:55 +0100 Message-ID: <877dd5n4jw.fsf@gmail.com> References: <87zgq8sfw3.fsf@gnus.org> <86k0h8ts66.fsf@mail.linkov.net> <87r1bfp72g.fsf@gnus.org> <86v90r6w3j.fsf@mail.linkov.net> <87o86jm83k.fsf@gmail.com> <861r3ek9c1.fsf@mail.linkov.net> <87bl2hn7td.fsf@gnus.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37553"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Emacs developers , Juri Linkov To: Lars Ingebrigtsen Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Nov 18 11:27:10 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mnedJ-0009TJ-6l for ged-emacs-devel@m.gmane-mx.org; Thu, 18 Nov 2021 11:27:09 +0100 Original-Received: from localhost ([::1]:45236 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mnedH-0002U0-BO for ged-emacs-devel@m.gmane-mx.org; Thu, 18 Nov 2021 05:27:07 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:33026) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mnecB-0000Xr-Nl for emacs-devel@gnu.org; Thu, 18 Nov 2021 05:25:59 -0500 Original-Received: from [2a00:1450:4864:20::430] (port=41484 helo=mail-wr1-x430.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mnecA-00048v-Bz for emacs-devel@gnu.org; Thu, 18 Nov 2021 05:25:59 -0500 Original-Received: by mail-wr1-x430.google.com with SMTP id a9so10526812wrr.8 for ; Thu, 18 Nov 2021 02:25:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :mime-version:content-transfer-encoding; bh=9XpTl3haBsCQ63+GHHYZ07PIlzCJcqDV/wlHZaIAu2w=; b=hwVflmF6ixwHfrlwDVxSgvI5wOZA2vRJUWF2gQGd91Ck7GCr58eJNug3To2JOw9xQh dlrCxwexJkNeGkU9EEBMjXkLPnoMmUuhWuoyAP/xZ4Hxfa0C5hZ4jSCHuyoqw5CuD4pS gYDyVyD+3QKDMrORoWYRF6twE/d5qQ4iFDSuvAy8eP4lqyTg7OFMF2zQnrG/arOpSlMN mVzfUI7esrbqGQRhR8u9gVT3x2vhggsnABUkPjFrOXGnAxshhgznJmhMmSwgwTvD5Kma eG5PyH3GbuFGil85/eRuwQpe6pPVk7ldqv7n4vy/7D6GNTqPVkO09kyIFntbv5ChCZLM 7Xow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:mime-version:content-transfer-encoding; bh=9XpTl3haBsCQ63+GHHYZ07PIlzCJcqDV/wlHZaIAu2w=; b=RN4cjiV9BUru7mrV+nDNkUXU75AgOZPzASbuWMEn/Z/O+eDLhSoIT8AmJopxt74t3y c4LQG6a9PnX7VwKMH6Pd5ZrvYNdUu2oZ7VatvTgcAV7mCVF0fo5Y5GkEx+pNEQpA9mSk uctgWyOFKzQfgrFw+Kb1PV+UmIivfdfTTXMBs532NATjuW4fq3yZxkZzfk1+WZBy/Dgr d28oLhDa+7f4jMJcIhco51oFaA8QF9o59YeLcqBSiBSENNaSxzpRvAA045fWD0UVY9dU 1bweTls8BUMyWsTt736UvFi2LXhm3kK4xeAYreb2qEe8KLQmnBZFKYlx8XXKxrhjBeef TtuA== X-Gm-Message-State: AOAM531A8mQLOvtmcM3yrMEGpBQtf/CPXQGNuTb722M2OB9XKBqZ6vLe G0c8ORkGhDUUzof/zCv9v9B6hQQwzMI= X-Google-Smtp-Source: ABdhPJwsdUfcrPezFQ9Hq9GvWzhQtqPZAV3SaSFoyLT5obmdWm2cMM9uVxfqtFCt5Jafw/eTnK2xGQ== X-Received: by 2002:a5d:6351:: with SMTP id b17mr28753545wrw.151.1637231156121; Thu, 18 Nov 2021 02:25:56 -0800 (PST) Original-Received: from rltb ([2a01:e0a:3f3:fb50:ae11:19b7:f9bd:6f9a]) by smtp.gmail.com with ESMTPSA id b14sm3489696wrd.24.2021.11.18.02.25.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Nov 2021 02:25:55 -0800 (PST) In-Reply-To: <87bl2hn7td.fsf@gnus.org> (Lars Ingebrigtsen's message of "Thu, 18 Nov 2021 10:15:26 +0100") X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::430 (failed) Received-SPF: pass client-ip=2a00:1450:4864:20::430; envelope-from=rpluim@gmail.com; helo=mail-wr1-x430.google.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:279665 Archived-At: >>>>> On Thu, 18 Nov 2021 10:15:26 +0100, Lars Ingebrigtsen said: Lars> Juri Linkov writes: >> But this macro should put a special property to all commands bound >> to repeatable keys. This means that `defvar-keymap' should include >> special-handling of repeatable commands. Lars> I think that should be possible.=20=20 I=CA=BCm sure I=CA=BCve forgotten some subtlety of key definitions, but something like this: diff --git a/lisp/subr.el b/lisp/subr.el index 7ba764880e..b405c80c96 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -6613,27 +6613,44 @@ defvar-keymap =20 In addition to the keywords accepted by `define-keymap', this macro also accepts a `:doc' keyword, which (if present) is used -as the variable documentation string. +as the variable documentation string. Passing in a non-nil +`:repeat' keyword will cause the definitions to be marked as +repeatable. =20 -\(fn VARIABLE-NAME &key DOC FULL PARENT SUPPRESS NAME PREFIX KEYMAP &rest = [KEY DEFINITION]...)" +\(fn VARIABLE-NAME &key DOC FULL PARENT SUPPRESS NAME PREFIX KEYMAP REPEAT= &rest [KEY DEFINITION]...)" (declare (indent 1)) (let ((opts nil) - doc) + doc repeatable props) (while (and defs (keywordp (car defs)) (not (eq (car defs) :menu))) (let ((keyword (pop defs))) (unless defs (error "Uneven number of keywords")) - (if (eq keyword :doc) - (setq doc (pop defs)) + (cond + ((eq keyword :doc) + (setq doc (pop defs))) + ((eq keyword :repeat) + (setq repeatable (pop defs))) + (t (push keyword opts) - (push (pop defs) opts)))) + (push (pop defs) opts))))) (unless (zerop (% (length defs) 2)) (error "Uneven number of key/definition pairs: %s" defs)) - `(defvar ,variable-name + (when repeatable + (let ((defs defs) + def) + (while defs + (pop defs) + (setq def (pop defs)) + (when (or (eq (car def) 'function) + (eq (car def) 'quote)) + (push `(put ,def 'repeat-map ',variable-name) props))))) + `(progn + ,@props + (defvar ,variable-name (define-keymap--define (list ,@(nreverse opts) ,@defs)) - ,@(and doc (list doc))))) + ,@(and doc (list doc)))))) =20 (defmacro with-delayed-message (args &rest body) "Like `progn', but display MESSAGE if BODY takes longer than TIMEOUT sec= onds.