diff options
Diffstat (limited to 'tw')
-rw-r--r-- | tw/home.scm | 736 | ||||
-rw-r--r-- | tw/home/btl.scm | 17 | ||||
-rw-r--r-- | tw/home/cern.scm | 29 | ||||
-rw-r--r-- | tw/home/frm.scm | 14 | ||||
-rw-r--r-- | tw/home/lap.scm | 17 | ||||
-rw-r--r-- | tw/home/server.scm | 9 | ||||
-rw-r--r-- | tw/services/desktop.scm | 449 | ||||
-rw-r--r-- | tw/services/dev-env.scm | 158 | ||||
-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-x | tw/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-x | tw/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-x | tw/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-x | tw/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 |