aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Wilken2022-12-31 11:46:26 +0100
committerTimo Wilken2022-12-31 11:46:26 +0100
commit336b73fd56ae24f3bd363f43263a671af92240f0 (patch)
tree904644d1354068c061caabbed76790429262dac3
parentc629e4243330b5081c4b85563fe9c028e43310c2 (diff)
Extract common home configuration for server and laptop
-rw-r--r--tw/home/common.scm229
-rw-r--r--tw/home/emacs.scm103
-rw-r--r--tw/home/lap.scm530
-rw-r--r--tw/home/lud.scm10
4 files changed, 464 insertions, 408 deletions
diff --git a/tw/home/common.scm b/tw/home/common.scm
new file mode 100644
index 00000000..45136be3
--- /dev/null
+++ b/tw/home/common.scm
@@ -0,0 +1,229 @@
+(define-module (tw home common)
+ #:use-module (gnu)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shells)
+ #:use-module (gnu home services shepherd)
+ #:use-module (gnu home services ssh)
+ #:use-module (guix gexp)
+ #:use-module (tw packages shell))
+
+(use-package-modules admin compression curl databases disk dns file finance
+ gnupg graphviz imagemagick less linux lisp maths
+ password-utils pretty-print pv python python-xyz rsync
+ shells shellutils ssh textutils tmux version-control
+ video vim web)
+
+(define-public common-packages
+ (list
+ curl dos2unix fdupes file git gnupg gnuplot graphviz hledger imagemagick jq
+ less lesspipe net-tools openssh password-store pass-otp pv python
+ python-ipython recutils rsync sbcl smartmontools source-highlight tmux tree
+ xxd zip unzip
+ get-iplayer ffmpeg atomicparsley yt-dlp
+
+ ;; Install only bind-utils like dig, not the full suite.
+ (list isc-bind "utils")
+
+ ;; Ranger can do code highlighting using python-pygments and
+ ;; image previews in kitty using python-pillow.
+ ranger python-pygments python-pillow mediainfo python-pdftotext
+
+ ;; Shell
+ zsh zsh-autosuggestions zsh-syntax-highlighting zsh-autopair
+ zsh-completions))
+
+(define-public common-services
+ (list
+ (service home-zsh-service-type
+ (home-zsh-configuration
+ (zshrc (list (local-file "files/zshrc")
+ (local-file "files/prompt.zsh")))))
+
+ (simple-service
+ 'common-config home-xdg-configuration-files-service-type
+ `(("git/config" ,(local-file "files/gitconfig"))
+ ("htop/htoprc" ,(local-file "files/htoprc"))
+ ("lesskey" ,(local-file "files/lesskey"))
+ ("ranger/rc.conf" ,(local-file "files/ranger.conf"))
+ ("user-dirs.locale" ,(plain-file "user-dirs.locale" "C")) ; Not sure if this is needed. Arch has it.
+ ("user-dirs.dirs" ,(local-file "files/user-dirs.dirs"))))
+
+ (simple-service
+ 'gnupg-config home-files-service-type
+ `(;; GnuPG config files must be in ~/.local/share/gnupg, not ~/.config,
+ ;; so we can't use `home-xdg-configuration-files-service-type'.
+ (".local/share/gnupg/gpg.conf" ,(local-file "files/gpg.conf"))
+ (".local/share/gnupg/gpg-agent.conf"
+ ,(mixed-text-file "gpg-agent.conf" "\
+pinentry-program " (file-append pinentry-rofi "/bin/pinentry-rofi") "
+# Needed if spawning lots of parallel gpg --decrypt processes. https://dev.gnupg.org/T3530
+auto-expand-secmem
+"))))
+
+ (simple-service
+ 'gnupg-agent home-shepherd-service-type
+ (list
+ (shepherd-service
+ (documentation "GPG agent; caches key passwords.")
+ (provision '(gpg-agent))
+ (start #~(lambda _
+ (invoke #$(file-append gnupg "/bin/gpg-agent")
+ "--daemon" "--no-detach")))
+ (stop #~(lambda _
+ (invoke "gpg-connect-agent" "killagent" "/bye"))))))
+
+ (simple-service
+ 'common-environment home-environment-variables-service-type
+ `(;; Path to my own package definitions. If invoking `guix home'
+ ;; afresh, this needs to be set manually to find these packages.
+ ("GUIX_PACKAGE_PATH" . "$HOME/src/guix-decls")
+
+ ;; Prepend my own binaries to $PATH. These should probably all
+ ;; be managed through `home-files-service-type'.
+ ("PATH" . "$HOME/.local/bin${PATH:+:}$PATH")
+
+ ;; Default terminal-related applications (except Emacs, which is separate).
+ ("PAGER" . "less")
+ ;; Guix force-overrides $LESS by default, so force-force it to do what I
+ ;; want instead. `less' reads the `lesskey' file configured above.
+ ("GUIX_PAGER" . "env -u LESS less")
+ ;; To make LESS_TERMCAP_* variables (set in lesskey) apply to man pages in kitty.
+ ("GROFF_NO_SGR" . "1")
+
+ ;; Shell history -- primarily for zsh, but Emacs' eshell uses this too.
+ ("HISTSIZE" . "10000000")
+
+ ;; ("NVIM_TUI_ENABLE_CURSOR_SHAPE" . "1")
+ ("LEDGER_FILE" . "$HOME/sync/ledger/ledger.journal")
+ ("GTAGSLABEL" . "pygments")
+
+ ;; Disable at-spi-dbus-launcher accessibility service.
+ ("NO_AT_BRIDGE" . "1")
+
+ ;; Auto-compilation is annoying and creates a bunch of files that are never cleaned up.
+ ("GUILE_AUTO_COMPILE" . "0")
+
+ ;; For some reason, Guix doesn't seem to add these paths automatically.
+ ("GUILE_LOAD_PATH" .
+ ,(string-append
+ "$GUIX_PACKAGE_PATH:"
+ "$XDG_CONFIG_HOME/guix/current/share/guile/site/3.0"
+ "${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"))
+ ("GUILE_LOAD_COMPILED_PATH" .
+ ,(string-append
+ "$XDG_CONFIG_HOME/guix/current/lib/guile/3.0/site-ccache:"
+ "$XDG_CONFIG_HOME/guix/current/share/guile/site/3.0"
+ "${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"))))
+
+ ;; XDG basedir spec compliance for various programs
+ ;; See: https://wiki.archlinux.org/index.php/XDG_Base_Directory for a list of programs.
+ ;; The `home-xdg-base-directories' service (enabled by default) sets $XDG_* variables for us.
+ (simple-service
+ 'xdg-spec-compliance home-environment-variables-service-type
+ '(("ANDROID_EMULATOR_HOME" . "$XDG_DATA_HOME/android-emulator")
+ ("ASPELL_CONF" . "per-conf $XDG_CONFIG_HOME/aspell/aspell.conf; home-dir $XDG_DATA_HOME/aspell")
+ ("BUP_DIR" . "$XDG_DATA_HOME/bup")
+ ("CARGO_HOME" . "$XDG_DATA_HOME/cargo")
+ ("DSHGROUP_PATH" . "$XDG_DATA_HOME/dsh/group:/etc/dsh/group")
+ ("ELECTRUMDIR" . "$XDG_DATA_HOME/electrum")
+ ("FG_HOME" . "$XDG_DATA_HOME/fgfs")
+ ("GETIPLAYERUSERPREFS" . "$XDG_DATA_HOME/get_iplayer")
+ ("GNUPGHOME" . "$XDG_DATA_HOME/gnupg")
+ ("GTK2_RC_FILES" . "$XDG_CONFIG_HOME/gtk-2.0/gtkrc")
+ ("ICEAUTHORITY" . "$XDG_CACHE_HOME/ICEauthority")
+ ("INPUTRC" . "$XDG_CONFIG_HOME/readline/inputrc")
+ ("IPYTHONDIR" . "$XDG_CONFIG_HOME/ipython")
+ ("JUPYTER_CONFIG_DIR" . "$XDG_CONFIG_HOME/jupyter")
+ ;; KONAN_DATA_DIR=~/.konan by default; grows to multiple GiB.
+ ;; https://discuss.kotlinlang.org/t/change-konan-folder-location/18309
+ ("KONAN_DATA_DIR" . "$XDG_CACHE_HOME/konan")
+ ("NPM_CONFIG_USERCONFIG" . "$XDG_CONFIG_HOME/npm/npmrc")
+ ("PASSWORD_STORE_DIR" . "$XDG_DATA_HOME/password-store")
+ ("PLTUSERHOME" . "$XDG_DATA_HOME/racket")
+ ("PYLINTHOME" . "$XDG_CACHE_HOME/pylint")
+ ("PYLINTRC" . "$XDG_CONFIG_HOME/pylint/pylintrc")
+ ("RECOLL_CONFDIR" . "$XDG_CONFIG_HOME/recoll")
+ ("RLWRAP_HOME" . "$XDG_DATA_HOME/rlwrap")
+ ("STACK_ROOT" . "$XDG_DATA_HOME/stack")
+ ("TMUX_TMPDIR" . "$XDG_RUNTIME_DIR")
+ ("WEECHAT_HOME" . "$XDG_CONFIG_HOME/weechat")
+ ("XCOMPOSECACHE" . "$XDG_CACHE_HOME/X11/XCompose")
+ ("XCOMPOSEFILE" . "$XDG_CONFIG_HOME/X11/XCompose")
+ ("ZDOTDIR" . "$XDG_CONFIG_HOME/zsh")
+ ("_JAVA_OPTIONS" .
+ "$_JAVA_OPTIONS${_JAVA_OPTIONS:+ }-Djava.util.prefs.userRoot=$XDG_CONFIG_HOME/java")))
+
+ (service
+ home-openssh-service-type
+ (home-openssh-configuration
+ (hosts
+ (let ((my-hosts/ports
+ '(("vin.twilken.net" . 50022)
+ ("vin.wg" . 50022)
+ ("pi3.twilken.net" . 51022)
+ ("pi3.wg" . 51022)
+ ("lud.twilken.net" . 22022)
+ ("lud.wg" . 22022)
+ ("matrix.twilken.net" . 22022)))
+ (git-hosts
+ '("github.com" "ssh.github.com" "bitbucket.org" "gitlab.cern.ch"))
+ (cern-ci-hosts/users
+ '(("alimonitor.cern.ch" . "alibuild")
+ ("alinsure.cern.ch" . "alibuild")
+ ("alibuildmac*.cern.ch" . "alibuild")
+ ("aido*osx*.cern.ch" . "alibuild")
+ ("alibuild*.cern.ch" . "root")
+ ("alissandra*.cern.ch" . "root")
+ ("alimesos*.cern.ch" . "root")
+ ("alientest*.cern.ch" . "root")
+ ("aliflow*.cern.ch" . "root")
+ ("alijenkins*.cern.ch" . "root"))))
+
+ (define (cern-extra-content delegate-kerberos-credentials?)
+ (string-append "\
+# Kerberos authentication
+GSSAPIAuthentication yes
+GSSAPIDelegateCredentials " (if delegate-kerberos-credentials? "yes" "no") "
+PreferredAuthentications gssapi-keyex,gssapi-with-mic,publickey,password,keyboard-interactive
+ProxyJump \"twilken@lxplus.cern.ch\"
+"))
+
+ ;; Earlier rules take precedence over later ones.
+ `(,(openssh-host (name "*.srcf.net") (user "tw466"))
+ ,(openssh-host (name "*.fritz.box")
+ (extra-content "ProxyJump lud.twilken.net"))
+ ,@(map (lambda (host port)
+ (openssh-host (name host) (port port) (user "timo")))
+ (map car my-hosts/ports)
+ (map cdr my-hosts/ports))
+ ,@(map (lambda (host) (openssh-host (name host) (user "git"))) git-hosts)
+ ;; BitBucket apparently only supports ssh-rsa.
+ ,(openssh-host (name "bitbucket.org")
+ (host-key-algorithms '("+ssh-rsa"))
+ (accepted-key-types '("+ssh-rsa")))
+ ,(openssh-host (name "gitlab.cern.ch")
+ (port 7999)
+ (extra-content "ProxyJump none")) ; no jump needed
+ ;; Avoid ProxyJump loops.
+ ,(openssh-host (name "lxplus.cern.ch")
+ (extra-content "ProxyJump none"))
+ ,(openssh-host (name "twilkendesktop.cern.ch")
+ (port 22022)
+ (forward-x11? #t)
+ (extra-content (cern-extra-content #t)))
+ ,@(map (lambda (host user)
+ (openssh-host (name host)
+ (user user)
+ (identity-file "~/.local/share/ssh-keys/alicern_id_rsa")))
+ (map car cern-ci-hosts/users)
+ (map cdr cern-ci-hosts/users))
+ ,(openssh-host (name "*.cern.ch")
+ (user "twilken")
+ (identity-file "~/.local/share/ssh-keys/cern_id_rsa")
+ (extra-content (cern-extra-content #f)))
+ ;; Default SSH key. This isn't in ~/.ssh as `home-openssh-service-type'
+ ;; manages that and might delete keys there.
+ ,(openssh-host (name "*")
+ (identity-file "~/.local/share/ssh-keys/id_rsa")
+ ;; Remote servers probably don't know about xterm-kitty.
+ (extra-content "SetEnv TERM=xterm-256color")))))))))
diff --git a/tw/home/emacs.scm b/tw/home/emacs.scm
new file mode 100644
index 00000000..d3696ac2
--- /dev/null
+++ b/tw/home/emacs.scm
@@ -0,0 +1,103 @@
+(define-module (tw home emacs)
+ #:use-module (gnu)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (tw theme))
+
+(use-package-modules base cmake emacs emacs-xyz databases finance haskell-apps llvm
+ python-xyz sqlite)
+
+(define-public emacs-packages
+ (list
+ ;; Development & language servers
+ gnu-make
+ shellcheck
+ clang ; for clangd
+ python-lsp-server
+ ;; Supported OotB by eglot, but not packaged by guix:
+ ;; https://github.com/mads-hartmann/bash-language-server
+ ;; https://github.com/regen100/cmake-language-server
+ ;; https://github.com/hrsh7th/vscode-langservers-extracted ; {html,css,json}-languageserver
+ ;; https://github.com/golang/tools/tree/master/gopls ; maybe?
+ ;; https://github.com/artempyanykh/marksman ; Markdown
+ ;; https://github.com/jeapostrophe/racket-langserver
+ ;; https://github.com/astoff/digestif ; (La)TeX
+ ;; https://github.com/redhat-developer/yaml-language-server
+ ;; Needs eglot config + not packaged (from lsp-mode):
+ ;; https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme
+ ;; https://github.com/haskell/haskell-language-server / https://github.com/haskell/ghcide
+ ;; https://github.com/eclipse/lemminx
+
+ ;; Emacs general
+ emacs
+ emacs-use-package
+ emacs-eglot
+ emacs-counsel
+ emacs-counsel-dash sqlite ; emacs-counsel-dash requires the sqlite3 binary
+ emacs-ivy
+ ;; emacs-company emacs-company-quickhelp emacs-company-posframe
+ emacs-corfu emacs-corfu-doc
+ emacs-autothemer ; for catppuccin/emacs
+ emacs-undo-tree
+ emacs-aggressive-indent
+ emacs-which-key
+ emacs-smart-mode-line
+ emacs-diminish
+ emacs-rainbow-mode
+ emacs-guix
+ ;; TODO: emacs-editorconfig emacs-sly emacs-sly-macrostep
+ emacs-org ; emacs-org-modern theme?
+
+ ;; Emacs Evil
+ emacs-evil
+ emacs-evil-collection
+ emacs-evil-expat ; for :reverse, :remove, :rename, :colo, :g*, ... ex commands
+ emacs-evil-surround
+ ;; emacs-evil-owl ; tests failing
+ emacs-evil-args
+ emacs-evil-numbers
+ emacs-evil-multiedit
+ emacs-evil-goggles
+ emacs-evil-traces
+ emacs-evil-commentary
+ emacs-evil-replace-with-register
+ emacs-evil-org
+ emacs-evil-markdown
+ emacs-evil-tex
+ emacs-evil-text-object-python
+
+ ;; Emacs language modes
+ emacs-geiser emacs-geiser-racket emacs-geiser-guile
+ ;; emacs-macrostep-geiser
+ emacs-flymake-collection ; emacs-flymake-flycheck ; if needed
+ emacs-cmake-mode emacs-gnuplot emacs-graphviz-dot-mode
+ emacs-hcl-mode emacs-ledger-mode emacs-mmm-mode
+ emacs-puppet-mode emacs-rec-mode emacs-web-mode
+ emacs-yaml-mode))
+
+(define-public emacs-services
+ (list
+ (simple-service
+ 'emacs-config home-xdg-configuration-files-service-type
+ `(("emacs/include" ,(local-file "files/emacs-packages" #:recursive? #t))
+ ("emacs/init.el" ,(local-file "files/emacs-init.el"))
+ (,(string-append "emacs/" (local-file-name catppuccin-emacs-theme))
+ ,catppuccin-emacs-theme)))
+
+ (simple-service
+ 'emacs-is-editor home-environment-variables-service-type
+ `(("EDITOR" . "emacsclient -qc")
+ ;; Tell emacsclient to return immediately after opening the file. I
+ ;; can't put this in $EDITOR as many programs expect $EDITOR to exit
+ ;; only when the user is done editing.
+ ("ASYNC_EDITOR" . "emacsclient -qcn")))
+
+ (simple-service
+ 'emacs-server home-shepherd-service-type
+ (list
+ (shepherd-service
+ (documentation "Emacs server; connect using emacsclient.")
+ (provision '(emacs))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append emacs "/bin/emacs") "--fg-daemon")))
+ (stop #~(make-kill-destructor)))))))
diff --git a/tw/home/lap.scm b/tw/home/lap.scm
index 33683af1..c769a712 100644
--- a/tw/home/lap.scm
+++ b/tw/home/lap.scm
@@ -16,9 +16,7 @@
#:use-module (gnu home services guix)
#:use-module (gnu home services mcron)
#:use-module (gnu home services pm)
- #:use-module (gnu home services shells)
#:use-module (gnu home services shepherd)
- #:use-module (gnu home services ssh)
#:use-module (gnu packages)
#:use-module (gnu services)
#:use-module (gnu services shepherd)
@@ -26,31 +24,78 @@
#:use-module (guix gexp)
#:use-module ((nongnu packages messaging)
#:select (signal-desktop zoom))
+ #:use-module (tw home common)
+ #:use-module (tw home emacs)
#:use-module (tw packages alice)
#:use-module (tw packages catppuccin)
#:use-module (tw packages games)
- #:use-module (tw packages shell)
#:use-module (tw packages xorg)
#:use-module (tw gexp)
#:use-module (tw theme))
-(use-package-modules
- admin android base bittorrent calendar cmake compression compton curl
- databases dav disk dns dunst emacs emacs-xyz file finance fonts freedesktop
- games gimp gnome gnome-xyz gnupg gnuzilla graphviz haskell-apps imagemagick
- inkscape kde less libreoffice linux lisp llvm mail maths messaging music
- networking password-utils pdf pretty-print pulseaudio pv python python-xyz
- rsync shells shellutils sqlite ssh syndication tcl terminals textutils tmux
- video version-control vim web web-browsers wm xdisorg xorg)
+(use-package-modules android bittorrent calendar compton dav dunst fonts
+ freedesktop games gimp gnome gnome-xyz gnuzilla graphviz
+ inkscape kde libreoffice linux mail messaging music
+ networking pdf pulseaudio python-xyz syndication tcl
+ terminals video web-browsers wm xdisorg xorg)
-(define gui-packages
+(define pim-packages
+ (list newsboat vdirsyncer khal khard neomutt mailcap lynx)) ; lynx for HTML mail
+
+(define pim-services
(list
+ (simple-service
+ 'pim-config home-xdg-configuration-files-service-type
+ `(("khal/config" ,(local-file "files/khal.conf"))
+ ("khard/khard.conf" ,(local-file "files/khard.conf"))
+ ("mutt/muttrc" ,(local-file "files/muttrc"))
+ ("mutt/catppuccin.muttrc" ,catppuccin-muttrc)
+ ("newsboat/config" ,(local-file "files/newsboat.conf"))
+ ("newsboat/config.catppuccin" ,catppuccin-newsboat)
+ ("vdirsyncer/config" ,(local-file "files/vdirsyncer.conf"))))
+
+ (simple-service
+ 'pim-cronjobs home-mcron-service-type
+ (list #~(job "15 */2 * * *" ; every two hours at HH:15
+ (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " metasync"))
+ #~(job "0,30 * * * *" ; every half hour
+ (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " sync"))))
+
+ (simple-service
+ 'mail-files home-files-service-type
+ `((".mailcap" ,(local-file "files/mailcap"))
+ ;; The file from git main is newer than the one bundled with the
+ ;; packaged neomutt version and contains a few fixes.
+ (".local/bin/mutt_oauth2.py"
+ ,(local-file "files/neomutt/contrib/oauth2/mutt_oauth2.py" #:recursive? #t))))))
+
+(define (polybar-service monitor)
+ (shepherd-service
+ (documentation (string-append "Polybar desktop bar for monitor" monitor "."))
+ (provision (list (string->symbol (string-append "polybar-" monitor))))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append polybar "/bin/polybar"))
+ #:environment-variables
+ (cons #$(string-append "POLYBAR_MONITOR=" monitor)
+ (default-environment-variables))))
+ (stop #~(make-kill-destructor))))
+
+(home-environment
+ (packages
+ ;; These packages will show up in the home profile, under ~/.guix-home/profile.
+ (cons*
+ ;; CLI tools
+ adb beets powertop
+
+ ;; Work
+ s3cmd python-alibuild ; python-alidistlint
+
;; i3 and Xorg. i3 itself must be installed system-wide for gdm to pick it up.
;; acpilight is a drop-in xbacklight replacement, as xbacklight doesn't work on my system.
- acpilight arandr blueman dunst gnupg gimp hsetroot inkscape icecat
- kdeconnect kitty libreoffice mpv nheko password-store pass-otp polybar rofi
- rofi-calc signal-desktop simple-scan transmission-remote-gtk xdg-utils xdot
- xclip xdotool xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xrdb xsel
+ acpilight arandr blueman dunst gimp hsetroot inkscape icecat kdeconnect
+ kitty libreoffice mpv nheko polybar pulsemixer rofi rofi-calc
+ signal-desktop simple-scan tk transmission-remote-gtk xdg-utils xdot xclip
+ xcwd xdotool xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xrdb xsel
xset xwininfo zoom zathura zathura-ps zathura-pdf-poppler
dconf dconf-editor ; required for config by blueman, cozy, ...
;; gnome-keyring ; installed system-wide; see system-configuration.scm
@@ -61,21 +106,45 @@
font-hermit font-inconsolata font-fira-code font-fira-sans
font-libertinus font-openmoji
;; Theming
- papirus-icon-theme catppuccin-gtk-theme catppuccin-mocha-dark-cursors))
+ papirus-icon-theme catppuccin-gtk-theme catppuccin-mocha-dark-cursors
-(define (polybar-service monitor)
- (shepherd-service
- (documentation (string-append "Polybar desktop bar for monitor" monitor "."))
- (provision (list (string->symbol (string-append "polybar-" monitor))))
- (start #~(make-forkexec-constructor
- (list #$(file-append polybar "/bin/polybar"))
- #:environment-variables
- (cons #$(string-append "POLYBAR_MONITOR=" monitor)
- (default-environment-variables))))
- (stop #~(make-kill-destructor))))
+ (append common-packages emacs-packages pim-packages)))
+
+ ;; To search for available home services, run 'guix home search KEYWORD'.
+ (services
+ (cons*
+ ;; Configuration files for terminal-only programs in $XDG_CONFIG_HOME.
+ (simple-service
+ 'laptop-config home-xdg-configuration-files-service-type
+ `(;; All alibuild needs is an empty file.
+ ("alibuild/disable-analytics"
+ ,(plain-file "alibuild-disable-analytics" ""))
+ ("X11/XCompose" ,(local-file "files/XCompose")) ; see also: $XCOMPOSEFILE variable
+ ("X11/Xresources" ,(local-file "files/Xresources"))))
+
+ (simple-service ; this can't be a `service' as that would remove the 'guix channel
+ 'nonfree-channels home-channels-service-type
+ (list
+ ;; Nonguix is also needed system-wide for non-free drivers!
+ (channel
+ (name 'nonguix)
+ (url "https://gitlab.com/nonguix/nonguix")
+ ;; Enable signature verification:
+ (introduction
+ (make-channel-introduction
+ "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
+ (openpgp-fingerprint
+ "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5"))))
+ (channel
+ (name 'guix-gaming-games)
+ (url "https://gitlab.com/guix-gaming-channels/games")
+ ;; Enable signature verification:
+ (introduction
+ (make-channel-introduction
+ "c23d64f1b8cc086659f8781b27ab6c7314c5cca5"
+ (openpgp-fingerprint
+ "50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F"))))))
-(define gui-services
- (list
;; Batsignal: battery level notifications.
(service home-batsignal-service-type
(home-batsignal-configuration
@@ -89,15 +158,16 @@
;; Approximate location
(latitude 46.0)
(longitude 6.0)
- ;; (location-provider 'geoclue2) ; currently waits forever for a location -- not sure why geoclue doesn't work
- ;; (daytime-temperature 6500) ; default 6500
- ;; (nighttime-temperature 4500) ; default 4500
+ ;; (location-provider 'geoclue2) ; TODO: currently waits forever for a location -- not sure why geoclue doesn't work
+ ;; (daytime-temperature 6500) ; default 6500
+ ;; (nighttime-temperature 4500) ; default 4500
(daytime-brightness 1.0)
(nighttime-brightness 0.7)
(extra-content "fade=0"))) ; with fade=1, restarting redshift causes flickering for a few secs
;; The dbus service doesn't seem to be added automatically.
- (service home-dbus-service-type (home-dbus-configuration))
+ (service home-dbus-service-type
+ (home-dbus-configuration))
(simple-service
'gui-services home-shepherd-service-type
@@ -174,31 +244,27 @@
(provision '(xorg-setup))
(one-shot? #t)
(start #~(lambda _
- (invoke #$(file-append numlockx "/bin/numlockx") "on")
+ (system* #$(file-append numlockx "/bin/numlockx") "on")
;; Turn off the monitors if there is no input for 10 minutes.
- (invoke #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
- (invoke #$(file-append xrandr "/bin/xrandr")
- "--output" "eDP-1" "--auto"
- ;; Don't use --auto for this monitor. That
- ;; configures it at 60 Hz, which causes
- ;; it to briefly turn off every few minutes.
- "--output" "HDMI-1-1" "--mode" "2560x1440" "--rate" "120.00"
- "--right-of" "eDP-1")
+ (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
+ (system* #$(file-append xrandr "/bin/xrandr")
+ "--output" "eDP-1" "--auto"
+ ;; Don't use --auto for this monitor. That
+ ;; configures it at 60 Hz, which causes
+ ;; it to briefly turn off every few minutes.
+ "--output" "HDMI-1-1" "--mode" "2560x1440" "--rate" "120.00"
+ "--right-of" "eDP-1")
;; Set the desktop background picture. Hopefully doing this just after
;; xrandr works and sets it for both screens.
- (invoke #$(file-append hsetroot "/bin/hsetroot") "-cover"
- (string-append (getenv "HOME")
- "/pictures/Backgrounds/greece/IMG_20181201_104748_DRO.jpg")))))))
+ (system* #$(file-append hsetroot "/bin/hsetroot") "-cover"
+ (string-append (getenv "HOME")
+ "/pictures/Backgrounds/greece/IMG_20181201_104748_DRO.jpg")))))))
;; Configuration files for GUI programs in $XDG_CONFIG_HOME.
(simple-service
'gui-config home-xdg-configuration-files-service-type
`(("dunst/dunstrc" ,(local-file "files/dunstrc"))
("dunst/dunstrc.d/50-catppuccin.conf" ,catppuccin-dunstrc)
- ("emacs/include" ,(local-file "files/emacs-packages" #:recursive? #t))
- ("emacs/init.el" ,(local-file "files/emacs-init.el"))
- (,(string-append "emacs/" (local-file-name catppuccin-emacs-theme))
- ,catppuccin-emacs-theme)
("gtk-2.0/gtkrc" ,(local-file "files/gtk2.ini"))
("gtk-3.0/settings.ini" ,(local-file "files/gtk3.ini"))
("i3/config" ,(local-file "files/i3.conf"))
@@ -218,11 +284,11 @@
("zathura/catppuccin" ,catppuccin-zathura)))
(simple-service
- 'gui-files home-files-service-type
+ 'cursor-theme home-files-service-type
`((".icons/default/index.theme" ,(local-file "files/cursors.ini"))))
(simple-service
- 'gui-environment-variables home-environment-variables-service-type
+ 'gui-environment home-environment-variables-service-type
`(("TERMINAL" . "kitty")
("_JAVA_OPTIONS" .
,(string-append
@@ -251,363 +317,11 @@
;; We mustn't use `file-append' here, as we have to pick up the
;; setuid binary for i3lock installed by the system config.
(system* "i3lock" "-nc" #$catppuccin-background-color)
- (system* #$(file-append xset "/bin/xset") "dpms" "0" "0" "0")
+ (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
(system* #$(file-append dunst "/bin/dunstctl") "set-paused" "false"))))
;; With #:recursive? #t, Guix keeps the files' permission bits, i.e. makes them executable.
- (".local/bin/sessionmenu" ,(local-file "files/sessionmenu" #:recursive? #t)) ; rofi logout/reboot menu
- (".local/bin/passmenu" ,(local-file "files/passmenu" #:recursive? #t)) ; rofi passwords menu
- (".local/bin/volume" ,(local-file "files/volume" #:recursive? #t)))))) ; set volume on key press
-
-(home-environment
- (packages
- ;; These packages will show up in the home profile, under ~/.guix-home/profile.
- (cons*
- ;; CLI tools
- adb beets curl dos2unix fdupes file fzf git
- gnuplot graphviz hledger imagemagick jq lesspipe
- nvme-cli openssh powertop pulsemixer pv python
- python-ipython recutils rsync sbcl smartmontools
- source-highlight tk tmux tree xxd zip unzip
- get-iplayer ffmpeg atomicparsley yt-dlp
- neomutt mailcap lynx ; mail (lynx for HTML mail)
- newsboat vdirsyncer khal khard
-
- ;; Install only bind-utils like dig, not the full suite.
- (list isc-bind "utils")
-
- ;; Ranger can do code highlighting using python-pygments and
- ;; image previews in kitty using python-pillow.
- ranger python-pygments python-pillow mediainfo python-pdftotext
- xcwd ; my own package
-
- ;; Work
- s3cmd python-alibuild ; python-alidistlint
-
- ;; Shell
- zsh zsh-autosuggestions zsh-syntax-highlighting zsh-autopair
- zsh-completions ; my own package
-
- ;; Development & language servers
- gnu-make
- shellcheck
- clang ; for clangd
- python-lsp-server
- ;; Supported OotB by eglot, but not packaged by guix:
- ;; https://github.com/mads-hartmann/bash-language-server
- ;; https://github.com/regen100/cmake-language-server
- ;; https://github.com/hrsh7th/vscode-langservers-extracted ; {html,css,json}-languageserver
- ;; https://github.com/golang/tools/tree/master/gopls ; maybe?
- ;; https://github.com/artempyanykh/marksman ; Markdown
- ;; https://github.com/jeapostrophe/racket-langserver
- ;; https://github.com/astoff/digestif ; (La)TeX
- ;; https://github.com/redhat-developer/yaml-language-server
- ;; Needs eglot config + not packaged (from lsp-mode):
- ;; https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme
- ;; https://github.com/haskell/haskell-language-server / https://github.com/haskell/ghcide
- ;; https://github.com/eclipse/lemminx
-
- ;; Emacs
- emacs
- emacs-use-package
- emacs-eglot
- emacs-counsel
- emacs-counsel-dash sqlite ; emacs-counsel-dash requires the sqlite3 binary
- emacs-ivy
- ;; emacs-company emacs-company-quickhelp emacs-company-posframe
- emacs-corfu emacs-corfu-doc
- emacs-autothemer ; for catppuccin/emacs
- emacs-undo-tree
- emacs-aggressive-indent
- emacs-which-key
- emacs-smart-mode-line
- emacs-diminish
- emacs-rainbow-mode
- emacs-guix
- ;; TODO: emacs-editorconfig emacs-sly emacs-sly-macrostep
- emacs-org ; emacs-org-modern theme?
-
- emacs-evil
- emacs-evil-collection
- emacs-evil-expat ; for :reverse, :remove, :rename, :colo, :g*, ... ex commands
- emacs-evil-surround
- ;; emacs-evil-owl ; tests failing
- emacs-evil-args
- emacs-evil-numbers
- emacs-evil-multiedit
- emacs-evil-goggles
- emacs-evil-traces
- emacs-evil-commentary
- emacs-evil-replace-with-register
- emacs-evil-org
- emacs-evil-markdown
- emacs-evil-tex
- emacs-evil-text-object-python
-
- emacs-geiser emacs-geiser-racket emacs-geiser-guile
- ;; emacs-macrostep-geiser
- emacs-flymake-collection ; emacs-flymake-flycheck ; if needed
- emacs-cmake-mode emacs-gnuplot emacs-graphviz-dot-mode
- emacs-hcl-mode emacs-ledger-mode emacs-mmm-mode
- emacs-puppet-mode emacs-rec-mode emacs-web-mode
- emacs-yaml-mode
-
- gui-packages))
-
- ;; To search for available home services, run 'guix home search KEYWORD'.
- (services
- (cons*
- ;; User shepherd services.
- (simple-service
- 'terminal-services home-shepherd-service-type
- (list
- (shepherd-service
- (documentation "Emacs server; connect using emacsclient.")
- (provision '(emacs))
- (start #~(make-forkexec-constructor
- (list #$(file-append emacs "/bin/emacs") "--fg-daemon")))
- (stop #~(make-kill-destructor)))
- (shepherd-service
- (documentation "GPG agent; caches key passwords.")
- (provision '(gpg-agent))
- (start #~(lambda _
- (invoke #$(file-append gnupg "/bin/gpg-agent")
- "--daemon" "--no-detach")))
- (stop #~(lambda _
- (invoke "gpg-connect-agent" "killagent" "/bye"))))))
-
- (simple-service
- 'terminal-cronjobs home-mcron-service-type
- (list #~(job "15 */2 * * *" ; every two hours at HH:15
- (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " metasync"))
- #~(job "0,30 * * * *" ; every half hour
- (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " sync"))))
-
- ;; Configuration files for terminal-only programs in $XDG_CONFIG_HOME.
- (service
- home-xdg-configuration-files-service-type
- `(;; All alibuild needs is an empty file.
- ("alibuild/disable-analytics"
- ,(plain-file "alibuild-disable-analytics" ""))
- ("git/config" ,(local-file "files/gitconfig"))
- ("htop/htoprc" ,(local-file "files/htoprc"))
- ("khal/config" ,(local-file "files/khal.conf"))
- ("khard/khard.conf" ,(local-file "files/khard.conf"))
- ("lesskey" ,(local-file "files/lesskey"))
- ("mutt/muttrc" ,(local-file "files/muttrc"))
- ("mutt/catppuccin.muttrc" ,catppuccin-muttrc)
- ("newsboat/config" ,(local-file "files/newsboat.conf"))
- ("newsboat/config.catppuccin" ,catppuccin-newsboat)
- ("ranger/rc.conf" ,(local-file "files/ranger.conf"))
- ("user-dirs.locale" ,(plain-file "user-dirs.locale" "C")) ; Not sure if this is needed. Arch has it.
- ("user-dirs.dirs" ,(local-file "files/user-dirs.dirs"))
- ("vdirsyncer/config" ,(local-file "files/vdirsyncer.conf"))
- ("X11/XCompose" ,(local-file "files/XCompose")) ; see also: $XCOMPOSEFILE variable
- ("X11/Xresources" ,(local-file "files/Xresources"))))
-
- (simple-service
- 'terminal-files home-files-service-type
- `((".mailcap" ,(local-file "files/mailcap"))
- ;; The file from git main is newer than the one bundled with the
- ;; packaged neomutt version and contains a few fixes.
- (".local/bin/mutt_oauth2.py"
- ,(local-file "files/neomutt/contrib/oauth2/mutt_oauth2.py" #:recursive? #t))
- ;; GnuPG config files must be in ~/.local/share/gnupg, not ~/.config,
- ;; so we can't use `home-xdg-configuration-files-service-type'.
- (".local/share/gnupg/gpg.conf" ,(local-file "files/gpg.conf"))
- (".local/share/gnupg/gpg-agent.conf"
- ,(mixed-text-file "gpg-agent.conf" "\
-pinentry-program " (file-append pinentry-rofi "/bin/pinentry-rofi") "
-# Needed if spawning lots of parallel gpg --decrypt processes. https://dev.gnupg.org/T3530
-auto-expand-secmem
-"))))
-
- (service home-zsh-service-type
- (home-zsh-configuration
- (zshrc (list (local-file "files/zshrc")
- (local-file "files/prompt.zsh")))))
-
- (simple-service
- 'terminal-environment-variables home-environment-variables-service-type
- `(;; Path to my own package definitions. If invoking `guix home'
- ;; afresh, this needs to be set manually to find these packages.
- ("GUIX_PACKAGE_PATH" . "$HOME/src/guix-decls")
-
- ;; Prepend my own binaries to $PATH. These should probably all
- ;; be managed through `home-files-service-type'.
- ("PATH" . "$HOME/.local/bin${PATH:+:}$PATH")
-
- ;; Default terminal-related applications
- ("EDITOR" . "emacsclient -qc")
- ;; Tell emacsclient to return immediately after opening the
- ;; file. I can't put this in $EDITOR as many programs expect
- ;; $EDITOR to exit only when the user is done editing.
- ("ASYNC_EDITOR" . "emacsclient -qcn")
- ("PAGER" . "less")
- ;; Guix force-overrides $LESS by default, so force-force it to do what I want instead.
- ;; `less' reads the `lesskey' file configured above.
- ("GUIX_PAGER" . "env -u LESS less")
- ;; To make LESS_TERMCAP_* variables (set in lesskey) apply to man pages in kitty.
- ("GROFF_NO_SGR" . "1")
-
- ;; Shell history -- primarily for zsh, but Emacs' eshell uses this too
- ("HISTSIZE" . "10000000")
-
- ;; ("NVIM_TUI_ENABLE_CURSOR_SHAPE" . "1")
- ("LEDGER_FILE" . "$HOME/sync/ledger/ledger.journal")
- ("GTAGSLABEL" . "pygments")
-
- ;; Disable at-spi-dbus-launcher accessibility service.
- ("NO_AT_BRIDGE" . "1")
-
- ;; Auto-compilation is annoying and creates a bunch of files that are never cleaned up.
- ("GUILE_AUTO_COMPILE" . "0")
-
- ;; For some reason, Guix doesn't seem to add these paths automatically.
- ("GUILE_LOAD_PATH" .
- ,(string-append
- "$GUIX_PACKAGE_PATH:"
- "$XDG_CONFIG_HOME/guix/current/share/guile/site/3.0"
- "${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"))
- ("GUILE_LOAD_COMPILED_PATH" .
- ,(string-append
- "$XDG_CONFIG_HOME/guix/current/lib/guile/3.0/site-ccache:"
- "$XDG_CONFIG_HOME/guix/current/share/guile/site/3.0"
- "${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"))))
-
- ;; XDG basedir spec compliance for various programs
- ;; See: https://wiki.archlinux.org/index.php/XDG_Base_Directory for a list of programs.
- ;; The `home-xdg-base-directories' service (enabled by default) sets $XDG_* variables for us.
- (simple-service
- 'xdg-spec-compliance home-environment-variables-service-type
- '(("ANDROID_EMULATOR_HOME" . "$XDG_DATA_HOME/android-emulator")
- ("ASPELL_CONF" . "per-conf $XDG_CONFIG_HOME/aspell/aspell.conf; home-dir $XDG_DATA_HOME/aspell")
- ("BUP_DIR" . "$XDG_DATA_HOME/bup")
- ("CARGO_HOME" . "$XDG_DATA_HOME/cargo")
- ("DSHGROUP_PATH" . "$XDG_DATA_HOME/dsh/group:/etc/dsh/group")
- ("ELECTRUMDIR" . "$XDG_DATA_HOME/electrum")
- ("FG_HOME" . "$XDG_DATA_HOME/fgfs")
- ("GETIPLAYERUSERPREFS" . "$XDG_DATA_HOME/get_iplayer")
- ("GNUPGHOME" . "$XDG_DATA_HOME/gnupg")
- ("GTK2_RC_FILES" . "$XDG_CONFIG_HOME/gtk-2.0/gtkrc")
- ("ICEAUTHORITY" . "$XDG_CACHE_HOME/ICEauthority")
- ("INPUTRC" . "$XDG_CONFIG_HOME/readline/inputrc")
- ("IPYTHONDIR" . "$XDG_CONFIG_HOME/ipython")
- ("JUPYTER_CONFIG_DIR" . "$XDG_CONFIG_HOME/jupyter")
- ;; KONAN_DATA_DIR=~/.konan by default; grows to multiple GiB.
- ;; https://discuss.kotlinlang.org/t/change-konan-folder-location/18309
- ("KONAN_DATA_DIR" . "$XDG_CACHE_HOME/konan")
- ("NPM_CONFIG_USERCONFIG" . "$XDG_CONFIG_HOME/npm/npmrc")
- ("PASSWORD_STORE_DIR" . "$XDG_DATA_HOME/password-store")
- ("PLTUSERHOME" . "$XDG_DATA_HOME/racket")
- ("PYLINTHOME" . "$XDG_CACHE_HOME/pylint")
- ("PYLINTRC" . "$XDG_CONFIG_HOME/pylint/pylintrc")
- ("RECOLL_CONFDIR" . "$XDG_CONFIG_HOME/recoll")
- ("RLWRAP_HOME" . "$XDG_DATA_HOME/rlwrap")
- ("STACK_ROOT" . "$XDG_DATA_HOME/stack")
- ("TMUX_TMPDIR" . "$XDG_RUNTIME_DIR")
- ("WEECHAT_HOME" . "$XDG_CONFIG_HOME/weechat")
- ("XCOMPOSECACHE" . "$XDG_CACHE_HOME/X11/XCompose")
- ("XCOMPOSEFILE" . "$XDG_CONFIG_HOME/X11/XCompose")
- ("ZDOTDIR" . "$XDG_CONFIG_HOME/zsh")
- ("_JAVA_OPTIONS" .
- "$_JAVA_OPTIONS${_JAVA_OPTIONS:+ }-Djava.util.prefs.userRoot=$XDG_CONFIG_HOME/java")))
-
- (service
- home-openssh-service-type
- (home-openssh-configuration
- (hosts
- (let ((my-hosts/ports
- '(("vin.twilken.net" . 50022)
- ("vin.wg" . 50022)
- ("pi3.twilken.net" . 51022)
- ("pi3.wg" . 51022)
- ("lud.twilken.net" . 22022)
- ("lud.wg" . 22022)
- ("matrix.twilken.net" . 22022)))
- (git-hosts
- '("github.com" "ssh.github.com" "bitbucket.org" "gitlab.cern.ch"))
- (cern-ci-hosts/users
- '(("alimonitor.cern.ch" . "alibuild")
- ("alinsure.cern.ch" . "alibuild")
- ("alibuildmac*.cern.ch" . "alibuild")
- ("aido*osx*.cern.ch" . "alibuild")
- ("alibuild*.cern.ch" . "root")
- ("alissandra*.cern.ch" . "root")
- ("alimesos*.cern.ch" . "root")
- ("alientest*.cern.ch" . "root")
- ("aliflow*.cern.ch" . "root")
- ("alijenkins*.cern.ch" . "root"))))
-
- (define (cern-extra-content delegate-kerberos-credentials?)
- (string-append "\
-# Kerberos authentication
-GSSAPIAuthentication yes
-GSSAPIDelegateCredentials " (if delegate-kerberos-credentials? "yes" "no") "
-PreferredAuthentications gssapi-keyex,gssapi-with-mic,publickey,password,keyboard-interactive
-ProxyJump \"twilken@lxplus.cern.ch\"
-"))
-
- ;; Earlier rules take precedence over later ones.
- `(,(openssh-host (name "*.srcf.net") (user "tw466"))
- ,(openssh-host (name "*.fritz.box")
- (extra-content "ProxyJump lud.twilken.net"))
- ,@(map (lambda (host port)
- (openssh-host (name host) (port port) (user "timo")))
- (map car my-hosts/ports)
- (map cdr my-hosts/ports))
- ,@(map (lambda (host) (openssh-host (name host) (user "git"))) git-hosts)
- ;; BitBucket apparently only supports ssh-rsa.
- ,(openssh-host (name "bitbucket.org")
- (host-key-algorithms '("+ssh-rsa"))
- (accepted-key-types '("+ssh-rsa")))
- ,(openssh-host (name "gitlab.cern.ch")
- (port 7999)
- (extra-content "ProxyJump none")) ; no jump needed
- ;; Avoid ProxyJump loops.
- ,(openssh-host (name "lxplus.cern.ch")
- (extra-content "ProxyJump none"))
- ,(openssh-host (name "twilkendesktop.cern.ch")
- (port 22022)
- (forward-x11? #t)
- (extra-content (cern-extra-content #t)))
- ,@(map (lambda (host user)
- (openssh-host (name host)
- (user user)
- (identity-file "~/.local/share/ssh-keys/alicern_id_rsa")))
- (map car cern-ci-hosts/users)
- (map cdr cern-ci-hosts/users))
- ,(openssh-host (name "*.cern.ch")
- (user "twilken")
- (identity-file "~/.local/share/ssh-keys/cern_id_rsa")
- (extra-content (cern-extra-content #f)))
- ;; Default SSH key. This isn't in ~/.ssh as `home-openssh-service-type'
- ;; manages that and might delete keys there.
- ,(openssh-host (name "*")
- (identity-file "~/.local/share/ssh-keys/id_rsa")
- ;; Remote servers probably don't know about xterm-kitty.
- (extra-content "SetEnv TERM=xterm-256color")))))))
-
- (simple-service ; this can't be a `service' as that would remove the 'guix channel
- 'nonfree-channels home-channels-service-type
- (list
- ;; Nonguix is also needed system-wide for non-free drivers!
- (channel
- (name 'nonguix)
- (url "https://gitlab.com/nonguix/nonguix")
- ;; Enable signature verification:
- (introduction
- (make-channel-introduction
- "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
- (openpgp-fingerprint
- "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5"))))
- (channel
- (name 'guix-gaming-games)
- (url "https://gitlab.com/guix-gaming-channels/games")
- ;; Enable signature verification:
- (introduction
- (make-channel-introduction
- "c23d64f1b8cc086659f8781b27ab6c7314c5cca5"
- (openpgp-fingerprint
- "50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F"))))))
+ (".local/bin/sessionmenu" ,(local-file "files/sessionmenu" #:recursive? #t))
+ (".local/bin/passmenu" ,(local-file "files/passmenu" #:recursive? #t))
+ (".local/bin/volume" ,(local-file "files/volume" #:recursive? #t))))
- gui-services)))
+ (append common-services emacs-services pim-services))))
diff --git a/tw/home/lud.scm b/tw/home/lud.scm
new file mode 100644
index 00000000..10f4b107
--- /dev/null
+++ b/tw/home/lud.scm
@@ -0,0 +1,10 @@
+(define-module (tw home lud)
+ #:use-module (gnu home)
+ #:use-module (tw home common)
+ #:use-module (tw home emacs))
+
+(home-environment
+ ;; These packages will show up in the home profile, under ~/.guix-home/profile.
+ (packages (append common-packages emacs-packages))
+ ;; To search for available home services, run 'guix home search KEYWORD'.
+ (services (append common-services emacs-services)))