unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Zain Jabbar <zaijab2000@gmail.com>
To: Liliana Marie Prikler <liliana.prikler@ist.tugraz.at>
Cc: 58652@debbugs.gnu.org, jbranso@dismail.de
Subject: [bug#58652] Creating home-emacs-service-type
Date: Fri, 21 Oct 2022 21:09:33 -1000	[thread overview]
Message-ID: <CAH+UbWRC5qOjsTnsanmkmRA0RQQwR_A-NNLes6kyvJ1EXrOKgg@mail.gmail.com> (raw)
In-Reply-To: <77fbe7e648edfc15c8007616199a867dbae72b71.camel@ist.tugraz.at>

[-- Attachment #1: Type: text/plain, Size: 7669 bytes --]

Aloha All,

Apologies for the delay.

> Instead of 6+7, write a single commit and use =git format-patch=.

Understood. Used =git format-patch HEAD~1= after =git reset --hard
origin/HEAD= to only have a single commit.

> Is that #:splice? #t meant to be there?

Yes, I believe so. Without the =#:splice? #:t= everything within the
file is surrounded by parenthesis. For example

#+BEGIN_SRC scheme
(use-modules (gnu home services emacs)
     (gnu home)
     (guix gexp)
     (gnu packages)
     (ice-9 pretty-print)
     (gnu services))


(home-environment
 (services
  (list
   (service home-emacs-service-type
    (home-emacs-configuration
     (packages
      (list
       (specification->package "bash")
       (specification->package "emacs-next")))
     (extra-files (list (scheme-file "greetings" '((setq x 42) (setq y
10)) #:splice? #:t))))))))
#+END_SRC

Places =(setq x 42)(setq y 10)= (no whitespace so it's kind of hard to
read) in =greetings=. That would properly run as Elisp. Without the
splicing we obtain =((setq x 42) (setq y 10))= which assumes we will
call a function =(setq x 42)= on the argument =(setq y 10)= which will
not work.

> Also, why is bash required here?

Bash was there for debugging purposes. You are right though, it does
not make a lot of sense to be there. It should be in the
=home-environment= =packages= not in the =home-emacs-configuration=.
Surprisingly if =bash= was not installed, =sh= was nowhere to be found
from within =guix home container ${FILE}= and Emacs info manuals were
not readable (something Joshua Branson helped me iron out).

> You should perhaps also distinguish
> the emacs package and the emacs-* packages like so:
> (emacs emacs-next)
> (packages (list emacs-dash emacs-tempel))

Attached is a patch with =emacs= as a configuration type and here is
an example =home-environment= where =bash= installed using the
=packages= slot.

#+BEGIN_SRC scheme
(use-modules (gnu home services emacs)
     (gnu home)
     (guix gexp)
     (gnu packages)
     (ice-9 pretty-print)
     (gnu services))

(home-environment
 (packages (list (specification->package "bash")))
 (services
  (list
   (service home-emacs-service-type))))
#+END_SRC

In the guix-dev mailing list, it has been discussed that Andrew
Tropin's method of declaring a config is worthwhile inspiration. Here
is an example configuration block.

#+BEGIN_SRC scheme
(define emacs-configure-rde-keymaps
  (rde-emacs-configuration-package
   'rde-keymaps
   `((defvar rde-app-map nil "Prefix keymap for applications.")
     (define-prefix-command 'rde-app-map nil)
     (defvar rde-toggle-map nil "\
Prefix keymap for binding various minor modes for toggling functionalitty.")
     (define-prefix-command 'rde-toggle-map nil))
   #:summary "Keymaps inteded for reuse among configure-* packages"))
#+END_SRC

This is a bit closer to the current patch using S-Expressions over
files. Perhaps I should wait for more people to chime in. Maybe I can
try to please both sides. Make a conditional, if the =init= or
=early-init= form is empty (as it is by default) then allow for a file
named =init.el= in the =extra-files= argument.

On Thu, Oct 20, 2022 at 8:06 PM Liliana Marie Prikler
<liliana.prikler@ist.tugraz.at> wrote:
>
> Am Donnerstag, dem 20.10.2022 um 11:30 -1000 schrieb Zain Jabbar:
> > Aloha All,
> >
> > Thank you for your input.
> >
> > > Note that you reverted the patch direction.
> >
> > Please forgive me for that. Is it possible to explain what I did
> > wrong? I will outline my steps to help you figure out what I did
> > incorrectly.
> >
> > 1. I cloned the repo
> > 2. Used =guix shell -D guix=
> > 3. Ran =./bootstrap=
> > 4. Ran =./configure --localstatedir=/var=
> > 5. Ran =make && make check=. By the way, my =make check= had a failed
> > test, I don't know if that was expected.
> > 6. Made some commits
> > 7. I used =git diff HEAD origin/HEAD > my-guix-patch.patch=.
> >
> > I might have messed around too much in my cloned repo, throwing
> > something off.
> Instead of 6+7, write a single commit and use =git format-patch=.
>
> You can of course do multi-patch series, but this feature seems not to
> be one that requires that.  Always clean up your commit log after a
> hacking session ;)
>
> > > You should also take an extra-files argument, e.g. to add custom.el
> > > or other elisp files that init.el might refer to.
> >
> > Understood. Attached as a new patch. =home-emacs-configuration= now
> > has an extra field =extra-files=. To use it, input a list of file
> > objects. The service will splice them into
> > =$XDG_CONFIG_HOME/emacs/{FILE}=. Here is an example configuration.
> > Using =guix home container= will allow you to see the file
> > =greetings=
> > with contents "hello world" in =.config/emacs/=.
> >
> > #+BEGIN_SRC scheme
> > (use-modules (gnu home services emacs)
> >      (gnu home)
> >      (guix gexp)
> >      (gnu packages)
> >      (ice-9 pretty-print)
> >      (gnu services))
> >
> > (home-environment
> >  (services
> >   (list
> >    (service home-emacs-service-type
> >     (home-emacs-configuration
> >      (packages
> >       (list
> >        (specification->package "bash")
> >        (specification->package "emacs-next")))
> >      (extra-files (list (scheme-file "greetings" '(hello world)
> > #:splice? #:t))))))))
> > #+END_SRC
> Is that #:splice? #t meant to be there?
>
> Also, why is bash required here?  You should perhaps also distinguish
> the emacs package and the emacs-* packages like so:
>
> (emacs emacs-next)
> (packages (list emacs-dash emacs-tempel))
>
> As a future extension, it'd be nice if we could use this service to
> easily specify native compilation for emacs packages, but for this one
> would have to lay some groundwork in emacs-build-system.
>
> > > Also, I'm not certain if "scheme-file" is the right primitive here
> > > – Emacs Lisp does differ from Scheme, e.g. in keyword syntax among
> > > others.
> >
> > I agree; using =scheme-file= for =emacs-lisp= feels blasphemous.
> > There are some odd errors associated with this method too. For
> > example, =#'foo= is the shorthand for =(function foo)= in Emacs Lisp
> > but gets turned into =(syntax foo)= when using Guile. Meaning a pure
> > drag and drop =init.el >> guile-sexp= has some things that need to be
> > changed.
> > The fact that Emacs-Lisp and Guile Scheme use S-Expressions was
> > something I wanted to leverage. It becomes easy to write Elisp in the
> > parens of the =init= parameter because there is no context switching
> > (e.g. lispy works, cape-symbols works for Elisp in Scheme).
> Note that Guile has an elisp reader, albeit a broken one, but no means
> to switch languages inside files.
>
> > I am open to other forms of inputting the text in the files. This is
> > a bit high maka maka, but I would also like to see how "elegant" the
> > other methods of inserting Elisp look. That is, can we make it
> > desirable for people to integrate Elisp into Guile Scheme moreso than
> > a =local-file= declaration. Using backquotes and S-Expressions allows
> > for some variables from Guile to be placed into the Emacs
> > configuration like the system type, user names, and emails.
> I think taking a list of file-like objects and concatenating their
> contents might be worth considering.  That's a bit more overhead, but
> we'd have a cleaner separation between fragments that have the same
> semantics in Scheme and those that don't.
>
> Cheers



-- 
Mahalo,
Zain Jabbar

[-- Attachment #2: 0001-Adding-home-emacs-service-type-and-home-emacs-config.patch --]
[-- Type: text/x-patch, Size: 3577 bytes --]

From e39ea1708d5b7121cac9a9f6c7953c15633b01c0 Mon Sep 17 00:00:00 2001
From: Zain Jabbar <zaijab2000@gmail.com>
Date: Fri, 21 Oct 2022 20:48:31 -1000
Subject: [PATCH] Adding =home-emacs-service-type= and
 =home-emacs-configuration=. A service to configure emacs using guix home.

---
 gnu/home/services/emacs.scm | 72 +++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
 create mode 100644 gnu/home/services/emacs.scm

diff --git a/gnu/home/services/emacs.scm b/gnu/home/services/emacs.scm
new file mode 100644
index 0000000000..1da6987411
--- /dev/null
+++ b/gnu/home/services/emacs.scm
@@ -0,0 +1,72 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 Zain Jabbar <zaijab2000@gmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix 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 GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home services emacs)
+  #:use-module (gnu home)
+  #:use-module (gnu packages)
+  #:use-module (gnu services)
+  #:use-module (gnu home services)
+  #:use-module (gnu services)
+  #:use-module (gnu services configuration)
+  #:use-module (guix gexp)
+
+  #:export (home-emacs-service-type
+	    home-emacs-configuration))
+
+(define file-likes? (list-of file-like?))
+
+(define-configuration/no-serialization home-emacs-configuration
+  (emacs
+   (file-like (specification->package "emacs-next"))
+   "The Emacs package to use.")
+  (packages
+   (file-likes '())
+   "The packages this configuration will add to home-profile. Usually these will be emacs-* packages.")
+  (early-init
+   (list '())
+   "A list whose contents will inserted into @file{$XDG_CONFIG_HOME/emacs/early-init.el}")
+  (init
+   (list '())
+   "A list whose contents will inserted into @file{$XDG_CONFIG_HOME/emacs/init.el}")
+  (extra-files
+   (file-likes '())
+   "A list of files to be placed in @file{$XDG_CONFIG_HOME/emacs/}."))
+
+(define home-emacs-service-type
+  (service-type (name 'emacs-configuration)
+		(extensions
+		 (list (service-extension
+			home-profile-service-type
+			(lambda (config) `(,(home-emacs-configuration-emacs config)
+                                           ,@(home-emacs-configuration-packages config))))
+		       (service-extension
+			home-xdg-configuration-files-service-type
+			(lambda (config)
+                          `(("emacs/early-init.el"
+			     ,(scheme-file "early-init.el"
+					   (home-emacs-configuration-early-init config)
+					   #:splice? #:t))
+			    ("emacs/init.el"
+			     ,(scheme-file "init.el"
+					   (home-emacs-configuration-init config)
+					   #:splice? #:t))
+                            ,@(map (lambda (file) (list (string-append "emacs/" (scheme-file-name file))
+                                                        file))
+                                   (home-emacs-configuration-extra-files config)))))))
+		(default-value (home-emacs-configuration))
+		(description "Configures Emacs and installs packages to home-profile.")))
-- 
2.38.0


      parent reply	other threads:[~2022-10-22  7:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-20  1:59 [bug#58652] Creating home-emacs-service-type Zain Jabbar
2022-10-20 12:53 ` Liliana Marie Prikler
2022-10-20 21:30   ` Zain Jabbar
2022-10-21  6:05     ` Liliana Marie Prikler
2022-10-21 15:42       ` Joshua Branson via Guix-patches via
2022-10-22  7:09       ` Zain Jabbar [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAH+UbWRC5qOjsTnsanmkmRA0RQQwR_A-NNLes6kyvJ1EXrOKgg@mail.gmail.com \
    --to=zaijab2000@gmail.com \
    --cc=58652@debbugs.gnu.org \
    --cc=jbranso@dismail.de \
    --cc=liliana.prikler@ist.tugraz.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).