diff options
Diffstat (limited to 'tw/home/lap.scm')
-rw-r--r-- | tw/home/lap.scm | 697 |
1 files changed, 697 insertions, 0 deletions
diff --git a/tw/home/lap.scm b/tw/home/lap.scm new file mode 100644 index 00000000..0c400242 --- /dev/null +++ b/tw/home/lap.scm @@ -0,0 +1,697 @@ +;; This "home-environment" file can be passed to 'guix home reconfigure' +;; to reproduce the content of your profile. This is "symbolic": it only +;; specifies package names. To reproduce the exact same profile, you also +;; need to capture the channels being used, as returned by "guix describe". +;; See the "Replicating Guix" section in the manual. + +;; See also, for some tips: +;; https://github.com/alezost/shepherd-config/blob/master/init.scm + +;; TODO: Integrate upstream (ctp) configs into ~/guix-home using git submodules: +;; https://github.com/catppuccin/grub ; TODO: make this system-wide +;; https://github.com/catppuccin/tty ; system-wide +;; https://github.com/catppuccin/papirus-folders +;; https://github.com/catppuccin/Kvantum +;; https://github.com/catppuccin/fzf +;; https://github.com/catppuccin/obs +;; https://github.com/catppuccin/insomnia +;; https://github.com/catppuccin/firefox ; for icecat + +;; Manual installation needed? +;; https://github.com/catppuccin/dark-reader +;; https://github.com/catppuccin/github + +(define-module (tw home lap) + #:use-module (gnu home) + #:use-module (gnu home services) + #:use-module (gnu home services desktop) + #: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) + #:use-module (guix channels) + #:use-module (guix modules) + #:use-module (guix gexp)) + +(fluid-set! read-eval? #t) ; allow #. read expansions in this file + +;; One of "latte" (light theme), "frappe", "macchiato", "mocha" (dark +;; themes); ordered brightest to darkest. +;; Set and use this at read time so that `local-file' gets a literal +;; argument. Anything else confuses it and causes it to search +;; relative to the working directory, not this file's directory. +#.(define catppuccin-theme-variant "mocha") + +;; "Base" colour from the active Catppuccin theme (see +;; https://github.com/catppuccin/catppuccin). +(define catppuccin-background-color "1e1e2e") + +(define* (package-binary specification #:optional (binary specification)) + "Get the path of BINARY inside the package referred to by SPECIFICATION." + (file-append (specification->package specification) + (string-append "/bin/" binary))) + +;; See also: `file-join' in (gnu home services ssh). +(define (combined-text-file name . files) + "A file which is the concatenation of the contents of other files." + ;; We need to use #$output for `computed-file' to work. + ;; Of course this isn't documented anywhere! + (computed-file name + (with-imported-modules (source-module-closure + '((guix build utils))) ; for `dump-port' + #~(begin + (use-modules (guix build utils)) + (call-with-output-file #$output + (lambda (oport) + (for-each (lambda (in-file) + (call-with-input-file in-file + (lambda (iport) + (dump-port iport oport)))) + '#$files))))))) + +(define (text-file/substitutions name input-file . substitutions) + "A file containing another file's content with regexp substitutions. +Each item in SUBSTITUTIONS is a `cons' of a regular expression and a +replacement spec (to which `regexp-substitute/global' is applied)." + (computed-file name + #~(begin + (use-modules (ice-9 regex) + (ice-9 textual-ports)) + (call-with-output-file #$output + (lambda (oport) + (call-with-input-file #$input-file + (lambda (iport) + (let loop ((output (get-string-all iport)) + (substitutions '#$substitutions)) + (if (null? substitutions) + (put-string oport output) + (loop (call-with-output-string + (lambda (sport) + (apply regexp-substitute/global + sport + (caar substitutions) + output + (cdar substitutions)))) + (cdr substitutions))))))))))) + +(define gui-packages + '(;; 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" "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 + ;; "geoclue" ; for redshift -- installed system-wide + ;; Games + "0ad" "freeciv" "warzone2100" "widelands" ; "pioneer" + ;; Fonts + "font-hermit" "font-inconsolata" "font-fira-code" "font-fira-sans" + "font-libertinus" "font-openmoji" + ;; Theming + "papirus-icon-theme" + ;; My own packages -- needs GUIX_PACKAGE_PATH to be set; see below. + "catppuccin-gtk-theme" + "catppuccin-mocha-dark-cursors" + "simutrans")) + +(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 #$(package-binary "polybar")) + #:environment-variables + (cons #$(string-append "POLYBAR_MONITOR=" monitor) + (default-environment-variables)))) + (stop #~(make-kill-destructor)))) + +(define gui-services + (list + ;; Batsignal: battery level notifications. + (service home-batsignal-service-type + (home-batsignal-configuration + (batteries '("BAT0")))) + + ;; Redshift: make the screen turn redder at night. + (service home-redshift-service-type + (home-redshift-configuration + ;; See info '(guix)Desktop Home Services'. + (location-provider 'manual) + ;; 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 + (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)) + + (simple-service + 'gui-services home-shepherd-service-type + (list + (shepherd-service + (documentation "KDE connect applet.") + (provision '(kdeconnect-applet)) + (requirement '(kdeconnectd)) + (start #~(make-forkexec-constructor + (list #$(package-binary "kdeconnect" "kdeconnect-indicator")))) + (stop #~(make-kill-destructor))) + (shepherd-service + (documentation "KDE connect daemon.") + (provision '(kdeconnectd)) + (start #~(make-forkexec-constructor + (list #$(file-append (specification->package "kdeconnect") + (string-append "/libexec/kdeconnectd"))))) + (stop #~(make-kill-destructor))) + + (shepherd-service + (documentation "Blueman applet; provides a GUI for connection to bluetooth devices.") + (provision '(blueman-applet)) + (start #~(make-forkexec-constructor + (list #$(package-binary "blueman" "blueman-applet")))) + (stop #~(make-kill-destructor))) + + (polybar-service "eDP-1") + (polybar-service "HDMI-1-1") + + (shepherd-service + (documentation "Dunst notification daemon; displays desktop notifications.") + (provision '(dunst)) + (start #~(make-forkexec-constructor + (list #$(package-binary "dunst")))) + (stop #~(make-kill-destructor))) + + (shepherd-service + (documentation "Picom compositor; enables transparent windows in X.") + (provision '(picom)) + (start #~(make-forkexec-constructor + (list #$(package-binary "picom") "--experimental-backends" + "--config" #$(local-file "files/picom.conf")))) + (stop #~(make-kill-destructor))) + + (shepherd-service + (documentation "Source Xresources on login.") + (provision '(xrdb)) + (one-shot? #t) + (start #~(lambda _ + (invoke #$(package-binary "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)) + (one-shot? #t) + (start #~(lambda _ + (use-modules (ice-9 rdelim) + (ice-9 regex) + (ice-9 popen)) + (let ((port (open-pipe* OPEN_READ #$(package-binary "setxkbmap") "-query"))) + (let loop ((line (read-line port))) + (unless (eof-object? line) + (let ((mtch (string-match "^layout:[[:space:]]*" line))) + (if mtch + (system* #$(package-binary "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 _ + (invoke #$(package-binary "numlockx") "on") + ;; Turn off the monitors if there is no input for 10 minutes. + (invoke #$(package-binary "xset") "dpms" "600" "600" "600") + (invoke #$(package-binary "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 #$(package-binary "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" + ,(local-file #.(string-append "files/catppuccin/dunst/src/" + catppuccin-theme-variant ".conf") + "dunst-theme.conf")) + ("emacs/include" ,(local-file "files/emacs-packages" #:recursive? #t)) + ("emacs/init.el" ,(local-file "files/emacs-init.el")) + (#.(string-append "emacs/catppuccin-" catppuccin-theme-variant "-theme.el") + ,(local-file #.(string-append "files/catppuccin/emacs/catppuccin-" + catppuccin-theme-variant "-theme.el"))) + ("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")) + ("kdeglobals" ; TODO: this works for some programs (e.g. kdeconnect-app), + ; but not for others (e.g. nheko, kdeconnect-settings)... + ,(local-file #.(let ((variant (string-upcase catppuccin-theme-variant 0 1))) + (string-append "files/catppuccin/kde/" variant + "/Catppuccin" variant ".colors")))) + ("kitty/diff.conf" + ,(local-file #.(string-append "files/catppuccin/kitty/diff-" + catppuccin-theme-variant ".conf") + "kitty-diff-theme.conf")) + ("kitty/kitty.conf" + ,(combined-text-file "kitty.conf" + (local-file "files/kitty.conf") + (local-file #.(string-append "files/catppuccin/kitty/" + catppuccin-theme-variant ".conf") + "kitty-theme.conf"))) + ("polybar/config.ini" ,(local-file "files/polybar.ini")) + ("polybar/catppuccin.ini" + ,(local-file #.(string-append "files/catppuccin/polybar/themes/" + catppuccin-theme-variant ".ini"))) + ("rofi/config.rasi" ,(local-file "files/rofi.rasi")) + ("rofi/themes/catppuccin.rasi" + ,(text-file/substitutions "catppuccin.rasi" + (local-file #.(string-append "files/catppuccin/rofi/basic/.local/share/rofi/themes/catppuccin-" + catppuccin-theme-variant ".rasi")) + '("JetBrainsMono Nerd Font 14" pre "Fira Sans 12" post) ; default font + '("border-col: #[0-9a-f]*;" pre "border-col: #585b70;" post))) ; i3 border colour + ("zathura/zathurarc" ,(local-file "files/zathurarc")) + ("zathura/catppuccin" + ,(local-file #.(string-append "files/catppuccin/zathura/src/catppuccin-" + catppuccin-theme-variant))))) + + (simple-service + 'gui-files home-files-service-type + `((".icons/default/index.theme" ,(local-file "files/cursors.ini")))) + + (simple-service + 'gui-environment-variables home-environment-variables-service-type + `(("TERMINAL" . "kitty") + ("_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")) + ;; Smooth trackpad scrolling in Firefox/Icecat. + ;; https://wiki.archlinux.org/index.php/Firefox/Tweaks#Pixel-perfect_trackpad_scrolling + ("MOZ_USE_XINPUT2" . "1"))) + + (simple-service + 'gui-scripts home-files-service-type + `(;; https://sw.kovidgoyal.net/kitty/kittens/diff/ + (".local/bin/kdiff" ; show a diff + ,(program-file "kdiff" #~(apply execl #$(package-binary "kitty") "kitty" + "+kitten" "diff" (cdr (command-line))))) + (".local/bin/icat" ; kitty's "catimg" equivalent + ,(program-file "icat" #~(apply execl #$(package-binary "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* #$(package-binary "dunst" "dunstctl") "set-paused" "true") + (system* #$(package-binary "xset") "dpms" "0" "0" "5") + ;; We mustn't use `package-binary' here, as we have to pick up the + ;; setuid binary for i3lock installed by the system config. + (system* "i3lock" "-nc" #$catppuccin-background-color) + (system* #$(package-binary "xset") "dpms" "0" "0" "0") + (system* #$(package-binary "dunst" "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. + `(;; Install only bind-utils like dig, not the full suite. + (,(specification->package "bind") "utils") + ,@(specifications->packages gui-packages) + ,@(specifications->packages + '(;; 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" + + ;; 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 + "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")))) + + ;; 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 #$(package-binary "emacs") "--fg-daemon"))) + (stop #~(make-kill-destructor))) + (shepherd-service + (documentation "GPG agent; caches key passwords.") + (provision '(gpg-agent)) + (start #~(lambda _ + (invoke #$(package-binary "gnupg" "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 #$(package-binary "vdirsyncer") " metasync")) + #~(job "0,30 * * * *" ; every half hour + (string-append #$(package-binary "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" + ,(local-file #.(if (string=? catppuccin-theme-variant "latte") + "files/catppuccin/neomutt/latte-neomuttrc" + "files/catppuccin/neomutt/neomuttrc"))) + ("newsboat/config" ,(local-file "files/newsboat.conf")) + ("newsboat/config.catppuccin" + ,(local-file #.(if (string=? catppuccin-theme-variant "latte") + "files/catppuccin/newsboat/themes/latte" + "files/catppuccin/newsboat/themes/dark") + "newsboat-theme.conf")) + ("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 " (package-binary "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/packages/guix") + + ;; 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" . 22) + ("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")))))) + + gui-services))) |