October 17, 2022 2:38 AM, "Zain Jabbar" <zaijab2...@gmail.com> wrote:
> Aloha Guix Development Team, > > Running =guix home search emacs= returns nothing. I also could not find an > email using =C-u M-x > debbugs-gnu= about an Emacs configuration service. > > This is my first email to this mailing address. Please give me pointers on > formatting and further > improvements. I think you sent an html email. Generally you want to send plain text emails. :) > I have attempted to make an =emacs-home-service-type= so that it is possible > to configure Emacs > using Guix home. This code is extremely preliminary hence I don't even think > it is worth sending as > a patch. Also I have never worked on a multi person Git project before and do > not know how to solve > the keyring error I get when using guix pull. I will outline what my code > does and what features I > would like to add. > > #+BEGIN_SRC scheme > (define* (emacs-configuration-service name #:key (init '()) (early-init '()) > (emacs-packages '())) > (service-type (name (symbol-append 'emacs- name '-configuration)) > (extensions > (list (service-extension > home-profile-service-type > (lambda (config) emacs-packages)) > (service-extension > home-files-service-type > (lambda (config) > (list > `(,(string-append > ".config/emacs/services/" (symbol->string name) ".el") > ,(scheme-file (string-append (symbol->string name) ".el") > init #:splice? #t)) > `(,(string-append > ".config/emacs/early-services/" (symbol->string name) ".el") > ,(scheme-file (string-append "early-" (symbol->string name) ".el") > early-init #:splice? #t))))))) > (default-value #f) > (description "Configures Emacs init.el"))) > > (define-public emacs-init-service-type > (service-type (name 'home-emacs) > (extensions > (list (service-extension > home-profile-service-type > (lambda (config) (list emacs-next))) > (service-extension > home-files-service-type > (lambda (config) > (list > `(".config/emacs/early-init.el" > ,(scheme-file > "early-init.el" > '((mapc > 'load (file-expand-wildcards > "~/.config/emacs/early-services/*.el"))) > #:splice? #t)) > `(".config/emacs/init.el" > ,(scheme-file > "init.el" > '((mapc > 'load (file-expand-wildcards > "~/.config/emacs/services/*.el"))) > #:splice? #t))))))) > (default-value #f) > (description "Configures Emacs init.el"))) > #+END_SRC > > I define a general configuration service generator which takes in four things: > 1. The =name= of the service > 2. The configuration to be ran in =init.el= > 3. The configuration to be ran in =early-init.el= > 4. The packages in Guix to be added to the =home-profile=. > > After giving the =name=, =packages=, and =config.el= files we get a new > service type that we can > add to our home declaration. This service will then add a file in > =~/.config/emacs/services/emacs-{NAME}-configuration.el=. I then have another > service that places > an =init.el= which loads everything in the service directory. > > If we want to install and configure =evil-mode= using this =home-service= we > may define the > following somewhere. > > #+BEGIN_SRC scheme > (define-public emacs-evil-service-type > (emacs-configuration-service > 'evil #:emacs-packages (list emacs-evil) > #:init '((evil-mode 1)))) > #+END_SRC > > Within our =home-environment= we may add the service using: > > #+BEGIN_SRC scheme > (home-environment > ;; ...Things in the home-environment... > (services > (list > ;; ...Other Services... > (service emacs-evil-service-type)))) > #+END_SRC > > There are some missing features I want to add. > > 1. Have the =home-emacs-*-service-type= service-types add to the =init.el= > directly rather than > within a folder to be loaded. I couldn't add two files with the same name to > the store. So I have > emacs-evil.el in the store to be placed separately later rather than > appending to the existing > init.el file. > > 2. Have Emacs update whenever the =home-environment= is updated. Meaning, if > I did not add > =(service emacs-evil-service-type)= in my =home-environment= then obviously > =M-x evil-mode= should > not work. But after adding the service then I want =M-x evil-mode= to work > without having to > restart Emacs. I do not understand the Emacs loading system on Guix well > enough to know why it does > not work. Skipping all of the =home-service= stuff, running =guix install > emacs-evil-mode= then > =(guix-emacs-autoload-packages)= does not let emacs know that =evil-mode= is > installed. I would > need to close Emacs and start Emacs again for Emacs to know about =evil-mode= > being installed. > > 3. Use configurations somehow. I have completely neglected this feature in my > system. I do not know > what would be useful there. I believe that you are referring to using scheme records to configure the emacs service. :) I would recommend using (define-configuration ...) procedure. (There is a define-record-type* as well, but I think the consensus is that define-configuration* is a little easier to use. Does better error handling and can help you generate documentation from the code). You can find examples of that here: https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/services/mail.scm > > -- > Thank you, > Zain Jabbar