summaryrefslogtreecommitdiffstats
path: root/src/jd/user.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/jd/user.scm')
-rw-r--r--src/jd/user.scm567
1 files changed, 567 insertions, 0 deletions
diff --git a/src/jd/user.scm b/src/jd/user.scm
new file mode 100644
index 0000000..2224712
--- /dev/null
+++ b/src/jd/user.scm
@@ -0,0 +1,567 @@
1(define-module (jd user)
2 #:use-module (gnu home services)
3 #:use-module (gnu home services shepherd)
4 #:use-module (gnu home-services ssh)
5 #:use-module (gnu home services xdg)
6 #:use-module (gnu packages)
7 #:use-module (gnu packages cups)
8 #:use-module (gnu packages emacs-xyz)
9 #:use-module (gnu packages gnome)
10 #:use-module (gnu packages gnupg)
11 #:use-module (gnu packages guile-xyz)
12 #:use-module (gnu services)
13 #:use-module (gnu services base)
14 #:use-module (gnu services cups)
15 #:use-module (gnu services desktop)
16 #:use-module (gnu services nix)
17 #:use-module (gnu system pam)
18
19 #:use-module (guix channels)
20 #:use-module (guix download)
21 #:use-module (guix gexp)
22 #:use-module (guix inferior)
23 #:use-module (guix packages)
24
25 #:use-module (jd features emacs-xyz)
26 #:use-module (jd features mail)
27 #:use-module (jd features networking)
28 #:use-module (jd features nextcloud)
29 #:use-module (jd features shepherd)
30 #:use-module (jd features state)
31 #:use-module (jd packages supernote)
32
33 #:use-module (nongnu packages linux)
34 #:use-module (nongnu system linux-initrd)
35
36 #:use-module (rde features)
37 #:use-module (rde packages)
38 #:use-module (rde packages aspell)
39
40 #:use-module (srfi srfi-1))
41
42
43(define-syntax-rule (use-rde-features-modules module ...)
44 (use-modules (rde features module) ...))
45
46(define-syntax-rule (use-rde-home-services-modules module ...)
47 (use-modules (rde home services module) ...))
48
49(use-rde-features-modules
50 android base bittorrent clojure containers
51 documentation emacs emacs-xyz finance fontutils
52 gnupg gtk guile image-viewers irc keyboard
53 libreoffice linux llm mail markup networking ocaml
54 password-utils presets security-token shells
55 shellutils sourcehut ssh system terminals tmux uml
56 version-control video virtualization web-browsers wm xdg python)
57
58(use-rde-home-services-modules i2p)
59
60(define* (mail-acc id user #:optional (type 'migadu))
61 "Make a simple mail-account with gmail type by default."
62 (mail-account
63 (id id)
64 (fqda user)
65 (type type)))
66
67(define* (mail-lst id fqda urls)
68 "Make a simple mailing-list."
69 (mailing-list
70 (id id)
71 (fqda fqda)
72 (config (l2md-repo
73 (name (symbol->string id))
74 (urls urls)))))
75
76(define-public %base-features
77 (list
78 (feature-backlight #:step 10)
79 (feature-networking* #:network-manager-vpn-plugins (list network-manager-openvpn)
80 #:mdns? #t)
81 (feature-base-services)
82 (feature-base-packages)
83 (feature-desktop-services)
84 (feature-shepherd-repl)
85 (feature-tex)
86 (feature-xdg
87 #:xdg-user-directories-configuration
88 (home-xdg-user-directories-configuration
89 (desktop "$HOME")
90 (templates "$HOME")
91 (download "$HOME/dl")
92 (publicshare "$HOME/sync")
93 (music "/data/jakub/music")
94 (videos "/data/jakub/videos")
95 (pictures "/data/jakub/pics")
96 (documents "/data/jakub/docs")
97 ))
98 (feature-pipewire)
99 (feature-shepherd)))
100
101(define-public %desktop-features
102 (list
103 (feature-sway-run-on-tty #:sway-tty-number 2)
104 (feature-gtk3 #:gtk-theme (make-theme "Adwaita-dark" gnome-themes-extra))
105 (feature-fonts #:default-font-size 14)
106 (feature-transmission #:auto-start? #f)
107 (feature-sway
108 #:extra-config
109 '((input type:touchpad
110 ((tap enabled)
111 (middle_emulation enabled)))
112 (workspace_layout tabbed)
113 (bindsym $mod+q layout tabbed)
114 (bindsym $mod+a layout stacking)
115 (bindsym $mod+z layout toggle split)
116 (default_border none)
117 (default_floating_border pixel 3)
118 ;; (default_border normal 3)
119 ;; (default_floating_border normal 3)
120 ;; (gaps inner 0)
121 (output * bg "#181818" solid_color)
122 (client.focused "#181818" "#383838" "#d8d8d8" "#7cafc2")
123 (client.focused_inactive "#181818" "#282828" "#b8b8b8" "#7cafc2")
124 (client.unfocused "#181818" "#282828" "#b8b8b8" "#7cafc2")
125 (client.urgent "#181818" "#ab4642" "#f8f8f8" "#181818")
126 (bindsym $mod+h focus left)
127 (bindsym $mod+j focus down)
128 (bindsym $mod+k focus up)
129 (bindsym $mod+l focus right)
130
131 (unbindsym --to-code $mod+Shift+l)
132 (bindsym --to-code $mod+Escape exec $lock)
133
134 (bindsym $mod+Shift+h move left)
135 (bindsym $mod+Shift+j move down)
136 (bindsym $mod+Shift+k move up)
137 (bindsym $mod+Shift+l move right)))
138 (feature-waybar
139 ;; #:base16-css base16-solarized-dark
140 #:waybar-modules
141 (list
142 (waybar-sway-workspaces
143 #:format-icons
144 `(,@(map
145 (lambda (x) (cons
146 (number->string x)
147 (number->string x)))
148 (iota 10 1))
149 ("urgent" . )
150 ("default" . )))
151 (waybar-idle-inhibitor)
152 (waybar-temperature)
153 (waybar-cpu)
154 (waybar-battery #:intense? #f)
155 (waybar-tray)
156 (waybar-clock)))
157 ;; (feature-nextcloud)
158 (feature-foot)
159 (feature-yt-dlp)
160 (feature-libreoffice)
161 (feature-emacs-power-menu)
162 (feature-sway-screenshot)
163 (feature-swaynotificationcenter)
164 (feature-swayidle)
165 (feature-swaylock)
166 (feature-batsignal)
167 (feature-imv)
168 (feature-librewolf)
169 (feature-librewolf
170 #:browser (@ (gnu packages gnuzilla) icecat)
171 #:default-browser? #f)
172 (feature-librewolf
173 #:browser (@ (nongnu packages mozilla) firefox)
174 #:default-browser? #f)
175 ;; (feature-ungoogled-chromium)
176 (feature-ledger)
177 (feature-mpv)))
178
179(define-public %mail-features
180 (list
181 (feature-isync #:isync-verbose #t)
182 (feature-mail-mcron)
183 (feature-l2md*)
184 (feature-msmtp)))
185
186(define-public %cli-features
187 (list
188 (feature-zsh #:enable-zsh-autosuggestions? #t)
189 (feature-git #:extra-config '((gpg ((program . "gpg")))))
190 (feature-manpages)
191 (feature-vterm)
192 (feature-bash)
193 (feature-direnv)
194 (feature-guile)
195 (feature-ssh)))
196
197(define* (feature-emacs-personal-config)
198 (define f-name 'personal-emacs-config)
199
200 (define (get-home-services config)
201 (list
202 (rde-elisp-configuration-service
203 f-name
204 config
205 `((with-eval-after-load 'notmuch
206 (setq-default notmuch-search-oldest-first nil))
207
208 (with-eval-after-load 'paredit
209 (defun jd/paredit-RET ()
210 "Wraps `paredit-RET' to provide a sensible minibuffer experience"
211 (interactive)
212 (cond
213 ((minibufferp)
214 (read--expression-try-read))
215 ((and (eq major-mode 'inferior-emacs-lisp-mode)
216 (string-prefix-p "*ielm*" (buffer-name)))
217 (ielm-return))
218 (t
219 (paredit-RET))))
220 (bind-key "<return>" 'jd/paredit-RET paredit-mode-map)
221
222 (dolist (hook '(emacs-lisp-mode-hook
223 eval-expression-minibuffer-setup-hook
224 ielm-mode-hook
225 lisp-mode-hook
226 lisp-interaction-mode-hook
227 scheme-mode-hook
228 clojure-mode-hook))
229 (add-hook hook 'paredit-mode)))
230
231 (with-eval-after-load 'rainbow-delimiters
232 (dolist (hook '(emacs-lisp-mode-hook
233 eval-expression-minibuffer-setup-hook
234 ielm-mode-hook
235 lisp-mode-hook
236 lisp-interaction-mode-hook
237 scheme-mode-hook
238 clojure-mode-hook))
239 (add-hook hook 'rainbow-delimiters-mode)))
240
241 (with-eval-after-load 'undo-tree
242 (setq-default undo-tree-auto-save-history nil)
243 (global-undo-tree-mode 1))
244
245 (with-eval-after-load 'multiple-cursors
246 (setq-default mc/always-run-for-all t)
247 (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
248 (global-set-key (kbd "C->") 'mc/mark-next-like-this)
249 (global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
250 (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this))
251
252 (with-eval-after-load 'page-break-lines
253 (global-page-break-lines-mode 1))
254
255 (with-eval-after-load 'gptel
256 (setq gptel-model 'gpt-4o
257 gptel-backend (gptel-make-gh-copilot "Copilot")))
258
259 (with-eval-after-load 'geiser-mode
260 (setq geiser-mode-auto-p nil))
261
262 (with-eval-after-load 'simple
263 (add-hook
264 'after-init-hook
265 (lambda ()
266 (delete-selection-mode 1)
267 (pixel-scroll-precision-mode 0)
268 (electric-pair-mode 1)
269 (setq-default truncate-lines t)
270 (setq-default cursor-in-non-selected-windows 'hollow)
271 (setq-default cursor-type 'box)
272 (require 'multiple-cursors)
273 (require 'undo-tree)
274 (require 'rainbow-delimiters)
275 (require 'paredit)
276 (require 'url)
277 (require 'json)
278 (require 'org)
279 (require 'org-pdftools)
280 (defalias 'getf 'cl-getf)
281 (defalias 'find-if 'cl-find-if)
282 (add-hook 'org-mode-hook 'org-pdftools-setup-link)))
283 (set-default 'display-fill-column-indicator-column 100)
284 (add-hook 'prog-mode-hook 'display-fill-column-indicator-mode)
285 (setq display-line-numbers-type 'relative)
286 (add-hook 'prog-mode-hook 'display-line-numbers-mode)))
287 #:elisp-packages
288 (strings->packages
289 "emacs-rainbow-mode"
290 "emacs-rainbow-delimiters"
291 "emacs-paredit"
292 "emacs-hl-todo"
293 "emacs-undo-tree"
294 "emacs-multiple-cursors"
295 "emacs-nginx-mode"
296 "emacs-yaml-mode"
297 "emacs-org-present"
298 "emacs-org-pdftools"
299 "emacs-org-pomodoro"))))
300 (feature
301 (name f-name)
302 (values `((,f-name . #t)))
303 (home-services-getter get-home-services)))
304
305(define-public %emacs-features
306 (list
307 (feature-emacs-modus-themes #:deuteranopia? #f)
308 (feature-emacs-citation #:global-bibliography (list "/data/jakub/notes/references/master.bib"))
309 (feature-emacs-completion #:mini-frame? #f ;; Dziwne kurwa bledy
310 #:marginalia-align 'right)
311 (feature-emacs-corfu #:corfu-doc-auto #f)
312 (feature-emacs #:default-application-launcher? #t)
313 (feature-emacs-elfeed #:elfeed-org-files '("/data/jakub/notes/rss.org"))
314 (feature-emacs-erc #:erc-log? #t
315 #:erc-autojoin-channels-alist '((Libera.Chat "#rde")
316 (Libera.Chat "#systemcrafters")
317 (Libera.Chat "#lisp-pl")
318 (Libera.Chat "#lispcafe")
319 (Libera.Chat "##metal")
320 (Libera.Chat "#hsp")
321 (Libera.Chat "#spritely")
322 (Libera.Chat "#guix")))
323 (feature-emacs-keycast #:turn-on? #f)
324 (feature-emacs-org-agenda #:org-agenda-files '("/data/jakub/notes/personal.org"
325 "/data/jakub/notes/s32526.org"))
326 (feature-emacs-org-uni)
327 (feature-emacs-org-dailies #:encrypted? #t)
328 (feature-emacs-org #:org-directory "/data/jakub/notes"
329 #:org-indent? #t)
330 (feature-emacs-org-roam #:org-roam-directory "/data/jakub/notes/slip-box")
331 (feature-emacs-spelling #:spelling-program (@ (gnu packages hunspell) hunspell)
332 #:spelling-dictionaries (list (@ (gnu packages hunspell) hunspell-dict-en)
333 (@ (gnu packages hunspell) hunspell-dict-pl))
334 #:ispell-standard-dictionary "pl_PL")
335 (feature-emacs-dired #:extra-switches "-h")
336 (feature-emacs-monocle #:olivetti-body-width 100)
337 (feature-emacs-denote #:denote-directory "/data/jakub/notes/denote")
338 (feature-emacs-devdocs)
339 (feature-emacs-appearance)
340 (feature-emacs-dashboard)
341 (feature-emacs-eglot)
342 (feature-emacs-eshell)
343 (feature-emacs-git)
344 (feature-emacs-gptel)
345 (feature-emacs-guix)
346 (feature-emacs-message)
347 (feature-emacs-nov-el)
348 (feature-emacs-pdf-tools)
349 (feature-emacs-personal-config)
350 (feature-emacs-project)
351 (feature-emacs-time)
352 (feature-emacs-tramp)
353 (feature-emacs-vertico)
354 (feature-emacs-webpaste)
355 (feature-emacs-which-key)
356 (feature-emacs-battery)
357 (feature-notmuch)
358 (feature-plantuml)
359 (feature-compile)))
360
361(define %dev-features
362 (list
363 (feature-markdown #:headings-scaling? #t)
364 (feature-android)
365 (feature-clojure)
366 (feature-python)
367 (feature-octave)))
368
369(define %virtualization-features
370 (list
371 (feature-distrobox)
372 (feature-podman)
373 (feature-qemu)))
374
375(define (feature-ssh-extra-config)
376 (feature-custom-services
377 #:feature-name-prefix 'jd-ssh-extra-config
378 #:home-services
379 (list
380 (simple-service
381 'ssh-extra-config
382 home-ssh-service-type
383 (home-ssh-extension
384 (extra-config
385 (append
386 (list
387 (ssh-host
388 (host "jdlugosz.com")
389 (options
390 '((user . "root")
391 (port . 22)
392 (compression . #t))))
393 (ssh-host
394 (host "git.jdlugosz.com")
395 (options
396 '((user . "git")
397 (port . 22)
398 (compression . #t))))
399 (ssh-host
400 (host "*.abaks.pl")
401 (options
402 '((user . "serwis")
403 (port . 22)
404 (compression . #t)))))))
405 (toplevel-options
406 '((host-key-algorithms . "+ssh-rsa")
407 (pubkey-accepted-key-types . "+ssh-rsa"))))))))
408
409(define (feature-additional-services)
410 (feature-custom-services
411 #:feature-name-prefix 'jd-additional-services
412 #:system-services
413 (list (service nix-service-type)
414 (service gnome-keyring-service-type)
415 (service pam-limits-service-type
416 (list
417 (pam-limits-entry "*" 'both 'nofile 100000) ;; Required for some cases when building Docker images in Nix
418 (pam-limits-entry "@users" 'both 'rtprio 99) ;; Needed for Guitarix
419 (pam-limits-entry "@users" 'both 'memlock 'unlimited)))
420 (service cups-service-type
421 (cups-configuration
422 (web-interface? #t)
423 (extensions
424 (list cups-filters)))))
425 #:home-services
426 (list
427 (simple-service
428 'home-environment-extra-variables
429 home-environment-variables-service-type
430 '(("XDG_DATA_DIRS" . "$XDG_DATA_DIRS:$HOME/.local/share/flatpak/exports/share")))
431
432 (simple-service
433 'i2pd-add-ilita-irc
434 home-i2pd-service-type
435 (home-i2pd-extension
436 (tunnels-conf
437 `((IRC-ILITA ((type . client)
438 (address . 127.0.0.1)
439 (port . 6669)
440 (destination . irc.ilita.i2p)
441 (destinationport . 6667)
442 (keys . ilita-keys.dat)))
443 (BETA-CRAFT ((type . client)
444 (address . 192.168.122.1)
445 (port . 25565)
446 (destination . jpkqfe5q5z74i4esbcqilwozv72gbrkm4bueibblm732egjlzy6a.b32.i2p )
447 (destinationport . 25565)
448 (gzip . false)
449 (inbound.length . 1)
450 (outbound.length . 1)
451 (inbound.quantity . 3)
452 (outbound.quantity . 3)
453 (i2cp.leaseSetType . 3)
454 (i2cp.leaseSetEncType . 4)
455 (keys . betacraft.dat)))))))
456
457 (simple-service
458 'home-profile-extra-packages
459 home-profile-service-type
460 (append
461 (list
462 (@ (gnu packages tree-sitter) tree-sitter-clojure)
463 (@ (gnu packages tree-sitter) tree-sitter-html))
464 (append
465 (list supernote-tool)
466 (strings->packages
467 "figlet"
468 "calibre"
469
470 "libnotify"
471
472 "flatpak" "wine64"
473
474 "alsa-utils"
475 "pavucontrol"
476 "imagemagick"
477 "obs" "obs-wlrobs"
478 "binutils" "make" "gdb"
479
480 "hicolor-icon-theme" "adwaita-icon-theme"
481 "gnome-themes-extra" "papirus-icon-theme"
482 "arc-theme"
483
484 "xdg-desktop-portal-gnome"
485
486 "kdenlive" "gimp"
487 "freecad"
488
489 "ripgrep" "curl"
490
491 "texlive" "texlive-collection-basic"
492 "texlive-bin" "texlive-collection-latex"
493 "texlive-collection-fontsrecommended"
494 "texlive-collection-pictures"
495 "texlive-collection-latexextra"
496 "texlive-dvipng")))))))
497
498
499(define-public (feature-nonfree-kernel)
500 (feature-kernel
501 #:kernel linux
502 #:firmware (list linux-firmware)
503 #:initrd microcode-initrd))
504
505(define-public %all-features
506 (append
507 %base-features
508 %cli-features
509 %desktop-features
510 %dev-features
511 %emacs-features
512 %mail-features
513 %virtualization-features))
514
515(define-public %user-features
516 (append
517 %all-features
518 (list
519 (feature-user-info
520 #:user-name "jakub"
521 #:full-name "Jakub Dlugosz"
522 #:email "me@jdlugosz.com"
523 #:user-initial-password-hash
524 "$6$C6xUaxw3xOpsPrBF$/nmP.SXpzoAYGu7CrcIMQ02S4f8QDNZTuAyaIZusmz4e3xXTdSYpt8D1WCaLXcAuhVJA5llPf9MH7L1TTlgG81"
525 #:emacs-advanced-user? #t)
526 (feature-gnupg
527 #:gpg-primary-key "83AD9E56AE266488CA2F2598BACE123052C9E77A")
528 (feature-security-token)
529 (feature-password-store
530 #:remote-password-store-url "git@jdlugosz.com:passwords")
531 (feature-state '((git "/data/jakub/notes" "git@jdlugosz.com:notes")))
532 (feature-mail-settings
533 #:mail-directory-fn (lambda (config)
534 (string-append (get-value 'home-directory config) "/.mail"))
535 #:mail-accounts (list
536 (mail-account
537 (id 'work)
538 (type 'migadu)
539 (fqda "jakub@jdlugosz.com")
540 (aliases '("admin@jdlugosz.com" "postmaster@jdlugosz.com"))
541 (pass-cmd "pass show mail/jakub@jdlugosz.com"))
542 (mail-account
543 (id 'personal)
544 (type 'migadu)
545 (fqda "me@jdlugosz.com")
546 (aliases '("signup.*@jdlugosz.com"))
547 (pass-cmd "pass show mail/me@jdlugosz.com")))
548 #:mailing-lists (list (mail-lst 'guile-devel "guile-devel@gnu.org"
549 '("https://yhetil.org/guile-devel/0"))
550 (mail-lst 'guix-devel "guix-devel@gnu.org"
551 '("https://yhetil.org/guix-devel/0"))
552 (mail-lst 'guix-bugs "guix-bugs@gnu.org"
553 '("https://yhetil.org/guix-bugs/0"))
554 (mail-lst 'guix-patches "guix-patches@gnu.org"
555 '("https://yhetil.org/guix-patches/1"))))
556 (feature-irc-settings #:irc-accounts (list
557 (irc-account
558 (id 'libera)
559 (network "irc.libera.chat")
560 (nick "jdlugosz963"))))
561 (feature-sourcehut
562 #:user-name-fn (const "jdlugosz"))
563 (feature-keyboard
564 #:keyboard-layout (keyboard-layout "pl"))
565 (feature-ssh-extra-config)
566 (feature-additional-services)
567 )