GNU bug report logs - #73016
Potential inclusion of kbd-mode, part of kmonad, in Non-GNU ELPA

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Severity: wishlist; Reported by: Jeremy Bryant <jb@HIDDEN>; dated Tue, 3 Sep 2024 22:21:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.
Severity set to 'wishlist' from 'normal' Request was from Stefan Kangas <stefankangas@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 73016 <at> debbugs.gnu.org:


Received: (at 73016) by debbugs.gnu.org; 14 Sep 2024 10:10:34 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Sep 14 06:10:34 2024
Received: from localhost ([127.0.0.1]:44903 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1spPje-0003Dj-1T
	for submit <at> debbugs.gnu.org; Sat, 14 Sep 2024 06:10:34 -0400
Received: from mout01.posteo.de ([185.67.36.65]:37617)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <philipk@HIDDEN>) id 1spPjb-0003DS-Ry
 for 73016 <at> debbugs.gnu.org; Sat, 14 Sep 2024 06:10:33 -0400
Received: from submission (posteo.de [185.67.36.169]) 
 by mout01.posteo.de (Postfix) with ESMTPS id 8FF42240028
 for <73016 <at> debbugs.gnu.org>; Sat, 14 Sep 2024 12:10:15 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017;
 t=1726308615; bh=bmhZ0kWT97TSn9BbawNHSjH77mG6RsAjO1WUsD6qmWo=;
 h=From:To:Cc:Subject:Autocrypt:OpenPGP:Date:Message-ID:MIME-Version:
 Content-Type:From;
 b=GxTH+gbLkMAo7lTzwVQHwpGUiRKkICJpJDEijOeREeOfRQm1EHBIYQPXxiNMoMCYY
 eG5+EfvYisLXVQ8nMtzcFe9XzKqDqIslQTWEhcukZHactPxMhzlaU2m7cCYhnb4RZ1
 nGC2tAqdP19FF4tF8VIN/1COqnwpUL3ScTRqaTnNoR1GCaJf9xDLYFqQhGn7f8ZUee
 rP9EESJ6EIxn1adAFx1fO1o2+aDCYi72ZVlBhc0tlnU8b3sM1BjEz+UrWdPAcCQEjo
 mrP+a0dE3oGSPnOMWgG1DwZ3V4gIDuItrkxhuRroWEIV+J+N38WqQsYzICp8fCY9us
 UpWhUxrKLhD4w==
Received: from customer (localhost [127.0.0.1])
 by submission (posteo.de) with ESMTPSA id 4X5RkZ3wKFz9rxP;
 Sat, 14 Sep 2024 12:10:14 +0200 (CEST)
From: Philip Kaludercic <philipk@HIDDEN>
To: Tony Zorman <tonyzorman@HIDDEN>
Subject: Re: bug#73016: Potential inclusion of kbd-mode, part of kmonad, in
 Non-GNU ELPA
