summaryrefslogtreecommitdiff
path: root/home.scm
diff options
context:
space:
mode:
Diffstat (limited to 'home.scm')
-rw-r--r--home.scm1142
1 files changed, 1142 insertions, 0 deletions
diff --git a/home.scm b/home.scm
new file mode 100644
index 0000000..ecac3ec
--- /dev/null
+++ b/home.scm
@@ -0,0 +1,1142 @@
+;; 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.
+
+;;; Good reference
+;;; https://git.sr.ht/~efraim/guix-config/tree/9009e110e16a8f153add7fb4d7f1512f6a543802/item/efraim-home.scm
+
+(install-r7rs!)
+(add-to-load-path (dirname (current-filename)))
+
+(import (gnu home)
+ (gnu home services)
+ (gnu home services desktop)
+ (gnu home services guix)
+ (gnu home services shells)
+ (gnu home services shepherd)
+ (gnu home services sound)
+ (gnu home services ssh)
+ (gnu home services symlink-manager)
+ (gnu packages)
+ (gnu services)
+
+ ;(gnu services syncthing)
+
+ (guix packages)
+ (gnu packages music)
+ (gnu packages guile-xyz)
+
+ (guix channels)
+ (guix derivations)
+ (guix monads)
+ (guix modules)
+ (guix store)
+ (guix gexp)
+ (guix transformations)
+
+ (srfi 1)
+
+ (config-generation sexp)
+ (config-generation sway)
+
+ (ini))
+
+(define secrets (load "secrets.scm"))
+
+(define rz/terminal-emulator "foot")
+
+;; (load "./gptel.scm")
+
+(define home-packages
+ (append
+ (specifications->packages
+ (list
+ ;; essential
+ "adb"
+ "bind:utils"
+ "emacs"
+ "emacs-bluetooth"
+ "emacs-ellama"
+ "emacs-elpher"
+ "emacs-emms"
+ "emacs-f"
+ "emacs-go-mode"
+ "emacs-guix"
+ "emacs-jabber"
+ "emacs-markdown-mode"
+ "emacs-nord-theme"
+ "emacs-nov-el"
+ ;; "emacs-org"
+ "emacs-org-download"
+ "emacs-org-emms"
+ "emacs-org-mime"
+ "emacs-org-pandoc-import"
+ "emacs-org-roam"
+ "emacs-org-transclusion"
+ "emacs-pdf-tools"
+ "emacs-persist"
+ "emacs-pinentry"
+ "emacs-request"
+ "emacs-restclient"
+ "emacs-simple-httpd"
+ "emacs-sqlite3-api"
+ "emacs-toc-org"
+ "emacs-tramp"
+ "emacs-typescript-mode"
+ "emacs-websocket"
+ "emacs-which-key"
+ "emacs-wttrin"
+ "emacs-yaml-mode"
+ "emacs-zig-mode"
+ "fd"
+ ;; "ffmpeg"
+ "file"
+ "flatpak"
+ "font-fira-mono"
+ "font-google-noto-emoji"
+ ;; "gajim"
+ "gammastep"
+ "ghc-tldr"
+ "git"
+ "git:send-email"
+ "grim"
+ "gst-libav"
+ "gst-plugins-bad"
+ "gst-plugins-base"
+ "gst-plugins-good"
+ "gst-plugins-ugly"
+ "guile"
+ "htop"
+ "imv"
+ "keepassxc"
+ ;; "libcamera"
+ "libreoffice"
+ "mumble"
+ "ncurses"
+ "neofetch"
+ "nmap"
+ "noisetorch"
+ "pinentry"
+ "rlwrap"
+ "rsync"
+ "screen"
+ "sicp"
+ "slurp"
+ "sshfs"
+ "strace"
+ "syncthing"
+ "tesseract-ocr"
+ "tree"
+ "unzip"
+ "waypipe"
+ "wl-clipboard"
+ "wofi"
+ "xdg-user-dirs"
+ ;; "xsane"
+ "zbar"
+ "zip"
+ rz/terminal-emulator
+
+ ;; sound
+ "pamixer"
+ "patchage"
+ "pulsemixer"
+
+ ;; web
+ "curl"
+ ;; "icecat"
+ ;; "nyxt"
+ ;; "ungoogled-chromium"
+
+ ;; games
+ "protonup-ng"
+ "steam"
+
+ "crispy-doom"
+ "freedoom"
+
+ "luanti"
+ ;; "minetest-worldedit"
+ "luanti-mineclone"
+
+ ;; "openmw"
+
+ "emacs-2048-game"
+
+ ;; email
+ "isync"
+ "mb2md"
+ "mu"
+
+ ;; RSS
+ "emacs-elfeed"
+ "emacs-elfeed-org"
+
+ ;; media
+ "cava"
+ "cmus"
+ "mpv"
+ "pipe-viewer"
+
+ ;; torrent
+ "emacs-transmission"
+ "transmission"
+
+ ;; programming
+ "chibi-scheme"
+ ;; "emacs-cape"
+ ;; "emacs-corfu"
+ "emacs-dumb-jump"
+ "emacs-geiser"
+ "emacs-geiser-guile"
+ "emacs-lsp-mode"
+ "emacs-lsp-ui"
+ "emacs-origami"
+ "emacs-racket-mode"
+ "emacs-slime"
+ "gcc-toolchain"
+ "go"
+ "guile-ini"
+ "guile-lib"
+ "jq"
+ "libserialport"
+ ;; "mit-scheme"
+ ;; "node"
+ "racket"
+ "sbcl"
+ ;; "snd"
+ "zig"
+
+ ;; education
+ ;; "stellarium"
+
+ ;; photography
+ "darktable"
+ "gimp"
+ ;; "krita"
+
+ ;; recording
+ "obs"
+ "obs-wlrobs"
+ "obs-vkcapture"
+ ;; "kdenlive"
+
+ ;; modeling
+ "libfive"
+
+ ;; Editing
+ "emacs-emojify"
+ "emacs-org-bullets"
+ "emacs-ox-hugo"
+ "ispell"))
+ ;; Extra package definitions
+ (list
+ ;; ((options->transformation '((with-commit . "guile-next=f3ea8f7fa1d84a559c7bf834fe5b675abe0ae7b8")))
+ ;; (specification->package "guile-next"))
+ ;; ((options->transformation '((with-commit . "chibi-scheme=29dd1a3b81e297033f687cbbf2b51319856647f4")))
+ ;; (specification->package "chibi-scheme"))
+ ;; emacs-gptel
+ )))
+
+
+(define emacs-config
+ (string-append
+ ";; See /home/robby/.config/guix-home/home-configuration.scm\n"
+ (scm->string
+ ;; Load the secrets file
+ `((when (not (load "/home/robby/.config/emacs/secrets.el"))
+ (message "could not load secrets!"))
+
+ ;; Load the Nord theme when launching an emacsclient GUI
+ (if (daemonp)
+ (add-hook 'after-make-frame-functions
+ (lambda (frame)
+ (with-selected-frame
+ frame
+ (load-theme 'nord t))))
+ (load-theme 'nord t))
+
+ ;; Safe variables
+ (custom-set-variables
+ ;; custom-set-variables was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
+ '(safe-local-variable-values
+ '((auto-save-default)
+ (org-download-image-dir . "~/org/pictures")
+ (eval progn
+ (require 'lisp-mode)
+ (defun emacs27-lisp-fill-paragraph
+ (&optional justify)
+ (interactive "P")
+ (or
+ (fill-comment-paragraph justify)
+ (let
+ ((paragraph-start
+ (concat paragraph-start "\\|\\s-*\\([(;\"]\\|\\s-:\\|`(\\|#'(\\)"))
+ (paragraph-separate
+ (concat paragraph-separate "\\|\\s-*\".*[,\\.]$"))
+ (fill-column
+ (if
+ (and
+ (integerp emacs-lisp-docstring-fill-column)
+ (derived-mode-p 'emacs-lisp-mode))
+ emacs-lisp-docstring-fill-column fill-column)))
+ (fill-paragraph justify))
+ t))
+ (setq-local fill-paragraph-function
+ (syntax emacs27-lisp-fill-paragraph)))
+ (eval modify-syntax-entry 43 "'")
+ (eval modify-syntax-entry 36 "'")
+ (eval modify-syntax-entry 126 "'")
+ (eval let
+ ((root-dir-unexpanded
+ (locate-dominating-file default-directory ".dir-locals.el")))
+ (when root-dir-unexpanded
+ (let*
+ ((root-dir
+ (file-local-name
+ (expand-file-name root-dir-unexpanded)))
+ (root-dir*
+ (directory-file-name root-dir)))
+ (unless
+ (boundp 'geiser-guile-load-path)
+ (defvar geiser-guile-load-path 'nil))
+ (make-local-variable 'geiser-guile-load-path)
+ (require 'cl-lib)
+ (cl-pushnew root-dir* geiser-guile-load-path :test
+ (syntax string-equal)))))
+ (eval with-eval-after-load 'yasnippet
+ (let
+ ((guix-yasnippets
+ (expand-file-name "etc/snippets/yas"
+ (locate-dominating-file default-directory ".dir-locals.el"))))
+ (unless
+ (member guix-yasnippets yas-snippet-dirs)
+ (add-to-list 'yas-snippet-dirs guix-yasnippets)
+ (yas-reload-all))))
+ (eval setq-local guix-directory
+ (locate-dominating-file default-directory ".dir-locals.el"))
+ (eval add-to-list 'completion-ignored-extensions ".go"))))
+
+ ;; Do not open windows in the same Emacs frame.
+ ;; (setq pop-up-frames 'graphic-only)
+
+ (setq inferior-lisp-program "/home/robby/.guix-home/profile/bin/sbcl")
+
+ ;; Enable which-key mode
+ (which-key-mode)
+
+ ;; Automatically create closing pairs
+ (electric-pair-mode 1)
+
+ ;; Show matching parenthesis
+ (show-paren-mode 1)
+ (setq show-paren-delay 0)
+
+ ;; Hide the tool bar
+ (tool-bar-mode -1)
+
+ ;; Hide the menu bar
+ (menu-bar-mode -1)
+
+ ;; Hide the scroll bar
+ (scroll-bar-mode -1)
+
+ ;; Highlight the current line
+ (global-hl-line-mode 1)
+
+ ;; Enable line numbers
+ (global-display-line-numbers-mode)
+ (setq display-line-numbers-type 'relative)
+
+ ;; Disable line numbers for certain modes
+ (add-hook 'eshell-mode-hook (lambda () (display-line-numbers-mode -1)))
+
+ ;; Show the column number
+ (setq column-number-mode t)
+
+ ;; Add e as an alias for find-file. Useful for eshell.
+ (defalias 'e (function find-file))
+
+ ;; Eshell visual commands
+ (setq eshell-visual-subcommands '(("guix" "search")
+ ("pipe-viewer")
+ ("keepassxc-cli" "open")))
+
+ ;; Open init file
+ (defun open-init-file ()
+ "Open the init file."
+ (interactive)
+ (find-file "~/.config/guix-home/home-configuration.scm"))
+
+ (global-set-key (kbd "C-x i") 'open-init-file)
+
+ ;; Function to create a new eshell. Used for Sway binding.
+ (defvar next-eshell -1)
+ (defun new-eshell ()
+ (setq next-eshell (+ 1 next-eshell))
+ (eshell next-eshell))
+
+ ;; Power
+ (defun eshell/poweroff ()
+ "Shutdown the computer."
+ (call-process "loginctl" null-device nil nil "poweroff"))
+
+ (defun eshell/reboot ()
+ "Reboot the computer."
+ (call-process "loginctl" null-device nil nil "reboot"))
+
+ ;; For using tramp guix->guix
+ (require 'tramp)
+ ;; (setq tramp-remote-path
+ ;; (append tramp-remote-path
+ ;; '(tramp-own-remote-path)))
+
+ ;; Scheme extra file extensions
+ (setq auto-mode-alist (append '(("\\.sld\\'" . scheme-mode)) auto-mode-alist))
+
+ ;; Code folding
+ ;; (require 'origami)
+ ;; Add mode hooks
+ ;; (dolist (mode '(nxml-mode-hook csharp-mode-hook c-mode-hook scheme-mode-hook emacs-lisp-mode-hook))
+ ;; (add-hook mode 'origami-mode))
+ ;; Specify extra parsers
+ ;; (dolist (parser-pair '((scheme-mode . origami-elisp-parser) (csharp-mode . origami-c-style-parser)))
+ ;; (add-to-list 'origami-parser-alist parser-pair))
+ ;; (define-key origami-mode-map (kbd "<C-tab>") 'origami-recursively-toggle-node)
+
+ ;;; Org mode config
+ (require 'org-download)
+ (setq org-startup-with-inline-images t)
+ (add-hook 'org-mode-hook 'org-indent-mode)
+ (add-hook 'org-mode-hook 'toc-org-mode)
+
+ ;; Org bullets
+ (require 'org-bullets)
+ (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
+
+ ;; Org babel language support
+ (org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (eshell . t)
+ (C . t)
+ (scheme . t)))
+
+ ;; Org link abbreviations
+ (setq org-link-abbrev-alist
+ '(("wikipedia" . "https://en.wikipedia.org/wiki/")
+ ("wiki" . "https://wiki.zambito.xyz/index.php?title=")
+ ("gh" . "https://github.com/")
+ ("guix" . "elisp:(guix-packages-by-name \"%s\")")
+ ("isbn" . "https://www.bookfinder.com/isbn/")
+ ("man" . "elisp:(man \"%s\")")))
+
+ ;; Org roam
+ (require 'org-roam)
+ (setq org-roam-directory "~/org"
+ org-roam-capture-templates '(("d" "default" plain
+ "%?"
+ :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}")
+ :unnarrowed t)
+ ("p" "person" plain
+ (file "~/org/templates/person.org")
+ :target (file "%<%Y%m%d%H%M%S>-${slug}.org")
+ :unnarrowed t)
+ ("b" "book" plain
+ (file "~/org/templates/book.org")
+ :target (file "%<%Y%m%d%H%M%S>-${slug}.org")
+ :unnarrowed t))
+ org-roam-dailies-capture-templates '(("d" "default" entry "* %?"
+ :target (file+head "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"))
+ ("v" "Value" entry "* %?"
+ :target (file+head+olp "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"
+ ("What do I value?")))
+ ("t" "Trajectory" entry "* %?"
+ :target (file+head+olp "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"
+ ("What is my trajectory today?")))))
+ (add-to-list 'org-roam-file-exclude-regexp "par/")
+ (org-roam-db-autosync-enable)
+ (global-set-key (kbd "C-c n i") 'org-roam-node-insert)
+ (global-set-key (kbd "C-c n f") 'org-roam-node-find)
+ (global-set-key (kbd "C-c n r") 'org-roam-node-random)
+ (global-set-key (kbd "C-c n t") 'org-roam-buffer-toggle)
+ (global-set-key (kbd "C-c d c t") 'org-roam-dailies-capture-today)
+ (global-set-key (kbd "C-c d c n") 'org-roam-dailies-capture-tomorrow)
+ (global-set-key (kbd "C-c d c p") 'org-roam-dailies-capture-yesterday)
+ (global-set-key (kbd "C-c d c d") 'org-roam-dailies-capture-date)
+ (global-set-key (kbd "C-c d f t") 'org-roam-dailies-goto-today)
+ (global-set-key (kbd "C-c d f n") 'org-roam-dailies-goto-next-note)
+ (global-set-key (kbd "C-c d f p") 'org-roam-dailies-goto-previous-note)
+ (global-set-key (kbd "C-c d f d") 'org-roam-dailies-goto-date)
+
+ (add-to-list 'load-path "~/src/org-roam-ui/")
+ (require 'org-roam-ui)
+ (setq org-roam-ui-sync-theme t
+ org-roam-ui-follow t
+ org-roam-ui-update-on-save t
+ org-roam-ui-open-on-start nil)
+ (org-roam-ui-mode 1)
+
+ ;; Emojify
+ (global-emojify-mode 1)
+
+ ;; ERC
+ ;; See: https://gist.github.com/chumpage/1243771
+ (require 'erc-services)
+ (erc-services-mode 1)
+
+ (setq erc-server "irc.libera.chat"
+ erc-nick "Zambyte"
+ erc-port 6697
+ erc-prompt-for-nickserv-passwork nil
+ erc-prompt-for-passwork t
+ erc-nickserv-passwords (list (list 'Libera.Chat (list (cons "Zambyte" (cdr (assoc 'libera secrets))))))
+ erc-autojoin-channels-alist '((Libera.Chat "#archlinux"
+ "#c"
+ "#emacs"
+ "#fsf"
+ "#gnu"
+ "#guile"
+ "#guix"
+ "#hurd"
+ "#lisp"
+ "#mastodon"
+ "#pleroma"
+ "#pleroma-dev"
+ "#scheme"
+ "#sway"
+ "#minetest"
+ "#lojban"
+ "#ckule"
+ "#jbosnu"
+ "#proga"
+ "#lowellmakes")))
+
+ ;; Email
+ (require 'mu4e)
+ (setq mu4e-get-mail-command "SSL_CERT_DIR=/home/robby/.guix-profile/etc/ssl/certs mbsync personal")
+ (setq user-full-name "Robby Zambito"
+ user-mail-address "contact@robbyzambito.me"
+ send-mail-function (function smtpmail-send-it)
+ smtpmail-smtp-server "mail.gandi.net"
+ smtpmail-stream-type 'starttls
+ smtpmail-smtp-service 587)
+ (global-set-key (kbd "C-x C-m") 'mu4e)
+
+ ;; Music
+ (emms-all)
+ (setq emms-player-list '(emms-player-mpv)
+ emms-info-functions '(emms-info-native)
+ ;; emms-player-mpv-parameters '("--ao=pipewire")
+ )
+
+ ;; RSS
+ (require 'elfeed)
+ (require 'elfeed-show)
+ (require 'elfeed-org)
+ (elfeed-org)
+ (setq rmh-elfeed-org-files (list "~/org/20230517231456-elfeed.org")
+ elfeed-search-filter "@6-months-ago +unread -reddit -hn -politics")
+
+ ;; TODO: this doesn't work
+ (add-hook 'elfeed-mode-hook
+ (lambda ()
+ (define-key elfeed-mode-map "\\C-c\\C-u"
+ 'elfeed-update)))
+
+ ;; Source https://github.com/skeeto/elfeed/issues/267
+ (defun elfeed-play-with-mpv ()
+ "Play entry link with mpv."
+ (interactive)
+ (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single)))
+ (quality-arg "")
+ (quality-val (completing-read "Max height resolution (0 for unlimited): " '("0" "480" "720") nil nil)))
+ (setq quality-val (string-to-number quality-val))
+ (message "Opening %s with height≤%s with mpv..." (elfeed-entry-link entry) quality-val)
+ (when (< 0 quality-val)
+ (setq quality-arg (format "--ytdl-format=[height<=?%s]" quality-val)))
+ (start-process "elfeed-mpv" nil "mpv" quality-arg (elfeed-entry-link entry))))
+
+ (defun elfeed-open-with-eww ()
+ "Open in eww with `eww-readable'."
+ (interactive)
+ (let ((entry (if (eq major-mode 'elfeed-show-mode) elfeed-show-entry (elfeed-search-selected :single))))
+ (eww (elfeed-entry-link entry))
+ (add-hook 'eww-after-render-hook 'eww-readable nil t)))
+
+ (defvar elfeed-visit-patterns
+ '(("youtu\\.?be" . elfeed-play-with-mpv)
+ ("v\\.redd\\.it" . elfeed-play-with-mpv)
+ ("reddit" . elfeed-play-with-mpv)
+ ("phoronix" . elfeed-open-with-eww)
+ ("jcs\\.org" . elfeed-play-with-mpv))
+ "List of (regexps . function) to match against elfeed entry link to know
+whether how to visit the link.")
+
+ (defun elfeed-visit-maybe-external ()
+ "Visit with external function if entry link matches `elfeed-visit-patterns',
+visit otherwise."
+ (interactive)
+ (let ((entry (if (eq major-mode 'elfeed-show-mode)
+ elfeed-show-entry
+ (elfeed-search-selected :single)))
+ (patterns elfeed-visit-patterns))
+ (while (and patterns (not (string-match (caar patterns) (elfeed-entry-link entry))))
+ (setq patterns (cdr patterns)))
+ (cond
+ (patterns
+ (elfeed-untag entry 'unread)
+ (elfeed-search-update-entry entry)
+ (funcall (cdar patterns)))
+ ((eq major-mode 'elfeed-search-mode)
+ (call-interactively 'elfeed-search-show-entry))
+ (t (elfeed-show-visit)))))
+
+ ;; https://github.com/skeeto/elfeed/issues/317 and
+ ;; https://github.com/skeeto/elfeed/pull/448#issuecomment-1120336279
+ ;; Speeds up getting elfeed feeds
+ (setq flycheck-global-modes '(not . (elfeed-search-mode)))
+
+ (define-key elfeed-show-mode-map (kbd "<C-return>") 'elfeed-visit-maybe-external)
+ (define-key elfeed-search-mode-map (kbd "<C-return>") 'elfeed-visit-maybe-external)
+ (global-set-key (kbd "C-x w") 'elfeed)
+
+ ;; Pleroma
+ (add-to-list 'load-path "/home/robby/src/mastodon.el/lisp/")
+ (require 'mastodon)
+ (setq mastodon-instance-url "https://zoinks.one"
+ mastodon-active-user "robby")
+
+ ;; Programming
+
+ ;; https://www.youtube.com/watch?v=Vx0bSKF4y78
+ ;; https://github.com/minad/corfu
+ ;; (require 'corfu)
+ ;; (setq corfu-cycle t
+ ;; corfu-auto t
+ ;; corfu-auto-delay 0
+ ;; corfu-quit-no-match 'separator
+ ;; corfu-echo-documentation 0.25
+ ;; corfu-preselect-first nil)
+ ;; (global-corfu-mode)
+ ;; (corfu-history-mode)
+
+ ;; ;; https://github.com/minad/cape
+ ;; (require 'cape)
+ ;; (add-to-list 'completion-at-point-functions (function cape-dabbrev))
+ ;; (add-to-list 'completion-at-point-functions (function cape-file))
+
+ ;; (("C-c p p" . completion-at-point) ;; capf
+ ;; ("C-c p t" . complete-tag) ;; etags
+ ;; ("C-c p d" . cape-dabbrev) ;; or dabbrev-completion
+ ;; ("C-c p h" . cape-history)
+ ;; ("C-c p f" . cape-file)
+ ;; ("C-c p k" . cape-keyword)
+ ;; ("C-c p s" . cape-symbol)
+ ;; ("C-c p a" . cape-abbrev)
+ ;; ("C-c p i" . cape-ispell)
+ ;; ("C-c p l" . cape-line)
+ ;; ("C-c p w" . cape-dict)
+ ;; ("C-c p \\" . cape-tex)
+ ;; ("C-c p _" . cape-tex)
+ ;; ("C-c p ^" . cape-tex)
+ ;; ("C-c p &" . cape-sgml)
+ ;; ("C-c p r" . cape-rfc1345))
+
+ ;; (require 'gptel)
+ ;; (setq gptel-default-mode 'org-mode)
+ ;; (setq gptel-default-mode 'text-mode) ; I cannot use org-mode, as there is a bug: https://github.com/karthink/gptel/issues/81
+ ;; (define-key gptel-mode-map (kbd "C-c RET") 'gptel-send)
+ ;; (define-key gptel-mode-map (kbd "C-c C-<return>") 'gptel-send)
+ ;; (define-key gptel-mode-map (kbd "C-c C-m") 'gptel-menu)
+
+ ))))
+
+(define screenshot-menu "guile --r7rs -L ~/src/wofi-guile/lib/ ~/src/screenshot-menu.scm")
+
+(define rz/sway-config
+ (scm->sway-config
+ ;;; Variables
+ `((set $mod Mod4 ; Logo key. Use Mod1 for Alt.
+ $hyper Mod1+Mod4+Shift+Control
+ $meh Mod1+Shift+Control
+
+ ;; Home row directions keys, like vim.
+ $left h
+ $down j
+ $up k
+ $right l
+
+ ;; Prefered terminal emulator
+ $term ,rz/terminal-emulator
+
+ ;; Preferred editor
+ $editor "emacsclient -c -a emacs"
+
+ ;; Preferred application launcher
+ $menu "wofi -c ~/.config/wofi/config -I"
+
+ ;; Preferred music player
+ $music ,(string-append rz/terminal-emulator " cmus"))
+
+
+ ;; Output configuration
+ (output ((* bg "#2E3440" solid_color)
+ (HDMI-A-1 mode 1920x1080@144Hz)))
+
+ ;; Input configuration
+ ;; (input "9580:110:HUION_Huion_Tablet_Pen" map_to_output HDMI-A-1)
+
+ ;; Hide cursor after 3 seconds
+ (seat * hide_cursor 3000)
+
+ (input "1133:50504:Logitech_USB_Receiver_Mouse"
+ ((accel_profile flat)
+ (pointer_accel -0.4)))
+
+;;; Key bindings
+ (bindsyms
+ ;; Kill focused window
+ (($mod+Shift+q $meh+q) kill)
+ ;; Start launcher
+ (($hyper+d $mod+d) exec $menu)
+ ;; Reload the config file
+ ($mod+Shift+c reload)
+ ;; Lock sway
+ (($meh+l $mod+Semicolon) exec swaylock -c "#000000")
+ ;; Exit sway
+ ($mod+Shift+e exec swaynag -t warning -m "You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session." -b "Yes, exit sway" "herd stop sway")
+ ;; Screenshot menu
+ ($meh+a exec ,screenshot-menu))
+
+ ;; Drag floating windows by holding down $mod and left mouse button.
+ ;; Resize them with right mouse button + $mod.
+ ;; Also works for non-floating windows.
+ ;; Change normal to inverse to use left mouse buttor for resizing and right
+ ;; mouse button for dragging.
+ (floating_modifier $mod normal)
+
+ ;; Moving around
+ (bindsyms
+ ;; Moving focus around
+ (($mod+$left $mod+Left) focus left)
+ (($mod+$down $mod+Down) focus down)
+ (($mod+$up $mod+Up) focus up)
+ (($mod+$right $mod+Right) focus right)
+
+ ;; Move the focused window by adding Shift
+ (($mod+Shift+$left $mod+Shift+Left) move left)
+ (($mod+Shift+$down $mod+Shift+Down) move down)
+ (($mod+Shift+$up $mod+Shift+Up) move up)
+ (($mod+Shift+$right $mod+Shift+Right) move right))
+
+ ;; Workspaces
+ (bindsyms
+ ;; Switch to workspace
+ ($mod+1 workspace number 1)
+ ($mod+2 workspace number 2)
+ ($mod+3 workspace number 3)
+ ($mod+4 workspace number 4)
+ ($mod+5 workspace number 5)
+ ($mod+6 workspace number 6)
+ ($mod+7 workspace number 7)
+ ($mod+8 workspace number 8)
+ ($mod+9 workspace number 9)
+ ($mod+0 workspace number 10)
+
+ ;; Move focused container to workspace
+ ($mod+Shift+1 move container to workspace number 1)
+ ($mod+Shift+2 move container to workspace number 2)
+ ($mod+Shift+3 move container to workspace number 3)
+ ($mod+Shift+4 move container to workspace number 4)
+ ($mod+Shift+5 move container to workspace number 5)
+ ($mod+Shift+6 move container to workspace number 6)
+ ($mod+Shift+7 move container to workspace number 7)
+ ($mod+Shift+8 move container to workspace number 8)
+ ($mod+Shift+9 move container to workspace number 9)
+ ($mod+Shift+0 move container to workspace number 10)
+
+ ;; Split the current object
+ ($mod+b splith)
+ ($mod+v splitv)
+
+ ;; Switch the current container layout style
+ ($mod+s layout stacking)
+ ($mod+w layout tabbed)
+ ($mod+e layout toggle split)
+
+ ;; Make the current focus fullscreen
+ ($mod+f fullscreen)
+
+ ;; Toggle focus between tiling and floating mode
+ ($mod+Shift+space floating toggle)
+
+ ;; Swap focus between the tiling area and the floating area
+ ($mod+space focus mode_toggle)
+
+ ;; Move focus to the parent container
+ ($mod+a focus parent))
+
+ ;;; Scratchpad
+ (bindsyms
+ ;; Move the currently focused window to the scratchpad
+ ($mod+Shift+minus move scratchpad)
+ ;; Show the next scratchpad window or hide the focused scratchpad window.
+ ;; If there are multiple scratchpad windows, this command cycles through them.
+ ($mod+minus scratchpad show))
+
+ ;;; Resizing
+ (mode "resize"
+ ((bindsyms
+ (($left Left) resize shrink width 10px)
+ (($down Down) resize grow height 10px)
+ (($up Up) resize shrink height 10px)
+ (($right Right) resize grow width 10px)
+
+ ;; Return to default mode
+ (Return mode "default")
+ (Escape mode "default"))))
+ (bindsym $mod+r mode "resize")
+
+ ;;; Media
+ (bindsyms
+ (XF86AudioRaiseVolume exec pamixer --increase 5)
+ (XF86AudioLowerVolume exec pamixer --decrease 5)
+ (XF86AudioMute exec pamixer --toggle-mute)
+ (XF86AudioPlay exec emacsclient -e "(emms-pause)")
+ (XF86AudioNext exec emacsclient -e "(emms-next)")
+ (XF86AudioPrev exec emacsclient -e "(emms-previous)")
+ (XF86Search exec $menu))
+
+ ;; Applications
+ (bindsyms
+ ;; Start music player on workspace 5
+ ($hyper+m (workspace 5) (exec $music) (workspace back_and_forth))
+ ;; Start terminal
+ (($mod+Return $mod+Shift+t) exec emacsclient -c -e "(new-eshell)")
+ ;; Start editor
+ (($mod+t $hyper+t) exec $editor))
+
+ (exec "hash dbus-update-activation-environment 2>/dev/null")
+ (exec "dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP")
+
+ ;;; Styling
+
+ (font "pango:Noto Sans Mono" 8)
+ (titlebar_padding 7 1)
+
+ ;; Remove titlebar by default
+ (for-window (title ".*") border pixel 2)
+
+ ;; Class border backgr. text indicator child_border
+ (client.focused "#bf616a" "#bf616a" "#ffffff" "#bf616a" "#bf616a")
+ (client.focused_inactive "#333333" "#5f676a" "#ffffff" "#484e50" "#5f676a")
+ (client.unfocused "#333333" "#222222" "#888888" "#292d2e" "#222222")
+ (client.urgent "#2f343a" "#900000" "#ffffff" "#900000" "#900000")
+ (client.placeholder "#000000" "#0c0c0c" "#ffffff" "#000000" "#0c0c0c"))))
+
+(define foot-config
+ (with-output-to-string
+ (lambda ()
+ (scm->ini
+ '((#f
+ ("font" . "monospace:size=12"))
+
+ ;; Nord theme
+ (colors
+ ("background" . "2e3440")
+ ("foreground" . "d8dee9")
+ ("cursor" . "2e3440 d8dee9")
+
+ ("regular0" . "3b4252")
+ ("regular1" . "bf616a")
+ ("regular2" . "a3be8c")
+ ("regular3" . "ebcb8b")
+ ("regular4" . "81a1c1")
+ ("regular5" . "b48ead")
+ ("regular6" . "88c0d0")
+ ("regular7" . "e5e9f0")
+
+ ("bright0" . "4c566a")
+ ("bright1" . "bf616a")
+ ("bright2" . "a3be8c")
+ ("bright3" . "ebcb8b")
+ ("bright4" . "81a1c1")
+ ("bright5" . "b48ead")
+ ("bright6" . "8fbcbb")
+ ("bright7" . "eceff4")
+
+ ("dim0" . "373e4d")
+ ("dim1" . "94545d")
+ ("dim2" . "809575")
+ ("dim3" . "b29e75")
+ ("dim4" . "68809a")
+ ("dim5" . "8c738c")
+ ("dim6" . "6d96a5")
+ ("dim7" . "aeb3bb")))))))
+
+(define wofi-config
+ (with-extensions
+ (list guile-ini guile-smc guile-lib)
+ #~(begin
+ (import (ini))
+ (with-output-to-file #$output
+ (lambda ()
+ (scm->ini
+ '((#f
+ ("stylesheet" . #$(local-file "wofi/style.css"))
+ ("xoffset" . 0)
+ ("yoffset" . 0)
+ ("hide_scroll" . "true")
+ ("show" . "drun")
+ ("width" . "600px")
+ ("lines" . 10)
+ ("line_wrap" . "word")
+ ("term" . #$rz/terminal-emulator)
+ ("allow_markup" . "true")
+ ("always_parse_args" . "true")
+ ("show_all" . "true")
+ ("print_command" . "true")
+ ("layer" . "overlay")
+ ("allow_images" . "true")
+ ("insensitivity" . "true")
+ ("prompt" . "Hey, you should type something!")
+ ("image_size" . 25)
+ ("display_generic" . "true")
+ ("key_expand" . "Tab")))))))))
+
+(define git-config
+ (with-output-to-string
+ (lambda ()
+ (scm->ini
+ `((init
+ ("defaultBranch" . "master"))
+ (core
+ ("editor" . "emacsclient -c"))
+ (user
+ ("email" . "contact@robbyzambito.me")
+ ("name" . "Robby Zambito"))
+ ;; see push.autoSetupRemote in git help config
+ (push
+ ("autoSetupRemote" . "true"))
+ ("url \"rad://\""
+ ("insteadOf" . "https://rad.go/")))))))
+
+(define guix-gaming-config (cdr (assq 'guix-gaming-config secrets)))
+
+(define rz/user-dirs
+ (string-append "XDG_DESKTOP_DIR=\"$HOME/desktop\"\n"
+ "XDG_DOWNLOAD_DIR=\"$HOME/downloads\"\n"
+ "XDG_TEMPLATES_DIR=\"$HOME/templates\"\n"
+ "XDG_PUBLICSHARE_DIR=\"$HOME/public\"\n"
+ "XDG_DOCUMENTS_DIR=\"$HOME/documents\"\n"
+ "XDG_MUSIC_DIR=\"$HOME/music\"\n"
+ "XDG_PICTURES_DIR=\"$HOME/pictures\"\n"
+ "XDG_VIDEOS_DIR=\"$HOME/videos\"\n"))
+
+(define log-dir (or (getenv "XDG_LOG_HOME") "/home/robby/.local/var/log"))
+
+(define (generate-openssh-hosts num-vces num-vms-per-vce)
+ ;; Generate all VCE numbers from 1 to num-vces
+ (let ((vce-numbers (iota num-vces 1))
+ (vm-numbers (iota num-vms-per-vce 1)))
+ ;; For each VCE, generate configurations for all VMs
+ (append-map
+ (lambda (vce-num)
+ ;; For each VM number, create a configuration
+ (map
+ (lambda (vm-num)
+ (openssh-host (name (string-append "rt-vce" (number->string vce-num)
+ "-kali" (number->string vm-num)))
+ (user "redteam")
+ (host-name (string-append "172.18.6." (number->string (+ 60 vm-num))))
+ (identity-file "/home/robby/.ssh/redteam_key")
+ (proxy (list
+ (proxy-jump (host-name (string-append "vce" (number->string vce-num))))))
+ (extra-content
+ (string-append " DynamicForward 8888\n"
+ " StrictHostKeyChecking no\n"
+ " UserKnownHostsFile=/dev/null"))))
+ vm-numbers))
+ vce-numbers)))
+
+(define redteam-kali-vms (generate-openssh-hosts 2 10))
+
+(home-environment
+ ;; Below is the list of packages that will show up in your
+ ;; Home profile, under ~/.guix-home/profile.
+ (packages home-packages)
+
+ ;; Below is the list of Home services. To search for available
+ ;; services, run 'guix home search KEYWORD' in a terminal.
+ (services
+ (list (service home-bash-service-type
+ (home-bash-configuration
+ (aliases '(("grep" . "grep --color=auto")
+ ("ll" . "ls -l")
+ ("ls" . "ls -p --color=auto")
+ ("cp" . "cp --preserve=timestamps")
+ ("reboot" . "loginctl reboot")
+ ("poweroff" . "loginctl poweroff")
+ ("hibernate" . "loginctl hibernate")
+ ("p1" . "ping 1.1.1.1")
+ ("p8" . "ping 8.8.8.8")))
+ (bashrc (list (local-file "home.bashrc"
+ "bashrc")))
+ (bash-profile (list (local-file
+ "home.bash_profile"
+ "bash_profile")))))
+ (service home-dbus-service-type)
+ (service home-xdg-configuration-files-service-type
+ `(("user-dirs.dirs" ,(plain-file "user-dirs" rz/user-dirs))
+ ("sway/config" ,(plain-file "sway-config" rz/sway-config))
+ ("emacs/init.el" ,(plain-file "init.el" emacs-config))
+ ("foot/foot.ini" ,(plain-file "foot.ini" foot-config))
+ ("wofi/config" ,(computed-file "wofi-config" wofi-config))
+ ("git/config" ,(plain-file "git-config" git-config))
+ ("guix-gaming-channels/games.scm" ,(plain-file "guix-gaming-config" guix-gaming-config))))
+ (service home-files-service-type
+ `((".mbsyncrc" ,(local-file "mbsyncrc"))
+ (".nmprc" ,(plain-file "npmrc" "prefix=/home/robby/.vnode"))))
+ (service home-shepherd-service-type
+ (home-shepherd-configuration
+ (services
+ (list
+ (shepherd-service
+ (documentation "SwayWM")
+ (provision '(sway))
+ (requirement '(dbus))
+ (respawn? #f)
+ (auto-start? #f)
+ (start #~(make-forkexec-constructor
+ (list #$(file-append (specification->package "dbus") "/bin/dbus-run-session") "sway")
+ #:log-file (string-append #$log-dir "/swaywm.log")))
+ (stop #~(make-system-destructor
+ (string-join (list #$(file-append (specification->package "sway") "/bin/swaymsg")
+ "exit")))))
+ (shepherd-service
+ (documentation "Emacs Server")
+ (provision '(emacs))
+ (start #~(make-system-constructor "emacs --daemon"))
+ (stop #~(make-system-destructor "emacsclient --eval \"(kill-emacs)\"")))
+ ;(shepherd-service
+ ;(documentation "Run `syncthing' without calling the browser")
+ ;(provision '(syncthing))
+ ;(start #~(make-forkexec-constructor
+ ;(list #$(file-append (specification->package "syncthing") "/bin/syncthing")
+ ;"-no-browser")
+ ;#:log-file (string-append #$log-dir "/syncthing.log")))
+ ;(stop #~(make-kill-destructor))
+ ;(respawn? #t))
+ (shepherd-service
+ (documentation "Run a Radicle node")
+ (provision '(rad))
+ (start #~(make-forkexec-constructor
+ (list "/home/robby/.cargo/bin/rad" "node" "start" "--path" "/home/robby/.cargo/bin/radicle-node" "--foreground")
+ #:log-file (string-append #$log-dir "/rad-node.log")))
+ (stop #~(make-system-destructor "/home/robby/.cargo/bin/rad node stop"))
+ (respawn? #t))
+ (shepherd-service
+ (documentation "Run the Radicle web API")
+ (provision '(rad-web))
+ (start #~(make-forkexec-constructor
+ (list "/home/robby/.cargo/bin/rad-web" "--no-open")
+ #:log-file (string-append #$log-dir "/rad-web.log")))
+ (stop #~(make-kill-destructor))
+ (respawn? #t))))))
+ (service home-pipewire-service-type)
+ (simple-service 'some-useful-env-vars-service
+ home-environment-variables-service-type
+ `(("LESSHISTFILE" . "$XDG_CACHE_HOME/.lesshst")
+ ("XDG_DATA_DIRS" . "$XDG_DATA_DIRS:/var/lib/flatpak/exports/share:/home/robby/.local/share/flatpak/exports/share")
+ ("EDITOR" . "emacsclient -n -a emacs")
+ ("EMACSLOADPATH" . "$HOME/.guix-home/profile/share/emacs/site-lisp/")))
+ (service home-openssh-service-type
+ (home-openssh-configuration
+ (hosts
+ (append (list (openssh-host (name "not-a-pi")
+ (host-name "10.69.0.1"))
+ (openssh-host (name "zoinks")
+ (host-name "zoinks.one"))
+ (openssh-host (name "lowell-makes")
+ (host-name "96.81.79.90")
+ (port 1122))
+ (openssh-host (name "lowell-makes-cameo2")
+ (host-name "cameo2")
+ (port 22)
+ (proxy (list
+ (proxy-jump (host-name "lowell-makes")))))
+ (openssh-host (name "lowell-makes-cameo")
+ (host-name "cameo")
+ (port 22)
+ (proxy (list
+ (proxy-jump (host-name "lowell-makes")))))
+ (openssh-host (name "lowell-makes-mogan")
+ (host-name "mogan")
+ (port 22)
+ (proxy (list
+ (proxy-jump (host-name "lowell-makes")))))
+ (openssh-host (name "bustelo")
+ (host-name "10.5.10.187")
+ (port 22)
+ (proxy (list
+ (proxy-jump (host-name "lowell-makes")))))
+ (openssh-host (name "moja")
+ (host-name "45.77.97.44"))
+ (openssh-host (name "babel")
+ (host-name "10.80.80.162"))
+ (openssh-host (name "alpha.apex")
+ (host-name "149.28.47.99"))
+ (openssh-host (name "vce1")
+ (host-name "vce1.ncaecybergames.org")
+ (user "rz")
+ (port 2210)
+ (extra-content
+ (string-append " DynamicForward 8888\n")))
+ (openssh-host (name "vce2")
+ (host-name "vce2.ncaecybergames.org")
+ (user "rz")
+ (port 2210)
+ (extra-content
+ (string-append " DynamicForward 8888\n"))))
+ redteam-kali-vms))
+ (authorized-keys (cdr (assq 'ssh-authorized-keys secrets)))))
+ (simple-service 'variant-packages-service
+ home-channels-service-type
+ (cons*
+ ;; (channel
+ ;; (name 'nonguix)
+ ;; (url "https://git.robbyzambito.me/mirror/nonguix.git")
+ ;; (branch "steam-no-pulse"))
+ (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.git")
+ ;; Enable signature verification:
+ (introduction
+ (make-channel-introduction
+ "c23d64f1b8cc086659f8781b27ab6c7314c5cca5"
+ (openpgp-fingerprint
+ "50F3 3E2E 5B0C 3D90 0424 ABE8 9BDC F497 A4BB CC7F"))))
+ (channel
+ (name 'guix)
+ (url "https://codeberg.org/guix/guix.git"))
+ '()
+ ;; %default-channels
+ )))))