aboutsummaryrefslogtreecommitdiff
path: root/tw
diff options
context:
space:
mode:
Diffstat (limited to 'tw')
-rw-r--r--tw/home.scm736
-rw-r--r--tw/home/btl.scm17
-rw-r--r--tw/home/cern.scm29
-rw-r--r--tw/home/frm.scm14
-rw-r--r--tw/home/lap.scm17
-rw-r--r--tw/home/server.scm9
-rw-r--r--tw/services/desktop.scm449
-rw-r--r--tw/services/dev-env.scm158
-rw-r--r--tw/services/files/XCompose (renamed from tw/home/files/XCompose)0
-rw-r--r--tw/services/files/Xresources (renamed from tw/home/files/Xresources)0
-rw-r--r--tw/services/files/aerc/accounts.conf (renamed from tw/home/files/aerc/accounts.conf)0
-rw-r--r--tw/services/files/aerc/accounts.work.conf (renamed from tw/home/files/aerc/accounts.work.conf)0
-rw-r--r--tw/services/files/aerc/aerc.conf (renamed from tw/home/files/aerc/aerc.conf)0
-rw-r--r--tw/services/files/aerc/binds.conf (renamed from tw/home/files/aerc/binds.conf)0
-rwxr-xr-xtw/services/files/aerc/filters/colorize.ansi (renamed from tw/home/files/aerc/filters/colorize.ansi)0
-rw-r--r--tw/services/files/cursors.ini (renamed from tw/home/files/cursors.ini)0
-rw-r--r--tw/services/files/dunstrc (renamed from tw/home/files/dunstrc)0
-rw-r--r--tw/services/files/emacs-init.el (renamed from tw/home/files/emacs-init.el)0
-rw-r--r--tw/services/files/emacs-packages/actionlint.el (renamed from tw/home/files/emacs-packages/actionlint.el)0
-rw-r--r--tw/services/files/emacs-packages/alidist-mode.el (renamed from tw/home/files/emacs-packages/alidist-mode.el)0
-rw-r--r--tw/services/files/emacs-packages/bemscript-mode.el (renamed from tw/home/files/emacs-packages/bemscript-mode.el)0
-rw-r--r--tw/services/files/emacs-packages/environmentd-mode.el (renamed from tw/home/files/emacs-packages/environmentd-mode.el)0
-rw-r--r--tw/services/files/emacs-packages/flymake-guile.el (renamed from tw/home/files/emacs-packages/flymake-guile.el)0
-rw-r--r--tw/services/files/emacs-packages/ifm-mode.el (renamed from tw/home/files/emacs-packages/ifm-mode.el)0
-rw-r--r--tw/services/files/emacs-packages/pam-env-mode.el (renamed from tw/home/files/emacs-packages/pam-env-mode.el)0
-rw-r--r--tw/services/files/emacs-packages/vcard-mode.el (renamed from tw/home/files/emacs-packages/vcard-mode.el)0
-rw-r--r--tw/services/files/emacsclient.desktop (renamed from tw/home/files/emacsclient.desktop)0
-rw-r--r--tw/services/files/gtk2.ini (renamed from tw/home/files/gtk2.ini)0
-rw-r--r--tw/services/files/gtk3.ini (renamed from tw/home/files/gtk3.ini)0
-rw-r--r--tw/services/files/i3.conf (renamed from tw/home/files/i3.conf)0
-rw-r--r--tw/services/files/khal.conf (renamed from tw/home/files/khal.conf)0
-rw-r--r--tw/services/files/khard.conf (renamed from tw/home/files/khard.conf)0
-rw-r--r--tw/services/files/kitty.conf (renamed from tw/home/files/kitty.conf)0
-rw-r--r--tw/services/files/mimeapps.list (renamed from tw/home/files/mimeapps.list)0
-rw-r--r--tw/services/files/newsboat.conf (renamed from tw/home/files/newsboat.conf)0
-rwxr-xr-xtw/services/files/passmenu (renamed from tw/home/files/passmenu)0
-rw-r--r--tw/services/files/picom.conf (renamed from tw/home/files/picom.conf)0
-rw-r--r--tw/services/files/rofi.rasi (renamed from tw/home/files/rofi.rasi)0
-rwxr-xr-xtw/services/files/sessionmenu (renamed from tw/home/files/sessionmenu)0
-rw-r--r--tw/services/files/vdirsyncer.conf (renamed from tw/home/files/vdirsyncer.conf)0
-rw-r--r--tw/services/files/vimrc (renamed from tw/home/files/vimrc)0
-rwxr-xr-xtw/services/files/volume (renamed from tw/home/files/volume)0
-rw-r--r--tw/services/files/zathurarc (renamed from tw/home/files/zathurarc)0
43 files changed, 718 insertions, 711 deletions
diff --git a/tw/home.scm b/tw/home.scm
index c47a8d5d..2cf21a7e 100644
--- a/tw/home.scm
+++ b/tw/home.scm
@@ -1,294 +1,87 @@
(define-module (tw home)
- #:use-module (ice-9 match)
#:use-module (ice-9 string-fun)
#:use-module (gnu)
#:use-module (gnu home services)
#:use-module (gnu home services desktop)
- #:use-module (gnu home services mail)
- #:use-module (gnu home services mcron)
#:use-module (gnu home services shells)
#:use-module (gnu home services shepherd)
#:use-module (gnu home services ssh)
- #:use-module (gnu packages admin)
- #:use-module (gnu packages aidc)
- #:use-module (gnu packages android)
- #:use-module (gnu packages backup)
- #:use-module (gnu packages base)
- #:use-module (gnu packages bittorrent)
- #:use-module (gnu packages calendar)
- #:use-module (gnu packages check)
- #:use-module (gnu packages chromium)
- #:use-module (gnu packages cmake)
- #:use-module (gnu packages compression)
- #:use-module (gnu packages compton)
- #:use-module (gnu packages curl)
- #:use-module (gnu packages databases)
- #:use-module (gnu packages dav)
- #:use-module (gnu packages disk)
- #:use-module (gnu packages dns)
- #:use-module (gnu packages elf)
- #:use-module (gnu packages emacs)
- #:use-module (gnu packages emacs-xyz)
- #:use-module (gnu packages file)
- #:use-module (gnu packages finance)
- #:use-module (gnu packages fonts)
- #:use-module (gnu packages freedesktop)
- #:use-module (gnu packages games)
- #:use-module (gnu packages gcc)
- #:use-module (gnu packages gimp)
- #:use-module (gnu packages gl)
- #:use-module (gnu packages gnome)
- #:use-module (gnu packages gnome-xyz)
- #:use-module (gnu packages gnupg)
- #:use-module (gnu packages gnuzilla)
- #:use-module (gnu packages graphviz)
- #:use-module (gnu packages haskell-apps)
- #:use-module (gnu packages image-viewers)
- #:use-module (gnu packages imagemagick)
- #:use-module (gnu packages inkscape)
- #:use-module (gnu packages less)
- #:use-module (gnu packages libreoffice)
- #:use-module (gnu packages linux)
- #:use-module (gnu packages lisp)
- #:use-module (gnu packages llvm)
- #:use-module (gnu packages mail)
- #:use-module (gnu packages maths)
- #:use-module (gnu packages messaging)
- #:use-module (gnu packages music)
- #:use-module (gnu packages ncdu)
- #:use-module (gnu packages package-management)
- #:use-module (gnu packages password-utils)
- #:use-module (gnu packages pdf)
- #:use-module (gnu packages pretty-print)
- #:use-module (gnu packages pulseaudio)
- #:use-module (gnu packages pv)
- #:use-module (gnu packages python)
- #:use-module (gnu packages python-build)
- #:use-module (gnu packages python-check)
- #:use-module (gnu packages python-xyz)
- #:use-module (gnu packages rsync)
- #:use-module (gnu packages shells)
- #:use-module (gnu packages shellutils)
- #:use-module (gnu packages sqlite)
- #:use-module (gnu packages ssh)
- #:use-module (gnu packages syndication)
- #:use-module (gnu packages tcl)
- #:use-module (gnu packages terminals)
- #:use-module (gnu packages tex)
- #:use-module (gnu packages textutils)
- #:use-module (gnu packages tls)
- #:use-module (gnu packages tmux)
- #:use-module (gnu packages tree-sitter)
- #:use-module (gnu packages version-control)
- #:use-module (gnu packages video)
- #:use-module (gnu packages vim)
- #:use-module (gnu packages web)
- #:use-module (gnu packages web-browsers)
- #:use-module (gnu packages wm)
- #:use-module (gnu packages xdisorg)
- #:use-module (gnu packages xfce)
- #:use-module (gnu packages xorg)
+ #:use-module ((gnu packages admin) #:select (fdupes smartmontools tree))
+ #:use-module ((gnu packages android) #:select (adb fastboot))
+ #:use-module ((gnu packages backup) #:select (restic))
+ #:use-module ((gnu packages compression) #:select (zip unzip))
+ #:use-module ((gnu packages curl) #:select (curl))
+ #:use-module ((gnu packages databases) #:select (recutils))
+ #:use-module ((gnu packages disk) #:select (ranger))
+ #:use-module ((gnu packages dns) #:select (isc-bind))
+ #:use-module ((gnu packages file) #:select (file))
+ #:use-module ((gnu packages finance) #:select (hledger))
+ #:use-module ((gnu packages gnupg) #:select (gnupg))
+ #:use-module ((gnu packages graphviz) #:select (graphviz))
+ #:use-module ((gnu packages imagemagick) #:select (imagemagick))
+ #:use-module ((gnu packages less) #:select (less lesspipe))
+ #:use-module ((gnu packages linux) #:select (net-tools))
+ #:use-module ((gnu packages lisp) #:select (sbcl))
+ #:use-module ((gnu packages maths) #:select (gnuplot))
+ #:use-module ((gnu packages music) #:select (beets cmus))
+ #:use-module ((gnu packages ncdu) #:select (ncdu ncdu))
+ #:use-module ((gnu packages password-utils) #:select (password-store pass-otp))
+ #:use-module ((gnu packages pretty-print) #:select (source-highlight))
+ #:use-module ((gnu packages pv) #:select (pv))
+ #:use-module ((gnu packages python) #:select (python))
+ #:use-module ((gnu packages python-xyz) #:select (python-ipython python-pygments python-pillow python-pdftotext))
+ #:use-module ((gnu packages rsync) #:select (rsync))
+ #:use-module ((gnu packages shells) #:select (zsh))
+ #:use-module ((gnu packages shellutils) #:select (zsh-autosuggestions zsh-history-substring-search zsh-syntax-highlighting zsh-completions))
+ #:use-module ((gnu packages ssh) #:select (openssh))
+ #:use-module ((gnu packages textutils) #:select (dos2unix))
+ #:use-module ((gnu packages tls) #:select (openssl))
+ #:use-module ((gnu packages tmux) #:select (tmux))
+ #:use-module ((gnu packages version-control) #:select (diffstat git))
+ #:use-module ((gnu packages video) #:select (get-iplayer ffmpeg atomicparsley yt-dlp mediainfo))
+ #:use-module ((gnu packages vim) #:select (xxd))
+ #:use-module ((gnu packages web) #:select (jq))
#:use-module (gnu services configuration)
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module (guix records)
- #:use-module ((nongnu packages game-client)
- #:select (steam steam-nvidia))
- #:use-module ((nongnu packages messaging)
- #:select (zoom signal-desktop))
- #:use-module ((nongnu packages nvidia)
- #:select (nvda nvidia-system-monitor))
- #:use-module (tw gexp)
- #:use-module (tw packages alice)
- #:use-module (tw packages catppuccin)
- #:use-module (tw packages ci)
- #:use-module (tw packages games)
- #:use-module (tw packages mail)
- #:use-module (tw packages scanner)
- #:use-module (tw packages xorg)
#:use-module (tw services restic)
- #:use-module (tw system)
- #:use-module (tw theme))
+ #:use-module (tw system))
-(export tw-home-configuration)
-(define-configuration/no-serialization tw-home-configuration
- (x11-desktop? (boolean #t) "Install a full desktop and development
-environment. This is based on X11; a Wayland environment may be provided in
-future.")
- (gaming? (boolean #f) "Install games and other packages useful for gaming?")
- (nvidia-driver? (boolean #f) "Adapt the X11 desktop for the proprietary
-NVIDIA driver?")
- (pim? (boolean #t) "Install Personal Information Management (PIM) software
-like a calendar and mail reader?"))
+(define (basic-packages config)
+ ;; Basic packages to install everywhere, including servers.
+ (list curl diffstat dos2unix fdupes file git gnupg gnuplot graphviz hledger
+ imagemagick jq less lesspipe ncdu net-tools openssh openssl password-store
+ pass-otp pv python python-ipython recutils restic rsync sbcl smartmontools
+ source-highlight tmux tree xxd zip unzip
+ adb fastboot beets cmus get-iplayer ffmpeg atomicparsley yt-dlp
-(define (home-packages config)
- "Install packages I use frequently."
- (match-record config <tw-home-configuration> (x11-desktop? gaming? nvidia-driver? pim?)
- (append
- ;; Basic packages to install everywhere, including servers.
- (list curl diffstat dos2unix fdupes file git gnupg gnuplot graphviz hledger
- imagemagick jq less lesspipe ncdu net-tools openssh openssl password-store
- pass-otp pv python python-ipython recutils restic rsync sbcl smartmontools
- source-highlight tmux tree xxd zip unzip
- adb fastboot beets cmus get-iplayer ffmpeg atomicparsley yt-dlp
+ ;; Install only bind-utils like dig, not the full suite.
+ (list isc-bind "utils")
- ;; 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
- ;; 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-history-substring-search
+ zsh-syntax-highlighting zsh-completions))
- ;; Shell
- zsh zsh-autosuggestions zsh-history-substring-search
- zsh-syntax-highlighting zsh-completions)
-
- (cond
- ;; Games are installed in ~/.guix-profile instead, to make updates of the
- ;; home environment faster.
- ;; 0ad flightgear freeciv simutrans/pak128 warzone2100 widelands pioneer
- ((and gaming? (not nvidia-driver?))
- (list steam radeontop))
- ((and gaming? nvidia-driver?)
- ;; nvidia-system-monitor: Qt; installs "qnvsm" binary, but no .desktop file
- (list steam-nvidia nvidia-system-monitor))
- (else '()))
-
- (if x11-desktop?
- (list
- ;; CLI tools
- bsd-games powertop (list git "send-email") pdsh qrencode
- texlive-scheme-small texlive-latexmk
- ;; For CV:
- texlive-moderncv texlive-fontawesome5 texlive-multirow texlive-arydshln
- texlive-libertine texlive-inconsolata texlive-newtx texlive-babel
- texlive-csquotes texlive-siunitx
- ;; For org-mode export:
- texlive-minted texlive-svg texlive-hyperref texlive-capt-of texlive-ulem
- texlive-trimspaces texlive-transparent texlive-graphics texlive-tools
- texlive-wrapfig texlive-amsmath texlive-amsfonts texlive-libertine
- texlive-newtx texlive-txfonts texlive-inconsolata
-
- ;; Work
- s3cmd python-alibuild python-alidistlint actionlint modules
- python-tox python-setuptools-scm python-mypy
- hashicorp-levant-bin hashicorp-nomad-bin
- hashicorp-consul-bin hashicorp-vault-bin hashicorp-packer-bin
- ansible vinagre
-
- ;; 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 dunst gimp hsetroot inkscape icecat imv kitty libreoffice
- mpv polybar pulsemixer rofi rofi-calc simple-scan/airscan
- transmission-remote-gtk tk xdg-utils xdot xclip xcwd xdotool
- xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xrdb xsel xset xwininfo
- xfce4-screenshooter zoom zathura zathura-ps zathura-pdf-poppler
- ungoogled-chromium ; needed e.g. for Interrail site & DRM video
- dconf dconf-editor ; required for config by blueman, cozy, ...
- ;; gnome-keyring ; installed system-wide; see system-configuration.scm
- ;; geoclue ; for redshift -- installed system-wide
- ;; Fonts
- font-hermit font-inconsolata font-fira-code font-fira-sans font-libertinus
- ;; Base Noto doesn't include CJK, so install those separately.
- font-google-noto font-google-noto-sans-cjk font-google-noto-serif-cjk
- font-google-noto-emoji font-openmoji ; for polybar
- ;; Theming
- papirus-icon-theme catppuccin-gtk-theme catppuccin-mocha-dark-cursors
- ;; Games (larger games installed in ~/.guix-profile to avoid frequent huge downloads).
- szio-solitaire
-
- ;; Development & language servers
- gnu-make python-lsp-server python-yamllint shellcheck gcc binutils patchelf elfutils
- clang ; for clangd
- glibc ; for ldd
- ;; 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/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 ; for Wayland, switch to emacs-pgtk for better fractional scaling support
- emacs-use-package
- emacs-gcmh
- 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-undo-tree
- emacs-aggressive-indent
- emacs-which-key
- emacs-smart-mode-line
- emacs-diminish
- emacs-rainbow-mode
- emacs-form-feed
- 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-cleverparens
- emacs-evil-org
- emacs-evil-markdown
- emacs-evil-tex
- emacs-evil-text-object-python
-
- ;; Emacs language modes
- emacs-flymake-collection
- emacs-geiser emacs-geiser-guile
- emacs-sly
- emacs-gnuplot
- emacs-graphviz-dot-mode
- emacs-haskell-mode
- emacs-hcl-mode
- emacs-ledger-mode
- emacs-mmm-mode
- emacs-puppet-mode
- emacs-rec-mode
- emacs-web-mode
- emacs-yaml-mode
-
- ;; Tree sitter libraries, for Emacs' built-in X-ts-modes.
- tree-sitter-bash
- tree-sitter-c
- tree-sitter-cmake
- tree-sitter-cpp
- tree-sitter-css
- tree-sitter-dockerfile
- tree-sitter-javascript
- tree-sitter-json
- tree-sitter-python
- tree-sitter-ruby)
-
- ;; In non-graphical environments, install vim as an editor. Neovim
- ;; might be better, but doesn't have an equivalent to `vim-surround'
- ;; packaged.
- (list vim vim-surround))
+(define (xdg-configs config)
+ "Configuration files for terminal programs."
+ `(("htop/htoprc" ,(local-file "home/files/htoprc"))
+ ("lesskey" ,(local-file "home/files/lesskey"))
+ ("ranger/rc.conf" ,(local-file "home/files/ranger.conf"))
+ ("tmux/tmux.conf" ,(local-file "home/files/tmux.conf"))
+ ("user-dirs.locale" ,(plain-file "user-dirs.locale" "C")) ; Not sure if this is needed. Arch has it.
+ ("user-dirs.dirs" ,(local-file "home/files/user-dirs.dirs"))))
- (if pim?
- (list nheko signal-desktop
- newsboat vdirsyncer khal khard aerc lynx mutt_oauth2.py) ; lynx for HTML mail
- '()))))
+(define (non-xdg-configs config)
+ "Configuration files for terminal programs that do not follow the XDG base dir spec."
+ `((".infokey" ,(local-file "home/files/infokey"))
+ (".local/bin/python" ,(file-append python "/bin/python3"))
+ ;; With #:recursive? #t, Guix keeps the files' permission bits, i.e. makes them executable.
+ (".local/bin/ppscm" ,(local-file "home/files/ppscm" #:recursive? #t)))) ; pretty-print scheme files
(define (zshrc config)
"Extend the home ZSH service to install my custom zshrc."
@@ -297,345 +90,88 @@ like a calendar and mail reader?"))
(zshrc (list (local-file "home/files/zshrc")
(local-file "home/files/prompt.zsh")))))
-(define xfce4-screenshooter.conf
- (mixed-text-file "xfce4-screenshooter.conf" "\
-app=" imv "/bin/imv
-custom_action_command=none
-last_user=
-last_extension=png
-screenshot_dir=file:/home/timo/pictures
-enable_imgur_upload=false
-show_in_folder=false
-action=1
-delay=0
-region=3
-show_mouse=0
-show_border=1
-"))
-
-(define (xdg-configs config)
- "Configuration files that follow the XDG basedir spec."
- (match-record config <tw-home-configuration> (x11-desktop? pim?)
- `(;; Basic configuration files.
- ("htop/htoprc" ,(local-file "home/files/htoprc"))
- ("lesskey" ,(local-file "home/files/lesskey"))
- ("ranger/rc.conf" ,(local-file "home/files/ranger.conf"))
- ("tmux/tmux.conf" ,(local-file "home/files/tmux.conf"))
- ("user-dirs.locale" ,(plain-file "user-dirs.locale" "C")) ; Not sure if this is needed. Arch has it.
- ("user-dirs.dirs" ,(local-file "home/files/user-dirs.dirs"))
-
- ,@(if x11-desktop?
- `(;; Configuration files for terminal-only programs in $XDG_CONFIG_HOME.
- ("alibuild/disable-analytics" ; All alibuild needs is an empty file.
- ,(plain-file "alibuild-disable-analytics" ""))
- ;; Emacs is only used in graphical sessions.
- ("emacs/include" ,(local-file "home/files/emacs-packages" #:recursive? #t))
- ("emacs/init.el" ,(local-file "home/files/emacs-init.el"))
- ("emacs/catppuccin-theme.el" ,catppuccin-emacs)
- ;; X11 environment configuration.
- ("X11/XCompose" ,(local-file "home/files/XCompose")) ; see also: $XCOMPOSEFILE variable
- ("X11/Xresources" ,(local-file "home/files/Xresources"))
- ;; Configuration files for GUI programs in $XDG_CONFIG_HOME. Some
- ;; of these may also work under Wayland, but some are X11-specific.
- ("dunst/dunstrc" ,(local-file "home/files/dunstrc"))
- ("dunst/dunstrc.d/50-catppuccin.conf" ,catppuccin-dunstrc)
- ("gtk-2.0/gtkrc" ,(local-file "home/files/gtk2.ini"))
- ("gtk-3.0/settings.ini" ,(local-file "home/files/gtk3.ini"))
- ("i3/config" ,(local-file "home/files/i3.conf"))
- ;; TODO: "kdeglobals" works for some programs (e.g. kdeconnect-app),
- ;; but not for others (e.g. nheko, kdeconnect-settings)...
- ("kdeglobals" ,catppuccin-kdeglobals)
- ("kitty/diff.conf"
- ,(combined-text-file "kitty-diff.conf"
- (plain-file "kitty-diff-custom.conf"
- "pygments_style bw\n")
- catppuccin-kitty-diff))
- ("kitty/kitty.conf"
- ,(combined-text-file "kitty.conf"
- (local-file "home/files/kitty.conf")
- catppuccin-kitty))
- ("mimeapps.list" ,(local-file "home/files/mimeapps.list"))
- ("rofi/config.rasi" ,(local-file "home/files/rofi.rasi"))
- ("rofi/themes/catppuccin.rasi" ,catppuccin-rofi)
- ("xfce4/xfce4-screenshooter" ,xfce4-screenshooter.conf)
- ("zathura/zathurarc" ,(local-file "home/files/zathurarc"))
- ("zathura/catppuccin" ,catppuccin-zathura))
- '())
-
- ,@(if pim?
- `(("khal/config" ,(local-file "home/files/khal.conf"))
- ("khard/khard.conf" ,(local-file "home/files/khard.conf"))
- ("aerc/accounts.conf" ,(local-file "home/files/aerc/accounts.conf"))
- ("aerc/aerc.conf" ,(local-file "home/files/aerc/aerc.conf"))
- ("aerc/binds.conf" ,(local-file "home/files/aerc/binds.conf"))
- ("aerc/filters" ,(local-file "home/files/aerc/filters" #:recursive? #t))
- ("aerc/stylesets/catppuccin" ,catppuccin-aerc)
- ("newsboat/config" ,(local-file "home/files/newsboat.conf"))
- ("newsboat/config.catppuccin" ,catppuccin-newsboat)
- ("vdirsyncer/config" ,(local-file "home/files/vdirsyncer.conf")))
- '()))))
-
-(define (non-xdg-configs config)
- "Extra configuration files and binaries that don't follow the XDG spec."
- (match-record config <tw-home-configuration> (x11-desktop?)
- `((".infokey" ,(local-file "home/files/infokey"))
- (".local/bin/python" ,(file-append python "/bin/python3"))
- ;; With #:recursive? #t, Guix keeps the files' permission bits, i.e. makes them executable.
- (".local/bin/ppscm" ,(local-file "home/files/ppscm" #:recursive? #t)) ; pretty-print scheme files
-
- ,@(if x11-desktop?
- `((".icons/default/index.theme" ,(local-file "home/files/cursors.ini"))
- ;; https://sw.kovidgoyal.net/kitty/kittens/diff/
- (".local/bin/kdiff" ; show a diff
- ,(program-file "kdiff"
- #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
- "+kitten" "diff" (cdr (command-line)))))
- (".local/bin/icat" ; kitty's "catimg" equivalent
- ,(program-file "icat"
- #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
- "+kitten" "icat" (cdr (command-line)))))
- (".local/bin/screenlock"
- ,(program-file "screenlock"
- #~(begin ; Wrapper around i3lock to turn off the screen and pause notifications.
- (system* #$(file-append dunst "/bin/dunstctl") "set-paused" "true")
- (system* #$(file-append xset "/bin/xset") "dpms" "0" "0" "5")
- ;; 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" "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 "home/files/sessionmenu" #:recursive? #t))
- (".local/bin/passmenu" ,(local-file "home/files/passmenu" #:recursive? #t))
- (".local/bin/volume" ,(local-file "home/files/volume" #:recursive? #t))
- (".local/bin/alienv.guix"
- ,(program-file "alienv.guix"
- #~(begin
- (setenv "TERM" "xterm-256color") ; "modules" gets confused if this is unset
- (apply execlp "guix" "guix" "shell" "--pure" "--container" "--emulate-fhs" "--preserve=^TERM$"
- "bash" "util-linux" "coreutils" ; basic shell utilities (also needed by alienv)
- "which" "sed" "grep" "findutils" "procps" "gawk" "modules" ; alienv requirements
- "openssl@3" ; some packages need openssl
- "xz" ; XRootD needs liblzma
- "python-alibuild" "--" "alienv" (cdr (command-line))))))
- (".local/share/applications/emacsclient.desktop"
- ,(local-file "home/files/emacsclient.desktop")))
-
- ;; In non-graphical environments, set up vim as my preferred editor.
- `((".vim/vimrc" ,(local-file "home/files/vimrc"))
- (".vim/catppuccin.vim" ,catppuccin-vim))))))
-
(define (environment-variables config)
"Configure my shell environment."
- (match-record config <tw-home-configuration> (x11-desktop?)
- `(;; Work at ALICE: Nomad, Consul, Vault.
- ;; Tokens are not defined here as they are stored in pass(1).
- ;; Shell aliases to use tokens are defined in zshrc.
- ("NOMAD_ADDR" . "https://alinomad.cern.ch:443")
- ("NOMAD_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
- ("NOMAD_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
- ("NOMAD_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
- ("CONSUL_HTTP_ADDR" . "https://aliconsul.cern.ch:443")
- ("CONSUL_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
- ("CONSUL_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
- ("CONSUL_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
- ("VAULT_ADDR" . "https://alivault.cern.ch:443")
- ("VAULT_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
- ("VAULT_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
- ("VAULT_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
-
- ;; Common environment everywhere.
- ;; 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")
- ("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")
-
- ;; 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.
- ("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")
- ("ELECTRUMDIR" . "$XDG_DATA_HOME/electrum")
- ("FG_HOME" . "$XDG_DATA_HOME/fgfs")
- ("GETIPLAYERUSERPREFS" . "$XDG_DATA_HOME/get_iplayer")
- ("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")
- ("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" .
- ;; Merge _JAVA_OPTIONS declarations since Guix warns if a variable is
- ;; defined twice (even if the definitions would complement each other).
- ,(string-append
- "$_JAVA_OPTIONS${_JAVA_OPTIONS:+ }-Djava.util.prefs.userRoot=$XDG_CONFIG_HOME/java"
- (if x11-desktop?
- (string-append
- "-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true "
- "-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel "
- "-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel")
- "")))
-
- ,@(if x11-desktop?
- `(("TERMINAL" . "kitty")
- ("QT_X11_NO_MITSHM" . "1") ; fixes a Steam issue: https://gitlab.com/nonguix/nonguix/-/issues/267
- ("GUIX_SANDBOX_EXTRA_SHARES" . ; mount savegame locations inside Steam container
- ,(string-join
- '("$HOME/savegames/banished=$HOME/.local/share/Steam/steamapps/compatdata/242920/pfx/drive_c/users/steamuser/Documents/Banished/Save"
- "$HOME/savegames/planetbase=$HOME/.local/share/Steam/steamapps/compatdata/403190/pfx/drive_c/users/steamuser/Documents/Planetbase"
- "$HOME/savegames/cities-skylines=$HOME/.local/share/Colossal Order/Cities_Skylines/Saves"
- "$HOME/savegames/surviving-mars=$HOME/.local/share/Surviving Mars/76561198130982912"
- "$HOME/savegames/colony-survival=$HOME/.local/share/Steam/steamapps/common/Colony Survival/gamedata/savegames"
- "$HOME/savegames/portal=$HOME/.local/share/Steam/steamapps/common/Portal/portal/save"
- "$HOME/savegames/spacechem=$HOME/.local/share/Zachtronics Industries/SpaceChem/save"
- "$HOME/savegames/tis-100=$HOME/.local/share/TIS-100/76561198130982912")
- ":"))
- ;; Smooth trackpad scrolling in Firefox/Icecat.
- ;; https://wiki.archlinux.org/index.php/Firefox/Tweaks#Pixel-perfect_trackpad_scrolling
- ("MOZ_USE_XINPUT2" . "1")
-
- ;; Set Emacs up as my preferred editor.
- ("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"))
-
- ;; In non-graphical environments, set up vim as my preferred editor.
- '(("EDITOR" . "vim")))))) ; we define no ASYNC_EDITOR
-
-(define (shepherd-services config)
- "Run various daemons in my user profile."
- (match-record config <tw-home-configuration> (x11-desktop? nvidia-driver?)
- (if x11-desktop?
- (list
- (shepherd-service
- (documentation "Emacs server; connect using emacsclient.")
- (provision '(emacs))
- (requirement '(x11-display))
- (start #~(make-forkexec-constructor
- (list #$(file-append emacs "/bin/emacs") "--fg-daemon")))
- (stop #~(make-kill-destructor)))
-
- (shepherd-service
- (documentation "NetworkManager applet; provides a GUI for network connections.")
- (provision '(nm-applet))
- (requirement '(x11-display))
- (start #~(make-forkexec-constructor
- (list #$(file-append network-manager-applet "/bin/nm-applet"))))
- (stop #~(make-kill-destructor)))
-
- (shepherd-service
- (documentation "Dunst notification daemon; displays desktop notifications.")
- (provision '(dunst))
- (requirement '(x11-display))
- (start #~(make-forkexec-constructor
- (list #$(file-append dunst "/bin/dunst"))))
- (stop #~(make-kill-destructor)))
-
- ;; Picom needs to use the proprietary nvidia driver's libgl if that
- ;; driver is used for Xorg; plain Mesa won't work then.
- (let ((grafter
- (if nvidia-driver?
- (package-input-rewriting
- `((,mesa . ,(package (inherit mesa) (replacement nvda)))))
- identity)))
- (shepherd-service
- (documentation "Picom compositor; enables transparent windows in X.")
- (provision '(picom))
- (requirement '(x11-display))
- (start #~(make-forkexec-constructor
- (list #$(file-append (grafter picom) "/bin/picom")
- "--config" #$(local-file "home/files/picom.conf"))))
- (stop #~(make-kill-destructor))))
-
- (shepherd-service
- (documentation "Source Xresources on login.")
- (provision '(xrdb))
- (requirement '(x11-display))
- (one-shot? #t)
- (start #~(lambda _
- (invoke #$(file-append xrdb "/bin/xrdb") "-merge"
- (string-append (getenv "XDG_CONFIG_HOME") "/X11/Xresources")))))
-
- ;; By default, xdotool gets most of "#@\|~()<>[]{} wrong. Make
- ;; it use the correct keymap by re-setting the same one again.
- (shepherd-service
- (documentation "Fix X keyboard map on login; passmenu needs this.")
- (provision '(fix-xdotool))
- (requirement '(x11-display))
- (one-shot? #t)
- (start #~(lambda _
- (use-modules (ice-9 rdelim)
- (ice-9 regex)
- (ice-9 popen))
- (let ((port (open-pipe* OPEN_READ #$(file-append setxkbmap "/bin/setxkbmap")
- "-query")))
- (let loop ((line (read-line port)))
- (unless (eof-object? line)
- (let ((mtch (string-match "^layout:[[:space:]]*" line)))
- (if mtch
- (system* #$(file-append setxkbmap "/bin/setxkbmap")
- (match:suffix mtch))
- (loop (read-line port)))))))))))
-
- '())))
-
-(define (cron-jobs config)
- "Periodic jobs to keep my home directory in sync."
- (match-record config <tw-home-configuration> (pim?)
- (if pim?
- ;; To avoid popping up a password prompt every time these run,
- ;; gpg-agent needs a long-enough default-cache-ttl.
- (list #~(job "15 */4 * * *" ; every four 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")))
- '())))
+ `( ;; Work at ALICE: Nomad, Consul, Vault.
+ ;; Tokens are not defined here as they are stored in pass(1).
+ ;; Shell aliases to use tokens are defined in zshrc.
+ ("NOMAD_ADDR" . "https://alinomad.cern.ch:443")
+ ("NOMAD_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
+ ("NOMAD_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
+ ("NOMAD_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
+ ("CONSUL_HTTP_ADDR" . "https://aliconsul.cern.ch:443")
+ ("CONSUL_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
+ ("CONSUL_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
+ ("CONSUL_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
+ ("VAULT_ADDR" . "https://alivault.cern.ch:443")
+ ("VAULT_CACERT" . "${XDG_CONFIG_HOME}/cern-ca-bundle.crt")
+ ("VAULT_CLIENT_CERT" . "${XDG_CONFIG_HOME}/grid-personal-cert.pem")
+ ("VAULT_CLIENT_KEY" . "${XDG_CONFIG_HOME}/grid-personal-key.pem")
+
+ ;; Common environment everywhere.
+ ;; 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")
+ ("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")
+
+ ;; 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.
+ ("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")
+ ("ELECTRUMDIR" . "$XDG_DATA_HOME/electrum")
+ ("FG_HOME" . "$XDG_DATA_HOME/fgfs")
+ ("GETIPLAYERUSERPREFS" . "$XDG_DATA_HOME/get_iplayer")
+ ("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")
+ ("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")))
(define-public tw-home-service-type
(service-type
(name 'tw-home)
(description "Set up a basic, uniform home environment for my machines.")
- (default-value (tw-home-configuration))
+ (default-value #f)
(extensions
- (list (service-extension home-profile-service-type home-packages)
+ (list (service-extension home-profile-service-type basic-packages)
(service-extension home-zsh-service-type zshrc)
(service-extension home-xdg-configuration-files-service-type xdg-configs)
(service-extension home-files-service-type non-xdg-configs)
- (service-extension home-environment-variables-service-type environment-variables)
- (service-extension home-mcron-service-type cron-jobs)
- (service-extension home-shepherd-service-type shepherd-services)))))
+ (service-extension home-environment-variables-service-type environment-variables)))))
;;; Restic backup helpers
diff --git a/tw/home/btl.scm b/tw/home/btl.scm
index bc08ff82..f4ed9d90 100644
--- a/tw/home/btl.scm
+++ b/tw/home/btl.scm
@@ -17,6 +17,7 @@
#:use-module (guix gexp)
#:use-module (tw home)
#:use-module (tw services desktop)
+ #:use-module (tw services dev-env)
#:use-module (tw services git)
#:use-module (tw services gnupg)
#:use-module (tw services restic))
@@ -31,10 +32,6 @@
;; To search for available home services, run 'guix home search KEYWORD'.
(services
(list
- (service tw-home-service-type
- (tw-home-configuration
- (gaming? #t)))
-
;; Redshift: make the screen turn redder at night.
(service home-redshift-service-type
(home-redshift-configuration
@@ -49,16 +46,22 @@
(service home-dbus-service-type)
- (service home-blueman-service-type)
+ (service tw-home-service-type)
- (service home-desktop-layout-service-type
- (home-desktop-layout-configuration
+ (service home-desktop-service-type
+ (home-desktop-configuration
+ (gaming? #t)
+ (bluetooth? #t)
(desktop-background "~/blobs-d.png")
(monitors
(list (home-monitor-configuration
(name "DisplayPort-2")
(xrandr-options '("--mode" "2560x1440" "--rate" "143.86")))))))
+ (service home-full-dev-env-service-type)
+
+ (service home-pim-service-type)
+
;; On my private machine, I want to use my private PGP key normally, and
;; my work key only for work repositories.
(service home-git-service-type
diff --git a/tw/home/cern.scm b/tw/home/cern.scm
index 957353d9..b7e04ef5 100644
--- a/tw/home/cern.scm
+++ b/tw/home/cern.scm
@@ -22,31 +22,15 @@
#:use-module (tw gexp)
#:use-module ((tw packages mail) #:select (mutt_oauth2.py))
#:use-module (tw services desktop)
+ #:use-module (tw services dev-env)
#:use-module (tw services git)
#:use-module (tw services gnupg))
(define-public %cern-home
(home-environment
- (packages
- ;; These packages will show up in the home profile, under ~/.guix-home/profile.
- (list vdirsyncer khal khard aerc lynx mutt_oauth2.py)) ; lynx for HTML mail
-
;; To search for available home services, run 'guix home search KEYWORD'.
(services
(list
- (service tw-home-service-type
- (tw-home-configuration
- (pim? #f)))
-
- ;; Configure PIM services "manually" because we don't want all of them
- ;; (such as the newsreader) and we need to use different aerc accounts.
- (simple-service 'pim-config home-xdg-configuration-files-service-type
- `(("aerc/accounts.conf" ,(local-file "files/aerc/accounts.work.conf"))
- ("aerc/aerc.conf" ,(local-file "files/aerc/aerc.conf"))
- ("aerc/binds.conf" ,(local-file "files/aerc/binds.conf"))
- ("aerc/filters" ,(local-file "files/aerc/filters" #:recursive? #t))
- ("aerc/stylesets" ,(local-file "files/aerc/stylesets" #:recursive? #t))))
-
(simple-service 'remote-desktop-config home-files-service-type
`((".local/share/vinagre/vinagre-bookmarks.xml" ,(local-file "files/vinagre-bookmarks.xml"))))
@@ -64,8 +48,10 @@
(service home-dbus-service-type)
- (service home-desktop-layout-service-type
- (home-desktop-layout-configuration
+ (service tw-home-service-type)
+
+ (service home-desktop-service-type
+ (home-desktop-configuration
(desktop-background "~/.config/X11/ridge-view.jpg")
(monitors
(list (home-monitor-configuration
@@ -77,6 +63,11 @@
(xrandr-options '("--mode" "1920x1080" "--rate" "60.00"
"--left-of" "DP-2")))))))
+ (service home-full-dev-env-service-type)
+
+ (service home-pim-service-type
+ (home-pim-configuration (work? #t)))
+
;; On my work machine, Git must always use my work PGP key.
(service home-git-service-type
(home-git-configuration
diff --git a/tw/home/frm.scm b/tw/home/frm.scm
index 3d720a2f..bf263679 100644
--- a/tw/home/frm.scm
+++ b/tw/home/frm.scm
@@ -17,6 +17,7 @@
#:use-module (guix gexp)
#:use-module (tw home)
#:use-module (tw services desktop)
+ #:use-module (tw services dev-env)
#:use-module (tw services git)
#:use-module (tw services gnupg)
#:use-module (tw services restic))
@@ -31,8 +32,6 @@
;; To search for available home services, run 'guix home search KEYWORD'.
(services
(list
- (service tw-home-service-type)
-
;; Batsignal: battery level notifications.
(service home-batsignal-service-type
(home-batsignal-configuration
@@ -52,10 +51,11 @@
(service home-dbus-service-type)
- (service home-blueman-service-type)
+ (service tw-home-service-type)
- (service home-desktop-layout-service-type
- (home-desktop-layout-configuration
+ (service home-desktop-service-type
+ (home-desktop-configuration
+ (bluetooth? #t)
(desktop-background "~/blobs-d.png")
(battery-name "BAT1")
(ac-adapter-name "ACAD")
@@ -64,6 +64,10 @@
(name "eDP")
(xrandr-options '("--auto")))))))
+ (service home-full-dev-env-service-type)
+
+ (service home-pim-service-type)
+
;; On my private machine, I want to use my private PGP key normally, and
;; my work key only for work repositories.
(service home-git-service-type
diff --git a/tw/home/lap.scm b/tw/home/lap.scm
index 958a5647..959691aa 100644
--- a/tw/home/lap.scm
+++ b/tw/home/lap.scm
@@ -17,6 +17,7 @@
#:use-module (guix gexp)
#:use-module (tw home)
#:use-module (tw services desktop)
+ #:use-module (tw services dev-env)
#:use-module (tw services git)
#:use-module (tw services gnupg)
#:use-module (tw services restic))
@@ -31,11 +32,6 @@
;; To search for available home services, run 'guix home search KEYWORD'.
(services
(list
- (service tw-home-service-type
- (tw-home-configuration
- (gaming? #t)
- (nvidia-driver? #t)))
-
;; Batsignal: battery level notifications.
(service home-batsignal-service-type
(home-batsignal-configuration
@@ -97,10 +93,13 @@
(service home-dbus-service-type)
- (service home-blueman-service-type)
+ (service tw-home-service-type)
- (service home-desktop-layout-service-type
- (home-desktop-layout-configuration
+ (service home-desktop-service-type
+ (home-desktop-configuration
+ (gaming? #t)
+ (nvidia-driver? #t)
+ (bluetooth? #t)
(desktop-background "~/pictures/Backgrounds/greece/IMG_20181201_104748_DRO.jpg")
(battery-name "BAT0")
(ac-adapter-name "AC")
@@ -109,6 +108,8 @@
(name "eDP-1-1")
(xrandr-options '("--auto")))))))
+ (service home-full-dev-env-service-type)
+
;; On my private machine, I want to use my private PGP key normally, and
;; my work key only for work repositories.
(service home-git-service-type
diff --git a/tw/home/server.scm b/tw/home/server.scm
index 4ae168dd..b73ac4aa 100644
--- a/tw/home/server.scm
+++ b/tw/home/server.scm
@@ -1,13 +1,12 @@
(define-module (tw home server)
#:use-module (gnu home)
#:use-module (gnu services)
- #:use-module (tw home))
+ #:use-module (tw home)
+ #:use-module (tw services dev-env))
(define-public %server-home
(home-environment
- (services (list (service tw-home-service-type
- (tw-home-configuration
- (x11-desktop? #f)
- (pim? #f)))))))
+ (services (list (service tw-home-service-type)
+ (service home-basic-dev-env-service-type)))))
%server-home
diff --git a/tw/services/desktop.scm b/tw/services/desktop.scm
index 8de8231d..af728056 100644
--- a/tw/services/desktop.scm
+++ b/tw/services/desktop.scm
@@ -1,25 +1,80 @@
(define-module (tw services desktop)
#:use-module (gnu)
#:use-module (gnu home services)
+ #:use-module (gnu home services mail)
+ #:use-module (gnu home services mcron)
#:use-module (gnu home services shepherd)
+ #:use-module ((gnu packages admin) #:select (ansible))
+ #:use-module ((gnu packages aidc) #:select (qrencode))
+ #:use-module ((gnu packages bittorrent) #:select (transmission-remote-gtk))
+ #:use-module ((gnu packages calendar) #:select (khal))
+ #:use-module ((gnu packages check) #:select (actionlint))
+ #:use-module ((gnu packages chromium) #:select (ungoogled-chromium))
+ #:use-module ((gnu packages compton) #:select (picom))
+ #:use-module ((gnu packages dav) #:select (vdirsyncer))
+ #:use-module ((gnu packages fonts) #:select (font-fira-code font-fira-sans font-google-noto font-google-noto-emoji font-google-noto-sans-cjk font-google-noto-serif-cjk font-hermit font-inconsolata font-libertinus font-openmoji))
+ #:use-module ((gnu packages freedesktop) #:select (xdg-utils))
+ #:use-module ((gnu packages games) #:select (bsd-games))
+ #:use-module ((gnu packages gimp) #:select (gimp))
+ #:use-module ((gnu packages gl) #:select (mesa))
+ #:use-module ((gnu packages gnome) #:select (dconf dconf-editor network-manager-applet vinagre))
+ #:use-module ((gnu packages gnome-xyz) #:select (papirus-icon-theme))
+ #:use-module ((gnu packages gnuzilla) #:select (icecat))
+ #:use-module ((gnu packages graphviz) #:select (xdot))
+ #:use-module ((gnu packages image-viewers) #:select (imv))
+ #:use-module ((gnu packages inkscape) #:select (inkscape))
+ #:use-module ((gnu packages libreoffice) #:select (libreoffice))
+ #:use-module ((gnu packages linux) #:select (acpilight powertop radeontop))
+ #:use-module ((gnu packages mail) #:select (aerc khard))
+ #:use-module ((gnu packages messaging) #:select (nheko))
#:use-module ((gnu packages networking) #:select (blueman))
- #:use-module ((gnu packages wm) #:select (polybar))
- #:use-module ((gnu packages xdisorg) #:select (numlockx hsetroot))
- #:use-module ((gnu packages xorg) #:select (xrandr xset))
+ #:use-module ((gnu packages package-management) #:select (modules))
+ #:use-module ((gnu packages pdf) #:select (zathura zathura-pdf-poppler zathura-ps))
+ #:use-module ((gnu packages pulseaudio) #:select (pulsemixer))
+ #:use-module ((gnu packages python-build) #:select (python-setuptools-scm))
+ #:use-module ((gnu packages python-check) #:select (python-mypy python-tox))
+ #:use-module ((gnu packages python-xyz) #:select (s3cmd))
+ #:use-module ((gnu packages ssh) #:select (pdsh))
+ #:use-module ((gnu packages syndication) #:select (newsboat))
+ #:use-module ((gnu packages tcl) #:select (tk))
+ #:use-module ((gnu packages terminals) #:select (kitty))
+ #:use-module ((gnu packages tex) #:select (texlive-scheme-small texlive-latexmk texlive-moderncv texlive-fontawesome5 texlive-multirow texlive-arydshln texlive-libertine texlive-inconsolata texlive-newtx texlive-babel texlive-csquotes texlive-siunitx texlive-minted texlive-svg texlive-hyperref texlive-capt-of texlive-ulem texlive-trimspaces texlive-transparent texlive-graphics texlive-tools texlive-wrapfig texlive-amsmath texlive-amsfonts texlive-txfonts))
+ #:use-module ((gnu packages version-control) #:select (git))
+ #:use-module ((gnu packages video) #:select (mpv))
+ #:use-module ((gnu packages web-browsers) #:select (lynx))
+ #:use-module ((gnu packages wm) #:select (dunst polybar))
+ #:use-module ((gnu packages xdisorg) #:select (arandr numlockx hsetroot rofi rofi-calc xclip xdotool xsel))
+ #:use-module ((gnu packages xfce) #:select (xfce4-screenshooter))
+ #:use-module ((gnu packages xorg) #:select (xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xset xrdb xwininfo setxkbmap))
+ #:use-module ((nongnu packages nvidia) #:select (nvda))
+ #:use-module ((nongnu packages messaging) #:select (zoom))
+ #:use-module ((nongnu packages nvidia) #:select (nvidia-system-monitor))
#:use-module (gnu services configuration)
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module ((guix records) #:select (match-record))
+ #:use-module ((nongnu packages game-client) #:select (steam steam-nvidia))
+ #:use-module ((nongnu packages messaging) #:select (zoom signal-desktop))
+ #:use-module ((nongnu packages nvidia) #:select (nvda nvidia-system-monitor))
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
- #:use-module ((tw theme) #:select (catppuccin-polybar))
- #:export (home-desktop-layout-configuration
+ #:use-module (tw gexp)
+ #:use-module ((tw packages alice) #:select (python-alibuild python-alidistlint))
+ #:use-module (tw packages catppuccin)
+ #:use-module ((tw packages ci) #:select (hashicorp-consul-bin hashicorp-levant-bin hashicorp-nomad-bin hashicorp-packer-bin hashicorp-vault-bin))
+ #:use-module ((tw packages games) #:select (szio-solitaire))
+ #:use-module ((tw packages mail) #:select (mutt_oauth2.py))
+ #:use-module ((tw packages scanner) #:select (simple-scan/airscan))
+ #:use-module ((tw packages xorg) #:select (xcwd))
+ #:use-module (tw theme)
+ #:export (home-desktop-configuration
home-monitor-configuration
- home-desktop-layout-service-type
- home-blueman-service-type))
+ home-desktop-service-type
+ home-pim-configuration
+ home-pim-service-type))
-;; Monitor layout and polybars
+;; Desktop services, including monitor layout
(define-maybe/no-serialization string)
@@ -34,19 +89,20 @@ configure this monitor."))
(define (list-of-monitors? thing)
(and (list? thing) (every home-monitor-configuration? thing)))
-(define-configuration/no-serialization home-desktop-layout-configuration
+(define-configuration/no-serialization home-desktop-configuration
+ (gaming? (boolean #f) "Install games and other packages useful for gaming?")
+ (nvidia-driver? (boolean #f) "Adapt the X11 desktop for the proprietary
+NVIDIA driver?")
(desktop-background string "Path to an image that will be set as the desktop
background. An initial @code{~/} is replaced with $HOME/.")
+ (bluetooth? (boolean #f) "Whether the device has Bluetooth hardware. If
+true, configure the user interface to use it.")
(battery-name maybe-string "The device name of the system's battery, if any.
See @code{/sys/class/power_supply}.")
(ac-adapter-name maybe-string "The device name of the system's mains power
supply, if any. See @code{/sys/class/power_supply}.")
(monitors list-of-monitors "List of monitor declarations to apply."))
-(define (polybar-config monitors)
- `(("polybar/config.ini" ,(local-file "files/polybar.ini"))
- ("polybar/catppuccin.ini" ,catppuccin-polybar)))
-
(define polybar-wrapper
(program-file "polybar-wrapper"
#~(begin
@@ -66,9 +122,6 @@ supply, if any. See @code{/sys/class/power_supply}.")
(when monitor-connected?
(execl #$(file-append polybar "/bin/polybar")))))))
-(define (maybe-value maybe fallback)
- (if (maybe-value-set? maybe) maybe fallback))
-
(define (polybar-service monitor battery-name ac-adapter-name)
(shepherd-service
(documentation (string-append "Polybar desktop bar for monitor " monitor "."))
@@ -83,62 +136,324 @@ supply, if any. See @code{/sys/class/power_supply}.")
(default-environment-variables))))
(stop #~(make-kill-destructor))))
-(define (desktop-layout-services config)
- (match-record config <home-desktop-layout-configuration>
- (desktop-background battery-name ac-adapter-name monitors)
- (cons* (shepherd-service
- (documentation "Set up X displays on login.")
- (provision '(xorg-setup))
- (one-shot? #t)
- (start #~(lambda _
- (define (replace-home path)
- (if (string-prefix? "~/" path)
- (string-replace path (getenv "HOME") 0 1)
- path))
- (system* #$(file-append numlockx "/bin/numlockx") "on")
- ;; Turn off the monitors if there is no input for 10 minutes.
- (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
- ;; TODO: may need one xrandr invocation per monitor; this is
- ; ;what tw/home/cern.scm had before.
- (system* #$(file-append xrandr "/bin/xrandr")
- #$@(append-map (lambda (monitor)
- (match-record monitor <home-monitor-configuration>
- (name xrandr-options)
- `("--output" ,name ,@xrandr-options)))
- monitors))
- ;; Set the desktop background picture. Hopefully doing this just after
- ;; xrandr works and sets it for both screens.
- (system* #$(file-append hsetroot "/bin/hsetroot")
- "-cover" (replace-home #$desktop-background)))))
- (map (compose (cut polybar-service <> battery-name ac-adapter-name)
- home-monitor-configuration-name)
- monitors))))
-
-(define home-desktop-layout-service-type
+(define (home-packages config)
+ "Install packages I use frequently."
+ (cons*
+ ;; CLI tools
+ bsd-games powertop (list git "send-email") pdsh qrencode
+ texlive-scheme-small texlive-latexmk
+ ;; For CV:
+ texlive-moderncv texlive-fontawesome5 texlive-multirow texlive-arydshln
+ texlive-libertine texlive-inconsolata texlive-newtx texlive-babel
+ texlive-csquotes texlive-siunitx
+ ;; For org-mode export:
+ texlive-minted texlive-svg texlive-hyperref texlive-capt-of texlive-ulem
+ texlive-trimspaces texlive-transparent texlive-graphics texlive-tools
+ texlive-wrapfig texlive-amsmath texlive-amsfonts texlive-libertine
+ texlive-newtx texlive-txfonts texlive-inconsolata
+
+ ;; Work
+ s3cmd python-alibuild python-alidistlint actionlint modules
+ python-tox python-setuptools-scm python-mypy
+ hashicorp-levant-bin hashicorp-nomad-bin
+ hashicorp-consul-bin hashicorp-vault-bin hashicorp-packer-bin
+ ansible vinagre
+
+ ;; 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 dunst gimp hsetroot inkscape icecat imv kitty libreoffice
+ mpv polybar pulsemixer rofi rofi-calc simple-scan/airscan
+ transmission-remote-gtk tk xdg-utils xdot xclip xcwd xdotool
+ xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xrdb xsel xset xwininfo
+ xfce4-screenshooter zoom zathura zathura-ps zathura-pdf-poppler
+ ungoogled-chromium ; needed e.g. for Interrail site & DRM video
+ dconf dconf-editor ; required for config by blueman, cozy, ...
+ ;; gnome-keyring ; installed system-wide; see system-configuration.scm
+ ;; geoclue ; for redshift -- installed system-wide
+ ;; Fonts
+ font-hermit font-inconsolata font-fira-code font-fira-sans font-libertinus
+ ;; Base Noto doesn't include CJK, so install those separately.
+ font-google-noto font-google-noto-sans-cjk font-google-noto-serif-cjk
+ font-google-noto-emoji font-openmoji ; for polybar
+ ;; Theming
+ papirus-icon-theme catppuccin-gtk-theme catppuccin-mocha-dark-cursors
+ ;; Games (larger games installed in ~/.guix-profile to avoid frequent huge downloads).
+ szio-solitaire
+ ;; 0ad flightgear freeciv simutrans/pak128 warzone2100 widelands pioneer
+
+ (match-record config <home-desktop-configuration> (gaming? nvidia-driver?)
+ (if (not gaming?) '()
+ (if nvidia-driver?
+ ;; nvidia-system-monitor: Qt; installs "qnvsm" binary, but no .desktop file
+ (list steam-nvidia nvidia-system-monitor)
+ (list steam radeontop))))))
+
+(define xfce4-screenshooter.conf
+ (mixed-text-file "xfce4-screenshooter.conf" "\
+app=" imv "/bin/imv
+custom_action_command=none
+last_user=
+last_extension=png
+screenshot_dir=file:/home/timo/pictures
+enable_imgur_upload=false
+show_in_folder=false
+action=1
+delay=0
+region=3
+show_mouse=0
+show_border=1
+"))
+
+(define (home-xdg-configs config)
+ "Configuration files that follow the XDG basedir spec."
+ `(("alibuild/disable-analytics" ; All alibuild needs is an empty file.
+ ,(plain-file "alibuild-disable-analytics" ""))
+ ;; X11 environment configuration.
+ ("X11/XCompose" ,(local-file "files/XCompose")) ; see also: $XCOMPOSEFILE variable
+ ;; Configuration files for GUI programs in $XDG_CONFIG_HOME. Some
+ ;; of these may also work under Wayland, but some are X11-specific.
+ ("dunst/dunstrc" ,(local-file "files/dunstrc"))
+ ("dunst/dunstrc.d/50-catppuccin.conf" ,catppuccin-dunstrc)
+ ("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"))
+ ;; TODO: "kdeglobals" works for some programs (e.g. kdeconnect-app),
+ ;; but not for others (e.g. nheko, kdeconnect-settings)...
+ ("kdeglobals" ,catppuccin-kdeglobals)
+ ("kitty/diff.conf"
+ ,(combined-text-file "kitty-diff.conf"
+ (plain-file "kitty-diff-custom.conf"
+ "pygments_style bw\n")
+ catppuccin-kitty-diff))
+ ("kitty/kitty.conf"
+ ,(combined-text-file "kitty.conf"
+ (local-file "files/kitty.conf")
+ catppuccin-kitty))
+ ("mimeapps.list" ,(local-file "files/mimeapps.list"))
+ ("polybar/config.ini" ,(local-file "files/polybar.ini"))
+ ("polybar/catppuccin.ini" ,catppuccin-polybar)
+ ("rofi/config.rasi" ,(local-file "files/rofi.rasi"))
+ ("rofi/themes/catppuccin.rasi" ,catppuccin-rofi)
+ ("xfce4/xfce4-screenshooter" ,xfce4-screenshooter.conf)
+ ("zathura/zathurarc" ,(local-file "files/zathurarc"))
+ ("zathura/catppuccin" ,catppuccin-zathura)))
+
+(define (home-files config)
+ "Extra configuration files and binaries that don't follow the XDG spec."
+ `((".icons/default/index.theme" ,(local-file "files/cursors.ini"))
+ ;; https://sw.kovidgoyal.net/kitty/kittens/diff/
+ (".local/bin/kdiff" ; show a diff
+ ,(program-file "kdiff"
+ #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
+ "+kitten" "diff" (cdr (command-line)))))
+ (".local/bin/icat" ; kitty's "catimg" equivalent
+ ,(program-file "icat"
+ #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
+ "+kitten" "icat" (cdr (command-line)))))
+ (".local/bin/screenlock"
+ ,(program-file "screenlock"
+ #~(begin ; Wrapper around i3lock to turn off the screen and pause notifications.
+ (system* #$(file-append dunst "/bin/dunstctl") "set-paused" "true")
+ (system* #$(file-append xset "/bin/xset") "dpms" "0" "0" "5")
+ ;; 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" "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))
+ (".local/bin/passmenu" ,(local-file "files/passmenu" #:recursive? #t))
+ (".local/bin/volume" ,(local-file "files/volume" #:recursive? #t))
+ (".local/bin/alienv.guix"
+ ,(program-file "alienv.guix"
+ #~(begin
+ (setenv "TERM" "xterm-256color") ; "modules" gets confused if this is unset
+ (apply execlp "guix" "guix" "shell" "--pure" "--container" "--emulate-fhs" "--preserve=^TERM$"
+ "bash" "util-linux" "coreutils" ; basic shell utilities (also needed by alienv)
+ "which" "sed" "grep" "findutils" "procps" "gawk" "modules" ; alienv requirements
+ "openssl@3" ; some packages need openssl
+ "xz" ; XRootD needs liblzma
+ "python-alibuild" "--" "alienv" (cdr (command-line))))))))
+
+(define (home-environment config)
+ `(("TERMINAL" . "kitty")
+ ("QT_X11_NO_MITSHM" . "1") ; fixes a Steam issue: https://gitlab.com/nonguix/nonguix/-/issues/267
+ ("GUIX_SANDBOX_EXTRA_SHARES" . ; mount savegame locations inside Steam container
+ ,(string-join
+ '("$HOME/savegames/banished=$HOME/.local/share/Steam/steamapps/compatdata/242920/pfx/drive_c/users/steamuser/Documents/Banished/Save"
+ "$HOME/savegames/planetbase=$HOME/.local/share/Steam/steamapps/compatdata/403190/pfx/drive_c/users/steamuser/Documents/Planetbase"
+ "$HOME/savegames/cities-skylines=$HOME/.local/share/Colossal Order/Cities_Skylines/Saves"
+ "$HOME/savegames/surviving-mars=$HOME/.local/share/Surviving Mars/76561198130982912"
+ "$HOME/savegames/colony-survival=$HOME/.local/share/Steam/steamapps/common/Colony Survival/gamedata/savegames"
+ "$HOME/savegames/portal=$HOME/.local/share/Steam/steamapps/common/Portal/portal/save"
+ "$HOME/savegames/spacechem=$HOME/.local/share/Zachtronics Industries/SpaceChem/save"
+ "$HOME/savegames/tis-100=$HOME/.local/share/TIS-100/76561198130982912")
+ ":"))
+ ;; Smooth trackpad scrolling in Firefox/Icecat.
+ ;; https://wiki.archlinux.org/index.php/Firefox/Tweaks#Pixel-perfect_trackpad_scrolling
+ ("MOZ_USE_XINPUT2" . "1")
+ ("_JAVA_OPTIONS" .
+ ,(string-append
+ "$_JAVA_OPTIONS${_JAVA_OPTIONS:+ }"
+ "-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true "
+ "-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel "
+ "-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"))))
+
+(define (home-shepherd-services config)
+ "Run various daemons in my user profile."
+ (match-record config <home-desktop-configuration>
+ (nvidia-driver? bluetooth? desktop-background battery-name ac-adapter-name monitors)
+ `(,(shepherd-service
+ (documentation "NetworkManager applet; provides a GUI for network connections.")
+ (provision '(nm-applet))
+ (requirement '(x11-display))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append network-manager-applet "/bin/nm-applet"))))
+ (stop #~(make-kill-destructor)))
+
+ ,(shepherd-service
+ (documentation "Dunst notification daemon; displays desktop notifications.")
+ (provision '(dunst))
+ (requirement '(x11-display))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append dunst "/bin/dunst"))))
+ (stop #~(make-kill-destructor)))
+
+ ;; Picom needs to use the proprietary nvidia driver's libgl if that
+ ;; driver is used for Xorg; plain Mesa won't work then.
+ ,(let ((grafter
+ (if nvidia-driver?
+ (package-input-rewriting
+ `((,mesa . ,(package (inherit mesa) (replacement nvda)))))
+ identity)))
+ (shepherd-service
+ (documentation "Picom compositor; enables transparent windows in X.")
+ (provision '(picom))
+ (requirement '(x11-display))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append (grafter picom) "/bin/picom")
+ "--config" #$(local-file "files/picom.conf"))))
+ (stop #~(make-kill-destructor))))
+
+ ,(shepherd-service
+ (documentation "Source Xresources on login.")
+ (provision '(xrdb))
+ (requirement '(x11-display))
+ (one-shot? #t)
+ (start #~(lambda _
+ (invoke #$(file-append xrdb "/bin/xrdb") "-merge"
+ #$(local-file "files/Xresources")))))
+
+ ;; By default, xdotool gets most of "#@\|~()<>[]{} wrong. Make
+ ;; it use the correct keymap by re-setting the same one again.
+ ,(shepherd-service
+ (documentation "Fix X keyboard map on login; passmenu needs this.")
+ (provision '(fix-xdotool))
+ (requirement '(x11-display))
+ (one-shot? #t)
+ (start #~(lambda _
+ (use-modules (ice-9 rdelim)
+ (ice-9 regex)
+ (ice-9 popen))
+ (let ((port (open-pipe* OPEN_READ #$(file-append setxkbmap "/bin/setxkbmap")
+ "-query")))
+ (let loop ((line (read-line port)))
+ (unless (eof-object? line)
+ (let ((mtch (string-match "^layout:[[:space:]]*" line)))
+ (if mtch
+ (system* #$(file-append setxkbmap "/bin/setxkbmap")
+ (match:suffix mtch))
+ (loop (read-line port))))))))))
+
+ ,(shepherd-service
+ (documentation "Set up X displays on login.")
+ (provision '(xorg-setup))
+ (one-shot? #t)
+ (start #~(lambda _
+ (define (replace-home path)
+ (if (string-prefix? "~/" path)
+ (string-replace path (getenv "HOME") 0 1)
+ path))
+ (system* #$(file-append numlockx "/bin/numlockx") "on")
+ ;; Turn off the monitors if there is no input for 10 minutes.
+ (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
+ (system* #$(file-append xrandr "/bin/xrandr")
+ #$@(append-map (lambda (monitor)
+ (match-record monitor <home-monitor-configuration>
+ (name xrandr-options)
+ `("--output" ,name ,@xrandr-options)))
+ monitors))
+ ;; Set the desktop background picture. Hopefully doing this just after
+ ;; xrandr works and sets it for both screens.
+ (system* #$(file-append hsetroot "/bin/hsetroot")
+ "-cover" (replace-home #$desktop-background)))))
+
+ ,@(if bluetooth?
+ (list (shepherd-service
+ (documentation "Blueman applet; provides a GUI for connection to bluetooth devices.")
+ (provision '(blueman-applet))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append blueman "/bin/blueman-applet"))))
+ (stop #~(make-kill-destructor))))
+ '())
+
+ ,@(map (compose (cut polybar-service <> battery-name ac-adapter-name)
+ home-monitor-configuration-name)
+ monitors))))
+
+(define home-desktop-service-type
(service-type
- (name 'desktop-layout)
+ (name 'desktop)
+ (description "Configure the desktop environment.")
(extensions
- (list (service-extension home-shepherd-service-type desktop-layout-services)
- (service-extension home-xdg-configuration-files-service-type polybar-config)))
- (description
- "Configure the desktop background, monitor layout and polybar.")))
+ (list (service-extension home-profile-service-type home-packages)
+ (service-extension home-xdg-configuration-files-service-type home-xdg-configs)
+ (service-extension home-files-service-type home-files)
+ (service-extension home-environment-variables-service-type home-environment)
+ (service-extension home-shepherd-service-type home-shepherd-services)))))
-;; Blueman
+;; Personal Information Management (mail, calendar, contacts, etc)
+
+(define-configuration/no-serialization home-pim-configuration
+ (work? (boolean #f) "Configure only programs relevant for work?"))
+
+(define (pim-packages config)
+ "PIM programs and utilities."
+ (match-record config <home-pim-configuration> (work?)
+ (cons* vdirsyncer khal khard aerc lynx mutt_oauth2.py ; lynx for HTML mail
+ (if work? '() (list nheko signal-desktop newsboat)))))
+
+(define (pim-xdg-configs config)
+ "Configuration files for PIM programs."
+ (match-record config <home-pim-configuration> (work?)
+ `(("khal/config" ,(local-file "files/khal.conf"))
+ ("khard/khard.conf" ,(local-file "files/khard.conf"))
+ ("aerc/accounts.conf" ,(if work?
+ (local-file "files/aerc/accounts.work.conf")
+ (local-file "files/aerc/accounts.conf")))
+ ("aerc/aerc.conf" ,(local-file "files/aerc/aerc.conf"))
+ ("aerc/binds.conf" ,(local-file "files/aerc/binds.conf"))
+ ("aerc/filters" ,(local-file "files/aerc/filters" #:recursive? #t))
+ ("aerc/stylesets/catppuccin" ,catppuccin-aerc)
+ ("vdirsyncer/config" ,(local-file "files/vdirsyncer.conf"))
+ ,@(if work? '()
+ `(("newsboat/config" ,(local-file "files/newsboat.conf"))
+ ("newsboat/config.catppuccin" ,catppuccin-newsboat))))))
-(define (blueman-services config)
- (list (shepherd-service
- (documentation "Blueman applet; provides a GUI for connection to bluetooth devices.")
- (provision '(blueman-applet))
- (start #~(make-forkexec-constructor
- (list #$(file-append blueman "/bin/blueman-applet"))))
- (stop #~(make-kill-destructor)))))
+(define (pim-cron-jobs config)
+ "Periodic jobs to sync calendars and contacts."
+ ;; To avoid popping up a password prompt every time these run,
+ ;; gpg-agent needs a long-enough default-cache-ttl.
+ (list #~(job "15 */4 * * *" #$(file-append vdirsyncer "/bin/vdirsyncer metasync"))
+ #~(job "0,30 * * * *" #$(file-append vdirsyncer "/bin/vdirsyncer sync"))))
-(define home-blueman-service-type
+(define-public home-pim-service-type
(service-type
- (name 'blueman)
- (default-value #f)
+ (name 'pim)
+ (description "Install and configure Personal Information Management software.")
+ (default-value (home-pim-configuration))
(extensions
- (list (service-extension home-shepherd-service-type blueman-services)))
- (description
- "Run the Blueman applet for graphical Bluetooth control.")))
+ (list (service-extension home-profile-service-type pim-packages)
+ (service-extension home-xdg-configuration-files-service-type pim-xdg-configs)
+ (service-extension home-mcron-service-type pim-cron-jobs)))))
diff --git a/tw/services/dev-env.scm b/tw/services/dev-env.scm
new file mode 100644
index 00000000..8e38ea8f
--- /dev/null
+++ b/tw/services/dev-env.scm
@@ -0,0 +1,158 @@
+(define-module (tw services dev-env)
+ #:use-module (gnu)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module ((gnu packages commencement) #:select (gcc-toolchain))
+ #:use-module ((gnu packages databases) #:select (emacs-rec-mode))
+ #:use-module ((gnu packages elf) #:select (patchelf elfutils))
+ #:use-module (gnu packages emacs)
+ #:use-module (gnu packages emacs-xyz)
+ #:use-module ((gnu packages finance) #:select (emacs-ledger-mode))
+ #:use-module ((gnu packages haskell-apps) #:select (shellcheck))
+ #:use-module ((gnu packages llvm) #:select (clang))
+ #:use-module ((gnu packages python-xyz) #:select (python-lsp-server python-yamllint))
+ #:use-module ((gnu packages sqlite) #:select (sqlite))
+ #:use-module (gnu packages tree-sitter)
+ #:use-module (gnu packages vim)
+ #:use-module (gnu services configuration)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module ((tw theme) #:select (catppuccin-emacs catppuccin-vim))
+ #:export (home-emacs-configuration
+ home-emacs-service-type
+ home-vim-configuration
+ home-vim-service-type))
+
+
+
+(define (vim-environment config)
+ '(("EDITOR" . "vim"))) ; we define no ASYNC_EDITOR
+
+(define (vim-xdg-config config)
+ `((".vim/vimrc" ,(local-file "files/vimrc"))
+ (".vim/catppuccin.vim" ,catppuccin-vim)))
+
+;; In non-graphical environments, install vim as an editor. Neovim might be
+;; better, but doesn't have an equivalent to `vim-surround' packaged.
+(define (vim-packages config)
+ (list vim vim-surround))
+
+(define (emacs-environment config)
+ '(("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")))
+
+(define (emacs-xdg-config config)
+ `(("emacs/include" ,(local-file "files/emacs-packages" #:recursive? #t))
+ ("emacs/init.el" ,(local-file "files/emacs-init.el"))
+ ("emacs/catppuccin-theme.el" ,catppuccin-emacs)))
+
+(define (emacs-files config)
+ `((".local/share/applications/emacsclient.desktop"
+ ,(local-file "files/emacsclient.desktop"))))
+
+(define (emacs-daemon config)
+ (list (shepherd-service
+ (documentation "Emacs server; connect using emacsclient.")
+ (provision '(emacs))
+ (requirement '(x11-display))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append emacs "/bin/emacs") "--fg-daemon")))
+ (stop #~(make-kill-destructor)))))
+
+(define (emacs-packages config)
+ (list
+ ;; Development & language servers
+ gnu-make python-lsp-server python-yamllint shellcheck gcc-toolchain binutils patchelf elfutils
+ clang ; for clangd
+ glibc ; for ldd
+
+ ;; Emacs general
+ emacs ; for Wayland, switch to emacs-pgtk for better fractional scaling support
+ emacs-use-package
+ emacs-gcmh
+ 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-undo-tree
+ emacs-aggressive-indent
+ emacs-which-key
+ emacs-smart-mode-line
+ emacs-diminish
+ emacs-rainbow-mode
+ emacs-form-feed
+ 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-cleverparens
+ emacs-evil-org
+ emacs-evil-markdown
+ emacs-evil-tex
+ emacs-evil-text-object-python
+
+ ;; Emacs language modes
+ emacs-flymake-collection
+ emacs-geiser emacs-geiser-guile
+ emacs-sly
+ emacs-gnuplot
+ emacs-graphviz-dot-mode
+ emacs-haskell-mode
+ emacs-hcl-mode
+ emacs-ledger-mode
+ emacs-mmm-mode
+ emacs-puppet-mode
+ emacs-rec-mode
+ emacs-web-mode
+ emacs-yaml-mode
+
+ ;; Tree sitter libraries, for Emacs' built-in X-ts-modes.
+ tree-sitter-bash
+ tree-sitter-c
+ tree-sitter-cmake
+ tree-sitter-cpp
+ tree-sitter-css
+ tree-sitter-dockerfile
+ tree-sitter-javascript
+ tree-sitter-json
+ tree-sitter-python
+ tree-sitter-ruby))
+
+(define-public home-basic-dev-env-service-type
+ (service-type
+ (name 'basic-dev-env)
+ (description "Set up a basic development environment using vim.")
+ (default-value #f)
+ (extensions
+ (list (service-extension home-profile-service-type vim-packages)
+ (service-extension home-xdg-configuration-files-service-type vim-xdg-config)
+ (service-extension home-environment-variables-service-type vim-environment)))))
+
+(define-public home-full-dev-env-service-type
+ (service-type
+ (name 'full-dev-env)
+ (description "Set up a full-featured, interactive development environment using Emacs.")
+ (default-value #f)
+ (extensions
+ (list (service-extension home-profile-service-type emacs-packages)
+ (service-extension home-xdg-configuration-files-service-type emacs-xdg-config)
+ (service-extension home-files-service-type emacs-files)
+ (service-extension home-environment-variables-service-type emacs-environment)
+ (service-extension home-shepherd-service-type emacs-daemon)))))
diff --git a/tw/home/files/XCompose b/tw/services/files/XCompose
index cb73e833..cb73e833 100644
--- a/tw/home/files/XCompose
+++ b/tw/services/files/XCompose
diff --git a/tw/home/files/Xresources b/tw/services/files/Xresources
index ba534392..ba534392 100644
--- a/tw/home/files/Xresources
+++ b/tw/services/files/Xresources
diff --git a/tw/home/files/aerc/accounts.conf b/tw/services/files/aerc/accounts.conf
index 5325ee03..5325ee03 100644
--- a/tw/home/files/aerc/accounts.conf
+++ b/tw/services/files/aerc/accounts.conf
diff --git a/tw/home/files/aerc/accounts.work.conf b/tw/services/files/aerc/accounts.work.conf
index 5d2fa7c7..5d2fa7c7 100644
--- a/tw/home/files/aerc/accounts.work.conf
+++ b/tw/services/files/aerc/accounts.work.conf
diff --git a/tw/home/files/aerc/aerc.conf b/tw/services/files/aerc/aerc.conf
index 7473bc8b..7473bc8b 100644
--- a/tw/home/files/aerc/aerc.conf
+++ b/tw/services/files/aerc/aerc.conf
diff --git a/tw/home/files/aerc/binds.conf b/tw/services/files/aerc/binds.conf
index 0e88b571..0e88b571 100644
--- a/tw/home/files/aerc/binds.conf
+++ b/tw/services/files/aerc/binds.conf
diff --git a/tw/home/files/aerc/filters/colorize.ansi b/tw/services/files/aerc/filters/colorize.ansi
index c21fd804..c21fd804 100755
--- a/tw/home/files/aerc/filters/colorize.ansi
+++ b/tw/services/files/aerc/filters/colorize.ansi
diff --git a/tw/home/files/cursors.ini b/tw/services/files/cursors.ini
index c4eb9cdb..c4eb9cdb 100644
--- a/tw/home/files/cursors.ini
+++ b/tw/services/files/cursors.ini
diff --git a/tw/home/files/dunstrc b/tw/services/files/dunstrc
index c64d374f..c64d374f 100644
--- a/tw/home/files/dunstrc
+++ b/tw/services/files/dunstrc
diff --git a/tw/home/files/emacs-init.el b/tw/services/files/emacs-init.el
index 0f20782d..0f20782d 100644
--- a/tw/home/files/emacs-init.el
+++ b/tw/services/files/emacs-init.el
diff --git a/tw/home/files/emacs-packages/actionlint.el b/tw/services/files/emacs-packages/actionlint.el
index 68a25c57..68a25c57 100644
--- a/tw/home/files/emacs-packages/actionlint.el
+++ b/tw/services/files/emacs-packages/actionlint.el
diff --git a/tw/home/files/emacs-packages/alidist-mode.el b/tw/services/files/emacs-packages/alidist-mode.el
index fbcef7e5..fbcef7e5 100644
--- a/tw/home/files/emacs-packages/alidist-mode.el
+++ b/tw/services/files/emacs-packages/alidist-mode.el
diff --git a/tw/home/files/emacs-packages/bemscript-mode.el b/tw/services/files/emacs-packages/bemscript-mode.el
index f46c858b..f46c858b 100644
--- a/tw/home/files/emacs-packages/bemscript-mode.el
+++ b/tw/services/files/emacs-packages/bemscript-mode.el
diff --git a/tw/home/files/emacs-packages/environmentd-mode.el b/tw/services/files/emacs-packages/environmentd-mode.el
index 4bb8812e..4bb8812e 100644
--- a/tw/home/files/emacs-packages/environmentd-mode.el
+++ b/tw/services/files/emacs-packages/environmentd-mode.el
diff --git a/tw/home/files/emacs-packages/flymake-guile.el b/tw/services/files/emacs-packages/flymake-guile.el
index edfbce82..edfbce82 100644
--- a/tw/home/files/emacs-packages/flymake-guile.el
+++ b/tw/services/files/emacs-packages/flymake-guile.el
diff --git a/tw/home/files/emacs-packages/ifm-mode.el b/tw/services/files/emacs-packages/ifm-mode.el
index 7416588b..7416588b 100644
--- a/tw/home/files/emacs-packages/ifm-mode.el
+++ b/tw/services/files/emacs-packages/ifm-mode.el
diff --git a/tw/home/files/emacs-packages/pam-env-mode.el b/tw/services/files/emacs-packages/pam-env-mode.el
index 75b0bf94..75b0bf94 100644
--- a/tw/home/files/emacs-packages/pam-env-mode.el
+++ b/tw/services/files/emacs-packages/pam-env-mode.el
diff --git a/tw/home/files/emacs-packages/vcard-mode.el b/tw/services/files/emacs-packages/vcard-mode.el
index a932477a..a932477a 100644
--- a/tw/home/files/emacs-packages/vcard-mode.el
+++ b/tw/services/files/emacs-packages/vcard-mode.el
diff --git a/tw/home/files/emacsclient.desktop b/tw/services/files/emacsclient.desktop
index 5e68ffef..5e68ffef 100644
--- a/tw/home/files/emacsclient.desktop
+++ b/tw/services/files/emacsclient.desktop
diff --git a/tw/home/files/gtk2.ini b/tw/services/files/gtk2.ini
index 6af8200a..6af8200a 100644
--- a/tw/home/files/gtk2.ini
+++ b/tw/services/files/gtk2.ini
diff --git a/tw/home/files/gtk3.ini b/tw/services/files/gtk3.ini
index fff5946b..fff5946b 100644
--- a/tw/home/files/gtk3.ini
+++ b/tw/services/files/gtk3.ini
diff --git a/tw/home/files/i3.conf b/tw/services/files/i3.conf
index 10ae1133..10ae1133 100644
--- a/tw/home/files/i3.conf
+++ b/tw/services/files/i3.conf
diff --git a/tw/home/files/khal.conf b/tw/services/files/khal.conf
index 3240609a..3240609a 100644
--- a/tw/home/files/khal.conf
+++ b/tw/services/files/khal.conf
diff --git a/tw/home/files/khard.conf b/tw/services/files/khard.conf
index a3cfe41a..a3cfe41a 100644
--- a/tw/home/files/khard.conf
+++ b/tw/services/files/khard.conf
diff --git a/tw/home/files/kitty.conf b/tw/services/files/kitty.conf
index 014e70f6..014e70f6 100644
--- a/tw/home/files/kitty.conf
+++ b/tw/services/files/kitty.conf
diff --git a/tw/home/files/mimeapps.list b/tw/services/files/mimeapps.list
index 6cbf5ce9..6cbf5ce9 100644
--- a/tw/home/files/mimeapps.list
+++ b/tw/services/files/mimeapps.list
diff --git a/tw/home/files/newsboat.conf b/tw/services/files/newsboat.conf
index 7959e138..7959e138 100644
--- a/tw/home/files/newsboat.conf
+++ b/tw/services/files/newsboat.conf
diff --git a/tw/home/files/passmenu b/tw/services/files/passmenu
index 9bf7f7e3..9bf7f7e3 100755
--- a/tw/home/files/passmenu
+++ b/tw/services/files/passmenu
diff --git a/tw/home/files/picom.conf b/tw/services/files/picom.conf
index a7d86571..a7d86571 100644
--- a/tw/home/files/picom.conf
+++ b/tw/services/files/picom.conf
diff --git a/tw/home/files/rofi.rasi b/tw/services/files/rofi.rasi
index 83363c14..83363c14 100644
--- a/tw/home/files/rofi.rasi
+++ b/tw/services/files/rofi.rasi
diff --git a/tw/home/files/sessionmenu b/tw/services/files/sessionmenu
index 91839d8e..91839d8e 100755
--- a/tw/home/files/sessionmenu
+++ b/tw/services/files/sessionmenu
diff --git a/tw/home/files/vdirsyncer.conf b/tw/services/files/vdirsyncer.conf
index 0745c98f..0745c98f 100644
--- a/tw/home/files/vdirsyncer.conf
+++ b/tw/services/files/vdirsyncer.conf
diff --git a/tw/home/files/vimrc b/tw/services/files/vimrc
index 9c48346f..9c48346f 100644
--- a/tw/home/files/vimrc
+++ b/tw/services/files/vimrc
diff --git a/tw/home/files/volume b/tw/services/files/volume
index 96398553..96398553 100755
--- a/tw/home/files/volume
+++ b/tw/services/files/volume
diff --git a/tw/home/files/zathurarc b/tw/services/files/zathurarc
index 06a9351f..06a9351f 100644
--- a/tw/home/files/zathurarc
+++ b/tw/services/files/zathurarc