In-Reply-To: <87cyl6bp96.fsf@hyperspace> (Tony Zorman's message of "Sat, 14
 Sep 2024 10:42:13 +0200")
References: <875xrcfkiy.fsf@HIDDEN> <87wmjqjuiz.fsf@HIDDEN>
 <87cyl6bp96.fsf@hyperspace>
Autocrypt: addr=philipk@HIDDEN; keydata=
 mDMEZBBQQhYJKwYBBAHaRw8BAQdAHJuofBrfqFh12uQu0Yi7mrl525F28eTmwUDflFNmdui0QlBo
 aWxpcCBLYWx1ZGVyY2ljIChnZW5lcmF0ZWQgYnkgYXV0b2NyeXB0LmVsKSA8cGhpbGlwa0Bwb3N0
 ZW8ubmV0PoiWBBMWCAA+FiEEDg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwMFCQHhM4AFCwkI
 BwIGFQoJCAsCBBYCAwECHgECF4AACgkQ8xYDWXahwulikAEA77hloUiSrXgFkUVJhlKBpLCHUjA0
 mWZ9j9w5d08+jVwBAK6c4iGP7j+/PhbkxaEKa4V3MzIl7zJkcNNjHCXmvFcEuDgEZBBQQhIKKwYB
 BAGXVQEFAQEHQI5NLiLRjZy3OfSt1dhCmFyn+fN/QKELUYQetiaoe+MMAwEIB4h+BBgWCAAmFiEE
 Dg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwwFCQHhM4AACgkQ8xYDWXahwukm+wEA8cml4JpK
 NeAu65rg+auKrPOP6TP/4YWRCTIvuYDm0joBALw98AMz7/qMHvSCeU/hw9PL6u6R2EScxtpKnWof
 z4oM
OpenPGP: id=philipk@HIDDEN;
 url="https://keys.openpgp.org/vks/v1/by-email/philipk@HIDDEN";
 preference=signencrypt
Date: Sat, 14 Sep 2024 10:10:13 +0000
Message-ID: <871q1m4kca.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 73016
Cc: Jeremy Bryant <jb@HIDDEN>, 73016 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

Tony Zorman <tonyzorman@HIDDEN> writes:

> On Thu, Sep 05 2024 09:53, Philip Kaludercic wrote:
>>>   :type '(repeat string)
>>>   :group 'kbd-highlight)
>>
>> Where is this group defined?  The applies below.
>
> It was the first expression after the ";;;; Custom variables" comment.
> I've moved it up to the other groups.

1+

>>> (defun kbd-mode--kill-demo-process ()
>>>   "Kill demo kmonad process, if possible."
>>>   (when (get-buffer-process "*kmonad*")
>>>     (kill-process "*kmonad*")))
>>
>> There might be a race condition here.
>
> Mh, can you expand on this? I don't think that the *kmonad* buffer is
> created in the vicinity of this code.

I believe I might have misread something, as I recall thinking about a
`while'-loop.

> Tony

-- 
	Philip Kaludercic on siskin




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73016; Package emacs. Full text available.

Message received at 73016 <at> debbugs.gnu.org:


Received: (at 73016) by debbugs.gnu.org; 14 Sep 2024 08:43:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Sep 14 04:43:08 2024
Received: from localhost ([127.0.0.1]:44756 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1spON1-0006aI-OQ
	for submit <at> debbugs.gnu.org; Sat, 14 Sep 2024 04:43:08 -0400
Received: from mout-p-202.mailbox.org ([80.241.56.172]:50364)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <tonyzorman@HIDDEN>) id 1spOMy-0006Zf-HK
 for 73016 <at> debbugs.gnu.org; Sat, 14 Sep 2024 04:43:06 -0400
Received: from smtp102.mailbox.org (smtp102.mailbox.org
 [IPv6:2001:67c:2050:b231:465::102])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-202.mailbox.org (Postfix) with ESMTPS id 4X5Pn26Dwpz9tDX;
 Sat, 14 Sep 2024 10:42:14 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org;
 s=mail20150812; t=1726303334;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 in-reply-to:in-reply-to:references:references;
 bh=mza1euw9e/3N5U8rlu1vISAVxSLE9qDBck4bDx6ZQP8=;
 b=UUMvRZ7/KcrbVPQ4Sf+4g4WsDlyxsXOpIcRW57Lra+lO7JgIyiOjQVS1WVs5VywI2R51wQ
 nESY/XYZknaRnOAxTM2grouuQoyzqqXv8xs7Tegca5mFbkmKJWTk5xAkhykY4RIKOty+5k
 3yWku6xhUTYi2jcX8F0VNSaoyxstyXsa5na6TkLiiu/30L4afD8cMcT3qp2gr2fF01kneQ
 jbQ9z/aaGbH+fF622W70cqbPG7t/B3UlmN94LaulE6ueC7CnUMcjsxdXOcdsiK6JuQYZ3c
 dKUUPVWriLEahepwuSJRiNqiVHYIMis3UzXOa6xvJbkWI5bLf94sgaew8jSahw==
From: Tony Zorman <tonyzorman@HIDDEN>
To: Philip Kaludercic <philipk@HIDDEN>, Jeremy Bryant <jb@HIDDEN>
Subject: Re: bug#73016: Potential inclusion of kbd-mode, part of kmonad, in
 Non-GNU ELPA
In-Reply-To: <87wmjqjuiz.fsf@HIDDEN>
References: <875xrcfkiy.fsf@HIDDEN> <87wmjqjuiz.fsf@HIDDEN>
Date: Sat, 14 Sep 2024 10:42:13 +0200
Message-ID: <87cyl6bp96.fsf@hyperspace>
MIME-Version: 1.0
Content-Type: text/plain
X-MBO-RS-ID: 7d4cd1243c31d82d8b6
X-MBO-RS-META: t4woeycty11bke93hdnxdk6g1ssp41co
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 73016
Cc: 73016 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

On Thu, Sep 05 2024 09:53, Philip Kaludercic wrote:
>>   :type '(repeat string)
>>   :group 'kbd-highlight)
>
> Where is this group defined?  The applies below.

It was the first expression after the ";;;; Custom variables" comment.
I've moved it up to the other groups.

>> (defun kbd-mode--kill-demo-process ()
>>   "Kill demo kmonad process, if possible."
>>   (when (get-buffer-process "*kmonad*")
>>     (kill-process "*kmonad*")))
>
> There might be a race condition here.

Mh, can you expand on this? I don't think that the *kmonad* buffer is
created in the vicinity of this code.

Tony

-- 
Tony Zorman | https://tony-zorman.com




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73016; Package emacs. Full text available.

Message received at 73016 <at> debbugs.gnu.org:


Received: (at 73016) by debbugs.gnu.org; 6 Sep 2024 11:49:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Sep 06 07:49:46 2024
Received: from localhost ([127.0.0.1]:52354 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1smXTG-0001ZM-BU
	for submit <at> debbugs.gnu.org; Fri, 06 Sep 2024 07:49:46 -0400
Received: from mout-p-102.mailbox.org ([80.241.56.152]:50350)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <tonyzorman@HIDDEN>) id 1smXTD-0001Ym-Ck
 for 73016 <at> debbugs.gnu.org; Fri, 06 Sep 2024 07:49:44 -0400
Received: from smtp102.mailbox.org (smtp102.mailbox.org
 [IPv6:2001:67c:2050:b231:465::102])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
 (No client certificate requested)
 by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4X0Y4j3sX2z9skX;
 Fri,  6 Sep 2024 12:53:57 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org;
 s=mail20150812; t=1725620037;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
 content-transfer-encoding:content-transfer-encoding:
 in-reply-to:in-reply-to:references:references;
 bh=OU1hmn9kxBQL7ANh3+ZoVkBCyvLJ7VQFg+nxmdyr9A8=;
 b=G2/trzvtd8iny1oO/X5C6bsrDCgGUTbgzS0PSAEhf1ralBhpuXwr2v0qybZIEmks5a+zSB
 uPc1gtBWbBOdMgFOMUSyVgFJWpHaZnNtmhT/M3BB6WWgVYGw73pTiYGVUQutKfsPvs5PGW
 AfnGx4ADkftGIA3oWKLVvveW4ZSuJWsIKokiLUxgjnoJiJy0Vj6WdJbPapI/IF8bAkUfsq
 AnYB3jPxFF/lOf+ih5EeOJmIUuHnlFWSeq1Hts7EdlbqloCR+ZL9lfZJtfOv8raURMv5ey
 lZd6kgXar45jIEQrf1x0J78/qNaivUuO3e7bbfE072SVPq8b9RM97zQjEcWO8Q==
From: Tony Zorman <tonyzorman@HIDDEN>
To: Philip Kaludercic <philipk@HIDDEN>, Jeremy Bryant <jb@HIDDEN>
Subject: Re: bug#73016: Potential inclusion of kbd-mode, part of kmonad, in
 Non-GNU ELPA
In-Reply-To: <87wmjqjuiz.fsf@HIDDEN>
References: <875xrcfkiy.fsf@HIDDEN> <87wmjqjuiz.fsf@HIDDEN>
Date: Fri, 06 Sep 2024 12:53:53 +0200
Message-ID: <87r09x59z2.fsf@hyperspace>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-MBO-RS-META: 6fexioocjq96nnbkizxqx66fxwnzo3ug
X-MBO-RS-ID: a623028260f8a805128
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 73016
Cc: 73016 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

Hi,

thanks to Jeremy for submitting this, and to Philip for reviewing! I'm
travelling right now, so I'll keep this short; more to come in a few
days I hope.
=20
On Thu, Sep 05 2024 09:53, Philip Kaludercic wrote:
> [=E2=80=A6 12 lines elided =E2=80=A6]
>
>> On behalf of the author, Tony Zorman, I would like to request
>> consideration to include it in NON-GNU ELPA.
>
> Just for the sake of the protocol, is there a reason against adding the
> package to GNU ELPA?

There has been at least one non-trivial contribution to the package, as
well as several smaller ones. While I have assigned copyright to the FSF
for Emacs and ELPA related things, I don't know whether the same can be
said of the other contributors.

>> The author is conscious that the following snippet should be improved
>> and we are soliciting recommendations on how to improve it.
>>   ;; HACK
>>   (defadvice redisplay (after refresh-font-locking activate)
>>     (when (derived-mode-p 'kbd-mode)
>>       (font-lock-fontify-buffer))))
>
> I agree, we should get rid of that.  But first, what is the intention?
> What breaks if we just remove this advice?

When specifying the keyboard layout, the configuration language accepts
most special symbols verbatim (as in, one can just write @ to have that
symbol bound to a key). This includes " for double quotes, meaning the
highlighting of strings has to be taken care of be the mode=E2=80=94at leas=
t, I
think so. This produces inconsistent behaviour that I was never really a
fan of, especially when moving things around. For example, going from=20

    (f "string")

to=20

    (f
     "string")

would "unhighlight" the string until one refreshes the syntax
highlighting for the buffer via e.g. font-lock-update, or wait until
this happens by itself. The advice is nothing more but a band-aid such
that the latter happens more often.

It may well be that I overlooked something about Emacs's way of going
about string highlighting back when I wrote the mode, and so far I
haven't had the drive to look back into this.

  Tony

--=20
Tony Zorman | https://tony-zorman.com




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73016; Package emacs. Full text available.

Message received at 73016 <at> debbugs.gnu.org:


Received: (at 73016) by debbugs.gnu.org; 5 Sep 2024 09:55:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Sep 05 05:55:13 2024
Received: from localhost ([127.0.0.1]:36200 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1sm9Cq-0001VG-1Z
	for submit <at> debbugs.gnu.org; Thu, 05 Sep 2024 05:55:13 -0400
Received: from mout02.posteo.de ([185.67.36.66]:43013)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <philipk@HIDDEN>) id 1sm9Cn-0001Uz-06
 for 73016 <at> debbugs.gnu.org; Thu, 05 Sep 2024 05:55:10 -0400
Received: from submission (posteo.de [185.67.36.169]) 
 by mout02.posteo.de (Postfix) with ESMTPS id BE2BD240103
 for <73016 <at> debbugs.gnu.org>; Thu,  5 Sep 2024 11:53:57 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017;
 t=1725530037; bh=EgGUrgLdXiCY/RMJy5wmTpNMWbLXB4lgwTaWCf0UuRM=;
 h=From:To:Cc:Subject:Autocrypt:OpenPGP:Date:Message-ID:MIME-Version:
 Content-Type:Content-Transfer-Encoding:From;
 b=chBawEnTfknjS5RetVOak5RpvplfjPbOThY2XakJ7ui8/p5vjye5ixs5eM7km3iqb
 nKNprjeN41ltEL8VXusF07YJr4Km2dlKhsouHYC4/uRq9qJOrZ2UJ8vb4T3dhLQq4O
 /qpkZYU8TCGiWPsXZdAKTc5YlueWTIE3/bjGwmn1Sy8MFyzFjJeVJsKDqA9Yc9SzrN
 XwfUvPXP9VayFY/rnEKIARMJfZAxtKz1l+a5t2Zt6qaIVrTLL/Iu3imsCq8uIPI+7e
 /G8mU3SKy682oaj2GVLlveSamMo4AJG5oW8k3Lgic4mGP0L2IQnmIn5bNTZFPyW8As
 yu0R8Ulsceqnw==
Received: from customer (localhost [127.0.0.1])
 by submission (posteo.de) with ESMTPSA id 4Wzvnx09X4z6twR;
 Thu,  5 Sep 2024 11:53:56 +0200 (CEST)
From: Philip Kaludercic <philipk@HIDDEN>
To: Jeremy Bryant <jb@HIDDEN>
Subject: Re: bug#73016: Potential inclusion of kbd-mode, part of kmonad, in
 Non-GNU ELPA
In-Reply-To: <875xrcfkiy.fsf@HIDDEN> (Jeremy Bryant's message of
 "Tue, 03 Sep 2024 23:19:01 +0100")
References: <875xrcfkiy.fsf@HIDDEN>
Autocrypt: addr=philipk@HIDDEN; keydata=
 mDMEZBBQQhYJKwYBBAHaRw8BAQdAHJuofBrfqFh12uQu0Yi7mrl525F28eTmwUDflFNmdui0QlBo
 aWxpcCBLYWx1ZGVyY2ljIChnZW5lcmF0ZWQgYnkgYXV0b2NyeXB0LmVsKSA8cGhpbGlwa0Bwb3N0
 ZW8ubmV0PoiWBBMWCAA+FiEEDg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwMFCQHhM4AFCwkI
 BwIGFQoJCAsCBBYCAwECHgECF4AACgkQ8xYDWXahwulikAEA77hloUiSrXgFkUVJhlKBpLCHUjA0
 mWZ9j9w5d08+jVwBAK6c4iGP7j+/PhbkxaEKa4V3MzIl7zJkcNNjHCXmvFcEuDgEZBBQQhIKKwYB
 BAGXVQEFAQEHQI5NLiLRjZy3OfSt1dhCmFyn+fN/QKELUYQetiaoe+MMAwEIB4h+BBgWCAAmFiEE
 Dg7HY17ghYlni8XN8xYDWXahwukFAmQQUEICGwwFCQHhM4AACgkQ8xYDWXahwukm+wEA8cml4JpK
 NeAu65rg+auKrPOP6TP/4YWRCTIvuYDm0joBALw98AMz7/qMHvSCeU/hw9PL6u6R2EScxtpKnWof
 z4oM
OpenPGP: id=philipk@HIDDEN;
 url="https://keys.openpgp.org/vks/v1/by-email/philipk@HIDDEN";
 preference=signencrypt
Date: Thu, 05 Sep 2024 09:53:56 +0000
Message-ID: <87wmjqjuiz.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 73016
Cc: Tony Zorman <tonyzorman@HIDDEN>, 73016 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

Jeremy Bryant <jb@HIDDEN> writes:

> Hi,
>
> kmonad is a keyboard configuration tool under MIT license.
> https://github.com/kmonad/kmonad
>
> There is an Emacs major mode to edit the configuration file, based on
> s-expressions.  The mode is under GPLv3.
> https://github.com/kmonad/kbd-mode

I don't see a reason to add the package in principle.

> On behalf of the author, Tony Zorman, I would like to request
> consideration to include it in NON-GNU ELPA.

Just for the sake of the protocol, is there a reason against adding the
package to GNU ELPA?

> The author is conscious that the following snippet should be improved
> and we are soliciting recommendations on how to improve it.
>   ;; HACK
>   (defadvice redisplay (after refresh-font-locking activate)
>     (when (derived-mode-p 'kbd-mode)
>       (font-lock-fontify-buffer))))

I agree, we should get rid of that.  But first, what is the intention?
What breaks if we just remove this advice?

> Furthermore if there are any code reviews or recommendations, I attach
> the current version.
>
> I can volunteer some time for some of the changes.
>
> ;;; kbd-mode.el --- Font locking for kmonad's .kbd files -*- lexical-bind=
ing: t -*-
>
> ;; Copyright 2020=E2=80=932022  slotThe
> ;; URL: https://github.com/kmonad/kbd-mode
> ;; Version: 0.0.1
> ;; Package-Requires: ((emacs "24.3"))
>
> ;; This file 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 3, or (at your option)
> ;; any later version.
> ;;
> ;; This file is distributed in the hope that it will be useful,
> ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
> ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ;; GNU General Public License for more details.
> ;;
> ;; You should have received a copy of the GNU General Public License
> ;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
>
> ;;; Commentary:
>
> ;; This file adds basic font locking support for `.kbd' configuration
> ;; files.
> ;;
> ;; To use this file, move it to a directory within your `load-path' and
> ;; require it.  For example --- assuming that this file was placed
> ;; within the `~/.config/emacs/elisp' directory:
> ;;
> ;;     (add-to-list 'load-path "~/.config/emacs/elisp/")
> ;;     (require 'kbd-mode)
> ;;
> ;; If you use `use-package', you can express the above as
> ;;
> ;;     (use-package kbd-mode
> ;;       :load-path "~/.config/emacs/elisp/")

Installation instructions are usually out-of-place in the commentary
section.  Perhaps add a `;;; Installation:` section instead, so that we
keep it apart from the documentation that describe-package displays?

> ;;
> ;; By default we highlight all keywords; you can change this by
> ;; customizing the `kbd-mode-' variables.  For example, to disable the
> ;; highlighting of already defined macros (i.e. of "@macro-name"), you
> ;; can set `kbd-mode-show-macros' to `nil'.
> ;;
> ;; For keybindings, as well as commentary on the `kbd-mode-demo-mode'
> ;; minor mode, see the associated README.md file.
>
> ;;; Code:
>
> (require 'compile)
>
> (defgroup kbd nil
>   "Major mode for editing `.kbd' files."
>   :group 'languages)
>
> (defgroup kbd-demo nil
>   "A minor mode to test your configuration."
>   :group 'kbd)
>
> ;;;; Custom variables
>
> (defgroup kbd-highlight nil
>   "Syntax highlighting for `kbd-mode'."
>   :group 'kbd)
>
> (defcustom kbd-mode-kexpr
>   '("defcfg" "defsrc" "defalias")
>   "A K-Expression."

This documentation should be expanded on.

>   :type '(repeat string)
>   :group 'kbd-highlight)

Where is this group defined?  The applies below.
>
> ;; HACK
> (defcustom kbd-mode-function-one
>   '("deflayer")
>   "Tokens that are treated as functions with one argument."
>   :type '(repeat string)
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-tokens
>   '(;; input tokens
>     "uinput-sink" "send-event-sink" "kext"
>     ;; output tokens
>     "device-file" "low-level-hook" "iokit-name")
>   "Input and output tokens."
>   :type '(repeat string)
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-defcfg-options
>   '("input" "output" "cmp-seq-delay" "cmp-seq" "init" "fallthrough" "allo=
w-cmd")
>   "Options to give to `defcfg'."
>   :type '(repeat string)
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-button-modifiers
>   '("around-next-timeout" "around-next-single" "around-next" "around"
>     "tap-hold-next-release" "tap-hold-next" "tap-next-release" "tap-hold"
>     "tap-macro-release" "tap-macro" "multi-tap" "tap-next" "layer-toggle"
>     "layer-switch" "layer-add" "layer-rem" "layer-delay" "layer-next" "cm=
d-button")
>   "Button modifiers."
>   :type '(repeat string)
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-show-string
>   '("uinput-sink" "device-file" "cmd-button")
>   "Syntax highlight strings in S-expressions.
> When an S-expression begins with any of these keywords, highlight
> strings (delimited by double quotes) inside it."
>   :type '(repeat string)
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-show-macros t
>   "Whether to syntax highlight macros inside layout definitions.
> Default: t"

Documenting the default is usually not necessary, as customise already
remembers is.

>   :type 'boolean
>   :group 'kbd-highlight)
>
> (defcustom kbd-mode-magic-focus nil
>   "Whether to enable magic focus.
> Whenever the `kbd-mode-demo-mode' buffer gets focused,
> automatically start try to start a new process for the config
> file.  When switching back to the config file, kill that process.
>
> Default: nil"
>   :type 'boolean
>   :group 'kbd-demo)
>
> (defcustom kbd-mode-kill-kmonad nil
>   "How to kill (or suspend) a running kmonad instance.
> This is used when invoking `kbd-mode-start-demo' and, in general,
> when entering `kbd-mode-demo-mode' because keyboards can't be
> grabbed twice."
>   :type 'string
>   :group 'kbd-demo)
>
> (defcustom kbd-mode-start-kmonad nil
>   "How to restart (or resume) kmonad.
> If there was an active kmonad instance running, which was killed
> by `kbd-mode-kill-kmonad', then this (re)starts kmonad with the
> given command upon exiting `kbd-mode-demo-mode'."
>   :type 'string
>   :group 'kbd-demo)
>
> ;;;; Faces
>
> (defgroup kbd-highlight-faces nil
>   "Faces used for highlighting in `kbd-mode'."
>   :group 'kbd-highlight)
>
> (defface kbd-mode-kexpr-face
>   '((t :inherit font-lock-keyword-face))
>   "Face for a K-Expression."
>   :group 'kbd-highlight-faces)
>
> (defface kbd-mode-token-face
>   '((t :inherit font-lock-function-name-face))
>   "Face for input and output tokens."
>   :group 'kbd-highlight-faces)
>
> (defface kbd-mode-defcfg-option-face
>   '((t :inherit font-lock-builtin-face))
>   "Face for options one may give to `defcfg'."
>   :group 'kbd-highlight-faces)
>
> (defface kbd-mode-button-modifier-face
>   '((t :inherit font-lock-function-name-face))
>   "Face for all the button modifiers."
>   :group 'kbd-highlight-faces)
>
> (defface kbd-mode-variable-name-face
>   '((t :inherit font-lock-variable-name-face))
>   "Face for a variables, i.e. layer names, macros in layers,..."
>   :group 'kbd-highlight-faces)
>
> (defface kbd-mode-string-face
>   '((t :inherit font-lock-string-face))
>   "Face for strings."
>   :group 'kbd-highlight-faces)
>
> ;;;; Functions
>
> (defun kbd-mode--show-macros? (show-macros)

A -p would be more conventional for Elisp.

>   "Decide whether to font-lock macros.
> If the argument SHOW-MACROS is non-nil, font-lock macros of the
> form `@MACRO-NAME' with `kbd-mode-variable-name-face'."
>   (let ((macro-regexp '(("\\(:?\\(@[^[:space:]]+\\)\\)"
>                          (1 'kbd-mode-variable-name-face)))))
>     (if show-macros
>         (font-lock-add-keywords 'kbd-mode macro-regexp)
>       (font-lock-remove-keywords 'kbd-mode macro-regexp))))
>
> ;;; Vars
>
> (defvar kbd-mode-syntax-table
>   (let ((st (make-syntax-table)))
>     ;; Use ;; for regular comments and #| |# for line comments.
>     (modify-syntax-entry ?\; ". 12b" st)
>     (modify-syntax-entry ?\n "> b"   st)
>     (modify-syntax-entry ?\# ". 14"  st)
>     (modify-syntax-entry ?\| ". 23"  st)
>     ;; We don't need to highlight brackets, as they're only used inside
>     ;; layouts.
>     (modify-syntax-entry ?\[ "."     st)
>     (modify-syntax-entry ?\] "."     st)
>     ;; We highlight the necessary strings ourselves.
>     (modify-syntax-entry ?\" "."     st)
>     st)
>   "The basic syntax table for `kbd-mode'.")
>
> (defvar kbd-mode--font-lock-keywords
>   (let ((kexpr-regexp            (regexp-opt kbd-mode-kexpr            'w=
ords))
>         (token-regexp            (regexp-opt kbd-mode-tokens           'w=
ords))
>         (defcfg-options-regexp   (regexp-opt kbd-mode-defcfg-options   'w=
ords))
>         (button-modifiers-regexp (regexp-opt kbd-mode-button-modifiers 'w=
ords))
>         (function-one-regexp
>          (concat "\\(?:\\("
>                  (regexp-opt kbd-mode-function-one)
>                  "\\)\\([[:space:]]+[[:word:]]+\\)\\)"))
>         ;; Only highlight these strings; configuration files may explicit=
ly
>         ;; use a " to emit a double quote, so we can't trust the default
>         ;; string highlighting.
>         (string-regexp
>          (concat "\\(['\(]"
>                  (regexp-opt kbd-mode-show-string)
>                  "\\)\\(\\S)+\\)\)")))
>     `((,token-regexp            (1 'kbd-mode-token-face          ))
>       (,kexpr-regexp            (1 'kbd-mode-kexpr-face          ))
>       (,button-modifiers-regexp (1 'kbd-mode-button-modifier-face))
>       (,defcfg-options-regexp   (1 'kbd-mode-defcfg-option-face  ))
>       (,function-one-regexp
>        (1 'kbd-mode-kexpr-face        )
>        (2 'kbd-mode-variable-name-face))
>       (,string-regexp
>        ("\"[^}]*?\""
>         (progn (goto-char (match-beginning 0)) (match-end 0))
>         (goto-char (match-end 0))
>         (0 'kbd-mode-string-face t)))))
>   "Keywords to be syntax highlighted.")
>
> ;;; Define Major Mode
>
> ;; Because the configuration language is in a lispy syntax, we can
> ;; inherit from any lisp mode in order to get good parenthesis handling
> ;; for free.
>
> (defvar kbd-mode-map
>   (let ((map (make-sparse-keymap)))
>     (define-key map (kbd "C-c C-c") #'kbd-mode-start-demo)
>     (define-key map (kbd "C-c C-z") #'kbd-mode-switch)
>     map))
>
> ;;;###autoload
> (define-derived-mode kbd-mode emacs-lisp-mode "Kbd"
>   "Major mode for editing `.kbd' files.
>
> For details, see `https://github.com/kmonad/kmonad'."
>   (set-syntax-table kbd-mode-syntax-table)
>   (use-local-map kbd-mode-map)
>   (font-lock-add-keywords 'kbd-mode kbd-mode--font-lock-keywords)
>   (kbd-mode--show-macros? kbd-mode-show-macros)
>   ;; HACK
>   (defadvice redisplay (after refresh-font-locking activate)
>     (when (derived-mode-p 'kbd-mode)
>       (font-lock-fontify-buffer))))

I didn't realise that this was being evaluated every time the major mode
is initialised...

>
> ;; Associate the `.kbd' ending with `kbd-mode'.
> ;;;###autoload
> (add-to-list 'auto-mode-alist '("\\.kbd\\'" . kbd-mode))
>
> ;;;; Demo Minor Mode
>
> (defvar kbd-mode-demo-file nil
>   "Path to the users configuration file.
> This is used in `kbd-mode-demo-mode' for deciding what
> configuration to compile.")
>
> (defvar kbd-mode-had-kmonad? nil
>   "Whether the user had a running kmonad instance.
> This controls whether kmonad will be restarted by mean of
> `kbd-mode-start-kmonad' after exiting `kbd-mode-demo-mode'.")
>
> (defvar kbd-mode-demo-mode-map
>   (let ((map (make-sparse-keymap)))
>     (define-key map (kbd "C-c C-c") #'kbd-mode-stop-demo)
>     (define-key map (kbd "C-c C-z") #'kbd-mode-switch)
>     map))
>
> ;;;###autoload
> (define-minor-mode kbd-mode-demo-mode
>   "Toggle kmonad demo mode.
> This is a minor mode, in which users can test their
> configurations."
>   :lighter " kbd-demo"
>   :keymap kbd-mode-demo-mode-map

This should be inferred.

>
>   (when kbd-mode-demo-mode
>     (unless (kbd-mode--valid-config?)
>       (kbd-mode--show-error)))
>
>   ;; Handle toggle
>   (when kbd-mode-magic-focus
>     (cond (kbd-mode-demo-mode
>            (add-hook 'window-selection-change-functions #'kbd-mode--toggl=
e-demo nil t)
>            (add-hook 'focus-in-hook #'kbd-mode--create-kmonad-process nil=
 t)
>            (add-hook 'focus-out-hook #'kbd-mode--kill-demo-process nil t))
>           (t
>            (remove-hook 'window-selection-change-functions #'kbd-mode--to=
ggle-demo t)
>            (remove-hook 'focus-in-hook #'kbd-mode--create-kmonad-process =
t)
>            (remove-hook 'focus-out-hook #'kbd-mode--kill-demo-process t))=
)))
>
> ;;;; Interactive Functions
>
> ;;;###autoload
> (defun kbd-mode-start-demo ()
>   "Try the current configuration in a demo buffer.
> Use `kbd-mode-stop-demo' to stop the demo.  If the configuration
> file has errors, the demo will not start and an error buffer will
> be shown instead."
>   (interactive)
>   (setq kbd-mode-demo-file
>         (kbd-mode--find-kbd-file (buffer-file-name (current-buffer))))
>   (if (not (kbd-mode--valid-config?))
>       (kbd-mode--show-error)
>     (when (shell-command "ps -C kmonad")

Shell-command is usually used for interactive stuff.  And I don't know
what you are trying to test the return value for here.

(shell-command "true") ;;=3D> 0
(shell-command "false") ;;=3D> 1
(shell-command "foo") ;;=3D> 127

As the documentation says:

        In Elisp, you will often be better served by calling =E2=80=98call-=
process=E2=80=99 or
        =E2=80=98start-process=E2=80=99 directly, since they offer more con=
trol and do not
        impose the use of a shell (with its need to quote arguments).


>       (setq kbd-mode-had-kmonad? t)
>       (kbd-mode--kill-kmonad))
>     (kbd-mode--create-demo-buffer)
>     (pop-to-buffer "*kmonad-demo*")
>     (kbd-mode--create-kmonad-process)
>     (kbd-mode-demo-mode t)))
>
> (defun kbd-mode-stop-demo ()
>   "Stop the currently running demo."
>   (interactive)
>   (with-current-buffer "*kmonad-demo*"
>     (kbd-mode-demo-mode 0)
>     (kill-buffer-and-window)
>     (kbd-mode--kill-demo-process)
>     (when kbd-mode-had-kmonad?
>       (kbd-mode--start-kmonad))))
>
> (defun kbd-mode-switch ()
>   "Switch between the demo window and the config file."
>   (interactive)
>   (select-window (get-buffer-window
>                   (if (and (equal (buffer-name) "*kmonad-demo*")
>                            kbd-mode-demo-mode)
>                       (get-file-buffer kbd-mode-demo-file)
>                     "*kmonad-demo*"))))
>
> ;;;; Helper Functions
>
> (defun kbd-mode--create-demo-buffer ()
>   "Create the *kmonad-demo* buffer."
>   (unless (get-buffer "*kmonad-demo*")
>     (display-buffer (get-buffer-create "*kmonad-demo*")
>                     '(display-buffer-at-bottom
>                       (window-height . 0.15)))))
>
> (defun kbd-mode--find-kbd-file (&optional file)
>   "Find the config file.
> If the optional argument FILE is given, use it instead.
> Otherwise, prompt the user for a choice."
>   (if (and file (string=3D (file-name-extension file) "kbd"))
>       file
>     (expand-file-name (read-file-name "Choose configuration file"))))
>
> (defun kbd-mode--valid-config? ()
>   "Check if the current configuration is valid."
>   (let ((command (kbd-mode--get-config-validation-command)))
>     (eq 0 (shell-command command))))
>
> (defun kbd-mode--create-kmonad-process ()
>   "Start the kmonad demo process in a dedicated buffer."
>   (when (get-buffer-process "*kmonad*")
>     (kbd-mode--kill-demo-process))
>   (start-process "kmonad-emacs" "*kmonad*" "kmonad" kbd-mode-demo-file))
>
> (defun kbd-mode--kill-demo-process ()
>   "Kill demo kmonad process, if possible."
>   (when (get-buffer-process "*kmonad*")
>     (kill-process "*kmonad*")))

There might be a race condition here.

>
> (defun kbd-mode--kill-kmonad ()
>   "Kill (or suspend) a running kmonad instance.
> The command used to kill kmonad is given by the
> `kbd-mode-kill-kmonad' variable."
>   (if kbd-mode-kill-kmonad
>       (shell-command kbd-mode-kill-kmonad)
>     (error "To kill the running kmonad instance, customize the `kbd-mode-=
kill-kmonad' variable!")))
>
> (defun kbd-mode--start-kmonad ()
>   "Start (or resume) a new kmonad process.
> The command used to start kmonad is given by the
> `kbd-mode-start-kmonad' variable."
>   (if kbd-mode-kill-kmonad
>       (call-process-shell-command
>        ;; Force the command to be executed asynchronously.
>        (if (eq (aref kbd-mode-start-kmonad

If you always know that you are comparing character codes, I'd use =3D to
be more specific and trigger an error if something else occurs.

>                      (1- (length kbd-mode-start-kmonad)))
>                ?&)
>            kbd-mode-start-kmonad
>          (concat kbd-mode-start-kmonad "&")))
>     (error "To restart kmonad, customize the `kbd-mode-start-kmonad' vari=
able!")))
>
> (defun kbd-mode--toggle-demo (&optional _window)
>   "Toggle the kmonad demo process.
> When the users exits the demo window, kill the demo process and
> start a \"normal\" kmonad process instead.  When re-entering the
> demo window, do the opposite; i.e., kill the running kmonad
> instance and spawn a demo process."
>   (cond ((kbd-mode--was-demo?)
>          (kbd-mode--kill-demo-process)
>          (kbd-mode--start-kmonad))
>         ((kbd-mode--valid-config?)
>          (kbd-mode--kill-kmonad)
>          (kbd-mode--create-kmonad-process))
>         (t
>          (kbd-mode--start-kmonad)
>          (kbd-mode--show-error))))
>
> (defun kbd-mode--was-demo? ()
>   "Was the previous buffer the kmonad demo buffer?"
>   (equal (window-buffer (previous-window))

eq should be enough here.

>          (get-buffer "*kmonad-demo*")))
>
> (defun kbd-mode--show-error ()
>   "Show configuration errors in a compilation buffer."
>   (when kbd-mode-demo-mode
>     (quit-window 'kill "*kmonad-demo*"))
>   (compile (kbd-mode--get-config-validation-command)))
>
> (defun kbd-mode--get-config-validation-command ()
>   "Get validation command for `kbd-mode-demo-file'."
>   (concat "kmonad -d " kbd-mode-demo-file))
>
> ;;;; Integration with `compilation-mode'
>
> (add-to-list 'compilation-error-regexp-alist 'kbd)
> (add-to-list 'compilation-error-regexp-alist-alist
>              '(kbd "^kmonad: Parse error at \\([0-9]+\\):\\([0-9]+\\)" ni=
l 1 2))
>
> (provide 'kbd-mode)
>
> ;;; kbd-mode.el ends here

All in all it looks fine, most of my superficial comments are nitpicks.

--=20
	Philip Kaludercic on siskin




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73016; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 3 Sep 2024 22:20:19 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Sep 03 18:20:19 2024
Received: from localhost ([127.0.0.1]:32959 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1slbsp-0001oC-3P
	for submit <at> debbugs.gnu.org; Tue, 03 Sep 2024 18:20:19 -0400
Received: from lists.gnu.org ([209.51.188.17]:46970)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <jb@HIDDEN>) id 1slbsn-0001o3-85
 for submit <at> debbugs.gnu.org; Tue, 03 Sep 2024 18:20:17 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jb@HIDDEN>)
 id 1slbrm-0002FR-5l
 for bug-gnu-emacs@HIDDEN; Tue, 03 Sep 2024 18:19:14 -0400
Received: from out-189.mta0.migadu.com ([91.218.175.189])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jb@HIDDEN>)
 id 1slbri-0000dD-Un
 for bug-gnu-emacs@HIDDEN; Tue, 03 Sep 2024 18:19:13 -0400
X-Report-Abuse: Please report any abuse attempt to abuse@HIDDEN and
 include these headers.
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jeremybryant.net;
 s=key1; t=1725401943;
 h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
 to:to:cc:cc:mime-version:mime-version:content-type:content-type;
 bh=sYwrECLLNzRBsWcK2vByEsRbruW1+puby50ghR4AQJs=;
 b=Y6Mu3uf1w0rMj8CrrJG6ZQ2/EdecCalQ6GYXJxACuogoZqk/K4KUcZ2C96BCFPEPD1ppeq
 SYpzo1yeMsv3bOLw1fl5eRAPeEznv1/xFdGL3rqs0cZo9ygVPJeJ74mJtLi1SLU/TEsrTU
 iRryHaJJw5LvjCT/ao522qXyz4VQcv/H6DwZ//ZxiDup994zNj0NjqcOq0Sl9W4o03Bnjx
 gBDJ10RCt+GnoBjXWsy0AarXnXJ1CLmQirDbSRK1z7g9wXg/LaHGLZezexW9156upG86cw
 0AQDZrpfRNDp/3MHezlkoty08DA2QVHHQSxLWHpmz/vtpRO/2sp0JbwQ4z2IJA==
From: Jeremy Bryant <jb@HIDDEN>
To: bug-gnu-emacs@HIDDEN, Philip Kaludercic <philipk@HIDDEN>
Subject: Potential inclusion of kbd-mode, part of kmonad, in Non-GNU ELPA
Date: Tue, 03 Sep 2024 23:19:01 +0100
Message-ID: <875xrcfkiy.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Migadu-Flow: FLOW_OUT
Received-SPF: pass client-ip=91.218.175.189; envelope-from=jb@HIDDEN;
 helo=out-189.mta0.migadu.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 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,
 RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,
 SPF_HELO_PASS=-0.001, SPF_PASS=-0.001,
 T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.4 (-)
X-Debbugs-Envelope-To: submit
Cc: Tony Zorman <tonyzorman@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.4 (--)

--=-=-=
Content-Type: text/plain

Hi,

kmonad is a keyboard configuration tool under MIT license.
https://github.com/kmonad/kmonad

There is an Emacs major mode to edit the configuration file, based on
s-expressions.  The mode is under GPLv3.
https://github.com/kmonad/kbd-mode

On behalf of the author, Tony Zorman, I would like to request
consideration to include it in NON-GNU ELPA.

The author is conscious that the following snippet should be improved
and we are soliciting recommendations on how to improve it.
  ;; HACK
  (defadvice redisplay (after refresh-font-locking activate)
    (when (derived-mode-p 'kbd-mode)
      (font-lock-fontify-buffer))))

Furthermore if there are any code reviews or recommendations, I attach
the current version.

I can volunteer some time for some of the changes.


--=-=-=
Content-Type: application/emacs-lisp
Content-Disposition: attachment; filename=kbd-mode.el
Content-Transfer-Encoding: quoted-printable

;;; kbd-mode.el --- Font locking for kmonad's .kbd files -*- lexical-bindin=
g: t -*-

;; Copyright 2020=E2=80=932022  slotThe
;; URL: https://github.com/kmonad/kbd-mode
;; Version: 0.0.1
;; Package-Requires: ((emacs "24.3"))

;; This file 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 3, or (at your option)
;; any later version.
;;
;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This file adds basic font locking support for `.kbd' configuration
;; files.
;;
;; To use this file, move it to a directory within your `load-path' and
;; require it.  For example --- assuming that this file was placed
;; within the `~/.config/emacs/elisp' directory:
;;
;;     (add-to-list 'load-path "~/.config/emacs/elisp/")
;;     (require 'kbd-mode)
;;
;; If you use `use-package', you can express the above as
;;
;;     (use-package kbd-mode
;;       :load-path "~/.config/emacs/elisp/")
;;
;; By default we highlight all keywords; you can change this by
;; customizing the `kbd-mode-' variables.  For example, to disable the
;; highlighting of already defined macros (i.e. of "@macro-name"), you
;; can set `kbd-mode-show-macros' to `nil'.
;;
;; For keybindings, as well as commentary on the `kbd-mode-demo-mode'
;; minor mode, see the associated README.md file.

;;; Code:

(require 'compile)

(defgroup kbd nil
  "Major mode for editing `.kbd' files."
  :group 'languages)

(defgroup kbd-demo nil
  "A minor mode to test your configuration."
  :group 'kbd)

;;;; Custom variables

(defgroup kbd-highlight nil
  "Syntax highlighting for `kbd-mode'."
  :group 'kbd)

(defcustom kbd-mode-kexpr
  '("defcfg" "defsrc" "defalias")
  "A K-Expression."
  :type '(repeat string)
  :group 'kbd-highlight)

;; HACK
(defcustom kbd-mode-function-one
  '("deflayer")
  "Tokens that are treated as functions with one argument."
  :type '(repeat string)
  :group 'kbd-highlight)

(defcustom kbd-mode-tokens
  '(;; input tokens
    "uinput-sink" "send-event-sink" "kext"
    ;; output tokens
    "device-file" "low-level-hook" "iokit-name")
  "Input and output tokens."
  :type '(repeat string)
  :group 'kbd-highlight)

(defcustom kbd-mode-defcfg-options
  '("input" "output" "cmp-seq-delay" "cmp-seq" "init" "fallthrough" "allow-=
cmd")
  "Options to give to `defcfg'."
  :type '(repeat string)
  :group 'kbd-highlight)

(defcustom kbd-mode-button-modifiers
  '("around-next-timeout" "around-next-single" "around-next" "around"
    "tap-hold-next-release" "tap-hold-next" "tap-next-release" "tap-hold"
    "tap-macro-release" "tap-macro" "multi-tap" "tap-next" "layer-toggle"
    "layer-switch" "layer-add" "layer-rem" "layer-delay" "layer-next" "cmd-=
button")
  "Button modifiers."
  :type '(repeat string)
  :group 'kbd-highlight)

(defcustom kbd-mode-show-string
  '("uinput-sink" "device-file" "cmd-button")
  "Syntax highlight strings in S-expressions.
When an S-expression begins with any of these keywords, highlight
strings (delimited by double quotes) inside it."
  :type '(repeat string)
  :group 'kbd-highlight)

(defcustom kbd-mode-show-macros t
  "Whether to syntax highlight macros inside layout definitions.
Default: t"
  :type 'boolean
  :group 'kbd-highlight)

(defcustom kbd-mode-magic-focus nil
  "Whether to enable magic focus.
Whenever the `kbd-mode-demo-mode' buffer gets focused,
automatically start try to start a new process for the config
file.  When switching back to the config file, kill that process.

Default: nil"
  :type 'boolean
  :group 'kbd-demo)

(defcustom kbd-mode-kill-kmonad nil
  "How to kill (or suspend) a running kmonad instance.
This is used when invoking `kbd-mode-start-demo' and, in general,
when entering `kbd-mode-demo-mode' because keyboards can't be
grabbed twice."
  :type 'string
  :group 'kbd-demo)

(defcustom kbd-mode-start-kmonad nil
  "How to restart (or resume) kmonad.
If there was an active kmonad instance running, which was killed
by `kbd-mode-kill-kmonad', then this (re)starts kmonad with the
given command upon exiting `kbd-mode-demo-mode'."
  :type 'string
  :group 'kbd-demo)

;;;; Faces

(defgroup kbd-highlight-faces nil
  "Faces used for highlighting in `kbd-mode'."
  :group 'kbd-highlight)

(defface kbd-mode-kexpr-face
  '((t :inherit font-lock-keyword-face))
  "Face for a K-Expression."
  :group 'kbd-highlight-faces)

(defface kbd-mode-token-face
  '((t :inherit font-lock-function-name-face))
  "Face for input and output tokens."
  :group 'kbd-highlight-faces)

(defface kbd-mode-defcfg-option-face
  '((t :inherit font-lock-builtin-face))
  "Face for options one may give to `defcfg'."
  :group 'kbd-highlight-faces)

(defface kbd-mode-button-modifier-face
  '((t :inherit font-lock-function-name-face))
  "Face for all the button modifiers."
  :group 'kbd-highlight-faces)

(defface kbd-mode-variable-name-face
  '((t :inherit font-lock-variable-name-face))
  "Face for a variables, i.e. layer names, macros in layers,..."
  :group 'kbd-highlight-faces)

(defface kbd-mode-string-face
  '((t :inherit font-lock-string-face))
  "Face for strings."
  :group 'kbd-highlight-faces)

;;;; Functions

(defun kbd-mode--show-macros? (show-macros)
  "Decide whether to font-lock macros.
If the argument SHOW-MACROS is non-nil, font-lock macros of the
form `@MACRO-NAME' with `kbd-mode-variable-name-face'."
  (let ((macro-regexp '(("\\(:?\\(@[^[:space:]]+\\)\\)"
                         (1 'kbd-mode-variable-name-face)))))
    (if show-macros
        (font-lock-add-keywords 'kbd-mode macro-regexp)
      (font-lock-remove-keywords 'kbd-mode macro-regexp))))

;;; Vars

(defvar kbd-mode-syntax-table
  (let ((st (make-syntax-table)))
    ;; Use ;; for regular comments and #| |# for line comments.
    (modify-syntax-entry ?\; ". 12b" st)
    (modify-syntax-entry ?\n "> b"   st)
    (modify-syntax-entry ?\# ". 14"  st)
    (modify-syntax-entry ?\| ". 23"  st)
    ;; We don't need to highlight brackets, as they're only used inside
    ;; layouts.
    (modify-syntax-entry ?\[ "."     st)
    (modify-syntax-entry ?\] "."     st)
    ;; We highlight the necessary strings ourselves.
    (modify-syntax-entry ?\" "."     st)
    st)
  "The basic syntax table for `kbd-mode'.")

(defvar kbd-mode--font-lock-keywords
  (let ((kexpr-regexp            (regexp-opt kbd-mode-kexpr            'wor=
ds))
        (token-regexp            (regexp-opt kbd-mode-tokens           'wor=
ds))
        (defcfg-options-regexp   (regexp-opt kbd-mode-defcfg-options   'wor=
ds))
        (button-modifiers-regexp (regexp-opt kbd-mode-button-modifiers 'wor=
ds))
        (function-one-regexp
         (concat "\\(?:\\("
                 (regexp-opt kbd-mode-function-one)
                 "\\)\\([[:space:]]+[[:word:]]+\\)\\)"))
        ;; Only highlight these strings; configuration files may explicitly
        ;; use a " to emit a double quote, so we can't trust the default
        ;; string highlighting.
        (string-regexp
         (concat "\\(['\(]"
                 (regexp-opt kbd-mode-show-string)
                 "\\)\\(\\S)+\\)\)")))
    `((,token-regexp            (1 'kbd-mode-token-face          ))
      (,kexpr-regexp            (1 'kbd-mode-kexpr-face          ))
      (,button-modifiers-regexp (1 'kbd-mode-button-modifier-face))
      (,defcfg-options-regexp   (1 'kbd-mode-defcfg-option-face  ))
      (,function-one-regexp
       (1 'kbd-mode-kexpr-face        )
       (2 'kbd-mode-variable-name-face))
      (,string-regexp
       ("\"[^}]*?\""
        (progn (goto-char (match-beginning 0)) (match-end 0))
        (goto-char (match-end 0))
        (0 'kbd-mode-string-face t)))))
  "Keywords to be syntax highlighted.")

;;; Define Major Mode

;; Because the configuration language is in a lispy syntax, we can
;; inherit from any lisp mode in order to get good parenthesis handling
;; for free.

(defvar kbd-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-c C-c") #'kbd-mode-start-demo)
    (define-key map (kbd "C-c C-z") #'kbd-mode-switch)
    map))

;;;###autoload
(define-derived-mode kbd-mode emacs-lisp-mode "Kbd"
  "Major mode for editing `.kbd' files.

For details, see `https://github.com/kmonad/kmonad'."
  (set-syntax-table kbd-mode-syntax-table)
  (use-local-map kbd-mode-map)
  (font-lock-add-keywords 'kbd-mode kbd-mode--font-lock-keywords)
  (kbd-mode--show-macros? kbd-mode-show-macros)
  ;; HACK
  (defadvice redisplay (after refresh-font-locking activate)
    (when (derived-mode-p 'kbd-mode)
      (font-lock-fontify-buffer))))

;; Associate the `.kbd' ending with `kbd-mode'.
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.kbd\\'" . kbd-mode))

;;;; Demo Minor Mode

(defvar kbd-mode-demo-file nil
  "Path to the users configuration file.
This is used in `kbd-mode-demo-mode' for deciding what
configuration to compile.")

(defvar kbd-mode-had-kmonad? nil
  "Whether the user had a running kmonad instance.
This controls whether kmonad will be restarted by mean of
`kbd-mode-start-kmonad' after exiting `kbd-mode-demo-mode'.")

(defvar kbd-mode-demo-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-c C-c") #'kbd-mode-stop-demo)
    (define-key map (kbd "C-c C-z") #'kbd-mode-switch)
    map))

;;;###autoload
(define-minor-mode kbd-mode-demo-mode
  "Toggle kmonad demo mode.
This is a minor mode, in which users can test their
configurations."
  :lighter " kbd-demo"
  :keymap kbd-mode-demo-mode-map

  (when kbd-mode-demo-mode
    (unless (kbd-mode--valid-config?)
      (kbd-mode--show-error)))

  ;; Handle toggle
  (when kbd-mode-magic-focus
    (cond (kbd-mode-demo-mode
           (add-hook 'window-selection-change-functions #'kbd-mode--toggle-=
demo nil t)
           (add-hook 'focus-in-hook #'kbd-mode--create-kmonad-process nil t)
           (add-hook 'focus-out-hook #'kbd-mode--kill-demo-process nil t))
          (t
           (remove-hook 'window-selection-change-functions #'kbd-mode--togg=
le-demo t)
           (remove-hook 'focus-in-hook #'kbd-mode--create-kmonad-process t)
           (remove-hook 'focus-out-hook #'kbd-mode--kill-demo-process t)))))

;;;; Interactive Functions

;;;###autoload
(defun kbd-mode-start-demo ()
  "Try the current configuration in a demo buffer.
Use `kbd-mode-stop-demo' to stop the demo.  If the configuration
file has errors, the demo will not start and an error buffer will
be shown instead."
  (interactive)
  (setq kbd-mode-demo-file
        (kbd-mode--find-kbd-file (buffer-file-name (current-buffer))))
  (if (not (kbd-mode--valid-config?))
      (kbd-mode--show-error)
    (when (shell-command "ps -C kmonad")
      (setq kbd-mode-had-kmonad? t)
      (kbd-mode--kill-kmonad))
    (kbd-mode--create-demo-buffer)
    (pop-to-buffer "*kmonad-demo*")
    (kbd-mode--create-kmonad-process)
    (kbd-mode-demo-mode t)))

(defun kbd-mode-stop-demo ()
  "Stop the currently running demo."
  (interactive)
  (with-current-buffer "*kmonad-demo*"
    (kbd-mode-demo-mode 0)
    (kill-buffer-and-window)
    (kbd-mode--kill-demo-process)
    (when kbd-mode-had-kmonad?
      (kbd-mode--start-kmonad))))

(defun kbd-mode-switch ()
  "Switch between the demo window and the config file."
  (interactive)
  (select-window (get-buffer-window
                  (if (and (equal (buffer-name) "*kmonad-demo*")
                           kbd-mode-demo-mode)
                      (get-file-buffer kbd-mode-demo-file)
                    "*kmonad-demo*"))))

;;;; Helper Functions

(defun kbd-mode--create-demo-buffer ()
  "Create the *kmonad-demo* buffer."
  (unless (get-buffer "*kmonad-demo*")
    (display-buffer (get-buffer-create "*kmonad-demo*")
                    '(display-buffer-at-bottom
                      (window-height . 0.15)))))

(defun kbd-mode--find-kbd-file (&optional file)
  "Find the config file.
If the optional argument FILE is given, use it instead.
Otherwise, prompt the user for a choice."
  (if (and file (string=3D (file-name-extension file) "kbd"))
      file
    (expand-file-name (read-file-name "Choose configuration file"))))

(defun kbd-mode--valid-config? ()
  "Check if the current configuration is valid."
  (let ((command (kbd-mode--get-config-validation-command)))
    (eq 0 (shell-command command))))

(defun kbd-mode--create-kmonad-process ()
  "Start the kmonad demo process in a dedicated buffer."
  (when (get-buffer-process "*kmonad*")
    (kbd-mode--kill-demo-process))
  (start-process "kmonad-emacs" "*kmonad*" "kmonad" kbd-mode-demo-file))

(defun kbd-mode--kill-demo-process ()
  "Kill demo kmonad process, if possible."
  (when (get-buffer-process "*kmonad*")
    (kill-process "*kmonad*")))

(defun kbd-mode--kill-kmonad ()
  "Kill (or suspend) a running kmonad instance.
The command used to kill kmonad is given by the
`kbd-mode-kill-kmonad' variable."
  (if kbd-mode-kill-kmonad
      (shell-command kbd-mode-kill-kmonad)
    (error "To kill the running kmonad instance, customize the `kbd-mode-ki=
ll-kmonad' variable!")))

(defun kbd-mode--start-kmonad ()
  "Start (or resume) a new kmonad process.
The command used to start kmonad is given by the
`kbd-mode-start-kmonad' variable."
  (if kbd-mode-kill-kmonad
      (call-process-shell-command
       ;; Force the command to be executed asynchronously.
       (if (eq (aref kbd-mode-start-kmonad
                     (1- (length kbd-mode-start-kmonad)))
               ?&)
           kbd-mode-start-kmonad
         (concat kbd-mode-start-kmonad "&")))
    (error "To restart kmonad, customize the `kbd-mode-start-kmonad' variab=
le!")))

(defun kbd-mode--toggle-demo (&optional _window)
  "Toggle the kmonad demo process.
When the users exits the demo window, kill the demo process and
start a \"normal\" kmonad process instead.  When re-entering the
demo window, do the opposite; i.e., kill the running kmonad
instance and spawn a demo process."
  (cond ((kbd-mode--was-demo?)
         (kbd-mode--kill-demo-process)
         (kbd-mode--start-kmonad))
        ((kbd-mode--valid-config?)
         (kbd-mode--kill-kmonad)
         (kbd-mode--create-kmonad-process))
        (t
         (kbd-mode--start-kmonad)
         (kbd-mode--show-error))))

(defun kbd-mode--was-demo? ()
  "Was the previous buffer the kmonad demo buffer?"
  (equal (window-buffer (previous-window))
         (get-buffer "*kmonad-demo*")))

(defun kbd-mode--show-error ()
  "Show configuration errors in a compilation buffer."
  (when kbd-mode-demo-mode
    (quit-window 'kill "*kmonad-demo*"))
  (compile (kbd-mode--get-config-validation-command)))

(defun kbd-mode--get-config-validation-command ()
  "Get validation command for `kbd-mode-demo-file'."
  (concat "kmonad -d " kbd-mode-demo-file))

;;;; Integration with `compilation-mode'

(add-to-list 'compilation-error-regexp-alist 'kbd)
(add-to-list 'compilation-error-regexp-alist-alist
             '(kbd "^kmonad: Parse error at \\([0-9]+\\):\\([0-9]+\\)" nil =
1 2))

(provide 'kbd-mode)

;;; kbd-mode.el ends here

--=-=-=--




Acknowledgement sent to Jeremy Bryant <jb@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#73016; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sun, 12 Jan 2025 05:45:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.