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