Ludovic Courtès (2015-09-25 22:22 +0300) wrote:

> Alex Kost <alez...@gmail.com> skribis:
>
>> From ed1c3871b81d4904d106a3ca5aadde2e1803d2a6 Mon Sep 17 00:00:00 2001
>> From: Alex Kost <alez...@gmail.com>
>> Date: Thu, 24 Sep 2015 20:10:29 +0300
>> Subject: [PATCH] emacs: devel: Highlight 'modify-phases' keywords.
>>
>> * emacs/guix-guile.el (guix-guile-keyword-regexp): New function.
>> * emacs/guix-devel.el (guix-devel-faces): New custom group.
>>   (guix-devel-modify-phases-keyword): New face.
>>   (guix-devel-modify-phases-keyword-regexp,
>>   guix-devel-font-lock-keywords): New variables.
>>   (guix-devel-modify-phases-font-lock-matcher,
>>   guix-devel-modify-phases-font-lock-pre): New functions.
>>   (guix-devel-mode): Adjust to add/remove font-lock-keywords.
>
> OK!

Thanks, I have pushed it.

> I also have this one that I find useful:
>
> ;; For Guix g-expressions.
> (font-lock-add-keywords 'scheme-mode
>                       '(("#~" . font-lock-keyword-face)
>                         ("#\\$" . font-lock-keyword-face)
>                         ("#\\+" . font-lock-keyword-face)))

Great, what about the attached patch for adding these ones?

> Similarly .dir-locals.el has ‘modify-syntax-entry’ stuff for gexps that
> could maybe go to guix-devel.el?

Yes, they could.  So as you mention it, there is another thing I would
like to add — complex indentation rules.  Specifically, inherited
packages are automatically indented like this:

(package (inherit foo)
         (name "foo")
         ...)

or this:

(package
  (inherit foo)
  (name "foo")
  ...)

while we want it to be:

(package (inherit foo)
  (name "foo")
  ...)

The following code may be used to handle this indentation:

Attachment: package-indent.el
Description: application/emacs-lisp

But it wouldn't work reliably because of ".dir-locals.el", as
'scheme-indent-function' property will be overridden every time a scheme
file from git repo is visited.  So my proposition is: what about moving
all indentation rules from ".dir-locals.el" to "emacs/guix-devel.el"?
So 'guix-devel-mode' will be responsible for all indenting, highlighting
and other guix-specific things.  WDYT?

>From 13ebd00178d1f6139da4c1f76a2e358935ce16f0 Mon Sep 17 00:00:00 2001
From: Alex Kost <alez...@gmail.com>
Date: Sat, 26 Sep 2015 22:42:07 +0300
Subject: [PATCH] emacs: devel: Highlight gexp symbols.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Suggested by Ludovic Courtès <l...@gnu.org>.

* emacs/guix-devel.el (guix-devel-gexp-symbol): New face.
  (guix-devel-font-lock-keywords): Adjust to handle gexp symbols.
---
 emacs/guix-devel.el | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/emacs/guix-devel.el b/emacs/guix-devel.el
index 8a6fc1e..2e85a7e 100644
--- a/emacs/guix-devel.el
+++ b/emacs/guix-devel.el
@@ -43,6 +43,12 @@
   "Face for a `modify-phases' keyword ('delete', 'replace', etc.)."
   :group 'guix-devel-faces)
 
+(defface guix-devel-gexp-symbol
+  '((t :inherit font-lock-keyword-face))
+  "Face for gexp symbols ('#~', '#$', etc.).
+See Info node `(guix) G-Expressions'."
+  :group 'guix-devel-faces)
+
 (defcustom guix-devel-activate-mode t
   "If non-nil, then `guix-devel-mode' is automatically activated
 in Scheme buffers."
@@ -130,7 +136,9 @@ to find 'modify-phases' keywords."
   (save-excursion (up-list) (point)))
 
 (defvar guix-devel-font-lock-keywords
-  `((,(guix-guile-keyword-regexp "modify-phases")
+  `((,(rx (or "#~" "#$" "#$@" "#+" "#+@")) .
+     'guix-devel-gexp-symbol)
+    (,(guix-guile-keyword-regexp "modify-phases")
      (1 'font-lock-keyword-face)
      (guix-devel-modify-phases-font-lock-matcher
       (guix-devel-modify-phases-font-lock-pre)
-- 
2.5.0

Reply via email to