;; 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 (define-module (tw home lap) #:use-module ((gnu) #:select (use-package-modules)) #: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 shepherd) #:use-module (gnu packages) #:use-module (gnu services) #:use-module (gnu services shepherd) #:use-module (guix channels) #:use-module (guix gexp) #:use-module ((nongnu packages messaging) #:select (signal-desktop zoom)) #:use-module ((nongnu packages steam-client) #:select (steam)) #:use-module (tw home) #:use-module (tw home emacs) #:use-module (tw packages alice) #:use-module (tw packages catppuccin) #:use-module (tw packages ci) #:use-module (tw packages games) #:use-module (tw packages xorg) #:use-module (tw gexp) #:use-module (tw theme)) (use-package-modules android bittorrent calendar compton dav dunst fonts freedesktop games gimp gnome gnome-xyz gnuzilla graphviz image-viewers inkscape kde libreoffice linux mail messaging music networking pdf pulseaudio python-xyz syndication tcl terminals version-control video web-browsers wm xdisorg xorg) (define pim-packages (list newsboat vdirsyncer khal khard aerc 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")) ("aerc" ,(local-file "files/aerc" #:recursive? #t)) ("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")))) ;; These cron jobs are annoying because they pop up a password prompt every time they run. ;; (simple-service 'pim-cronjobs home-mcron-service-type ;; (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")))) (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-wrapper (program-file "polybar-wrapper" #~(begin ;; This wrapper program checks that the monitor we want to start ;; polybar on is actually connected. (use-modules (ice-9 popen) (ice-9 rdelim)) (let* ((connected-str (string-append (getenv "POLYBAR_MONITOR") " connected")) (xrandr (open-pipe* OPEN_READ #$(file-append xrandr "/bin/xrandr") "-q")) (monitor-connected? (let loop ((line (read-line xrandr))) (cond ((eof-object? line) #f) ; we didn't find our monitor connected ((string-prefix? connected-str line) #t) ; the monitor we want is connected (else (loop (read-line xrandr))))))) ; keep looking (close-pipe xrandr) (when monitor-connected? (execl #$(file-append polybar "/bin/polybar"))))))) (define (polybar-service monitor) (shepherd-service (documentation (string-append "Polybar desktop bar for monitor " monitor ".")) (provision (list (symbol-append 'polybar- (string->symbol monitor)))) (requirement '(xorg-setup)) (start #~(make-forkexec-constructor (list #$polybar-wrapper) #:environment-variables (cons #$(string-append "POLYBAR_MONITOR=" monitor) (default-environment-variables)))) (stop #~(make-kill-destructor)))) (define-public %lap-home (home-environment (packages ;; These packages will show up in the home profile, under ~/.guix-home/profile. (cons* ;; CLI tools adb fastboot beets bsd-games powertop (list git "send-email") ;; Games steam ; see also: steam-nvidia ;; Work s3cmd python-alibuild ; python-alidistlint hashicorp-nomad-bin hashicorp-consul-bin hashicorp-vault-bin hashicorp-packer-bin ;; 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 gimp hsetroot inkscape icecat imv 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 ;; geoclue ; for redshift -- installed system-wide ;; Games are installed in ~/.guix-profile instead, to make updates of the ;; home environment faster. ;; 0ad flightgear freeciv simutrans/pak128 warzone2100 widelands pioneer ;; Fonts 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 (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")))) ;; This can't be a `service' as that would remove the 'guix channel. (simple-service '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")))))) ;; 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) ; 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)) (simple-service 'gui-services home-shepherd-service-type (list (shepherd-service (documentation "NetworkManager applet; provides a GUI for network connections.") (provision '(nm-applet)) (start #~(make-forkexec-constructor (list #$(file-append network-manager-applet "/bin/nm-applet")))) (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 #$(file-append blueman "/bin/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 #$(file-append dunst "/bin/dunst")))) (stop #~(make-kill-destructor))) (shepherd-service (documentation "Picom compositor; enables transparent windows in X.") (provision '(picom)) (start #~(make-forkexec-constructor (list #$(file-append picom "/bin/picom") "--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 #$(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)) (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 _ (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") "--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. (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) ("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) ("zathura/zathurarc" ,(local-file "files/zathurarc")) ("zathura/catppuccin" ,catppuccin-zathura))) (simple-service 'cursor-theme home-files-service-type `((".icons/default/index.theme" ,(local-file "files/cursors.ini")))) (simple-service 'gui-environment 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 #$(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/share/applications/emacsclient.desktop" ,(local-file "files/emacsclient.desktop")))) (append (gnupg-services #:gui-pinentry? #t) common-services emacs-services pim-services))))) %lap-home