chore: added lsps and applied formatting eb51570e
Steve · 2026-10-12 07:39 3 file(s) · +206 −146
config.scm +94 −95
7 7
                     shells image-viewers)
8 8
9 9
(operating-system
10 -
  (host-name "benson")
11 -
  (timezone "America/New_York")
12 -
  (locale "en_US.utf8")
10 +
 (host-name "benson")
11 +
 (timezone "America/New_York")
12 +
 (locale "en_US.utf8")
13 13
14 -
  ;; Mainline kernel + firmware from nonguix; linux-libre can't load the
15 -
  ;; amdgpu blobs the Radeon 780M (Phoenix) needs.
16 -
  (kernel linux)
17 -
  (initrd microcode-initrd)
18 -
  (firmware (list amdgpu-firmware amd-microcode))
14 +
 ;; Mainline kernel + firmware from nonguix; linux-libre can't load the
15 +
 ;; amdgpu blobs the Radeon 780M (Phoenix) needs.
16 +
 (kernel linux)
17 +
 (initrd microcode-initrd)
18 +
 (firmware (list amdgpu-firmware amd-microcode))
19 19
20 -
  (bootloader (bootloader-configuration
21 -
                (bootloader grub-efi-bootloader)
22 -
                (targets '("/boot/efi"))))
20 +
 (bootloader (bootloader-configuration
21 +
              (bootloader grub-efi-bootloader)
22 +
              (targets '("/boot/efi"))))
23 23
24 -
  (file-systems (append
25 -
                 (list (file-system
26 -
                         (device "/dev/nvme0n1p3")
27 -
                         (mount-point "/")
28 -
                         (type "ext4"))
29 -
                       (file-system
30 -
                         (device "/dev/nvme0n1p1")
31 -
                         (mount-point "/boot/efi")
32 -
                         (type "vfat")))
33 -
                 %base-file-systems))
24 +
 (file-systems (append
25 +
                (list (file-system
26 +
                       (device "/dev/nvme0n1p3")
27 +
                       (mount-point "/")
28 +
                       (type "ext4"))
29 +
                      (file-system
30 +
                       (device "/dev/nvme0n1p1")
31 +
                       (mount-point "/boot/efi")
32 +
                       (type "vfat")))
33 +
                %base-file-systems))
34 34
35 -
  (swap-devices (list (swap-space
36 -
                        (target (uuid "10676fa5-e5a0-43b8-8316-e254ea56629e")))))
35 +
 (swap-devices (list (swap-space
36 +
                      (target (uuid "10676fa5-e5a0-43b8-8316-e254ea56629e")))))
37 37
38 -
  (users (cons (user-account
39 -
                (name "stevedylandev")
40 -
                (group "users")
41 -
                (shell (file-append zsh "/bin/zsh"))
42 -
                ;; "docker" lets you run docker without sudo
43 -
                (supplementary-groups '("wheel" "netdev" "audio" "video" "docker")))
44 -
               %base-user-accounts))
38 +
 (users (cons (user-account
39 +
               (name "stevedylandev")
40 +
               (group "users")
41 +
               (shell (file-append zsh "/bin/zsh"))
42 +
               ;; "docker" lets you run docker without sudo
43 +
               (supplementary-groups '("wheel" "netdev" "audio" "video" "docker")))
44 +
              %base-user-accounts))
45 45
46 -
  (packages (append (list
47 -
                     ;; window managers
48 -
                     qtile cwm rofi
49 -
                     ;; xorg stuff
50 -
                     xorg-server xinit xwallpaper xset xrandr feh
51 -
                     ;; text editor
52 -
                     vis emacs
53 -
                     ;; browser
54 -
                     icecat
55 -
                     ;; terminal emulator
56 -
                     alacritty kitty
57 -
                     ;; utils
58 -
                     git btop ncurses openssh rsync fastfetch
59 -
                     ;; dev
60 -
                     go
61 -
                     docker-cli
62 -
                     (specification->package "cloudflared")) ; from Rosenthal channel
63 -
                    %base-packages))
46 +
 (packages (append (list
47 +
                    ;; window managers
48 +
                    qtile cwm rofi
49 +
                    ;; xorg stuff
50 +
                    xorg-server xinit xwallpaper xset xrandr feh
51 +
                    ;; text editor
52 +
                    vis emacs
53 +
                    ;; browser
54 +
                    icecat
55 +
                    ;; terminal emulator
56 +
                    alacritty kitty
57 +
                    ;; utils
58 +
                    git btop ncurses openssh rsync fastfetch
59 +
                    ;; dev
60 +
                    go
61 +
                    docker-cli
62 +
                    (specification->package "cloudflared")) ; from Rosenthal channel
63 +
                   %base-packages))
64 64
65 -
  (services (append (list (service xorg-server-service-type)
66 -
                          (service slim-service-type)
67 -
                          (service dhcpcd-service-type)
68 -
                          ;; Docker and what its daemon depends on
69 -
                          (service dbus-root-service-type)
70 -
                          (service elogind-service-type)
71 -
                          (service containerd-service-type)
72 -
                          (service docker-service-type)
73 -
(extra-special-file "/lib64/ld-linux-x86-64.so.2"
74 -
                    (file-append glibc "/lib/ld-linux-x86-64.so.2"))
75 -
			(service tailscale-service-type)
76 -
(simple-service 'cloudflared shepherd-root-service-type
77 -
  (list (shepherd-service
78 -
          (provision '(cloudflared))
79 -
          (requirement '(networking))
80 -
          (documentation "Run the Cloudflare tunnel.")
81 -
          ;; 'networking' is up as soon as dhcpcd is spawned, before it has a
82 -
          ;; lease, so cloudflared can exit at boot. Wait between respawns so
83 -
          ;; it keeps retrying instead of hitting the respawn limit (5 in 7s)
84 -
          ;; and getting disabled.
85 -
          (respawn-delay 5)
86 -
          (start #~(make-forkexec-constructor
87 -
                    (list #$(file-append (specification->package "cloudflared")
88 -
                                         "/bin/cloudflared")
89 -
                          "tunnel" "--no-autoupdate" "run"
90 -
                          "--token-file" "/etc/cloudflared/token")
91 -
                    #:log-file "/var/log/cloudflared.log"))
92 -
          (stop #~(make-kill-destructor)))))
93 -
                          (service openssh-service-type
94 -
                                   (openssh-configuration
95 -
                                    (openssh openssh)
96 -
                                    (port-number 22)
97 -
                                    (permit-root-login #f)
98 -
                                    (password-authentication? #f)
99 -
                                    (authorized-keys
100 -
                                     `(("stevedylandev"
101 -
                                        ,(local-file "/home/stevedylandev/.ssh/authorized_keys")))))))
102 -
                    (modify-services %base-services
103 -
                      (guix-service-type
104 -
                       config => (guix-configuration
105 -
                                  (inherit config)
106 -
                                  (authorized-keys
107 -
                                   (cons (local-file "nonguix-signing-key.pub")
108 -
                                         %default-authorized-guix-keys))
109 -
                                  (substitute-urls
110 -
                                   (append (list "https://substitutes.nonguix.org")
111 -
                                           %default-substitute-urls))))))))
65 +
 (services (append (list (service xorg-server-service-type)
66 +
                         (service slim-service-type)
67 +
                         (service dhcpcd-service-type)
68 +
                         (service dbus-root-service-type)
69 +
                         (service elogind-service-type)
70 +
                         (service containerd-service-type)
71 +
                         (service docker-service-type)
72 +
                         (extra-special-file "/lib64/ld-linux-x86-64.so.2"
73 +
                                             (file-append glibc "/lib/ld-linux-x86-64.so.2"))
74 +
			                   (service tailscale-service-type)
75 +
                         (simple-service 'cloudflared shepherd-root-service-type
76 +
                                         (list (shepherd-service
77 +
                                                (provision '(cloudflared))
78 +
                                                (requirement '(networking))
79 +
                                                (documentation "Run the Cloudflare tunnel.")
80 +
                                                ;; 'networking' is up as soon as dhcpcd is spawned, before it has a
81 +
                                                ;; lease, so cloudflared can exit at boot. Wait between respawns so
82 +
                                                ;; it keeps retrying instead of hitting the respawn limit (5 in 7s)
83 +
                                                ;; and getting disabled.
84 +
                                                (respawn-delay 5)
85 +
                                                (start #~(make-forkexec-constructor
86 +
                                                          (list #$(file-append (specification->package "cloudflared")
87 +
                                                                               "/bin/cloudflared")
88 +
                                                                "tunnel" "--no-autoupdate" "run"
89 +
                                                                "--token-file" "/etc/cloudflared/token")
90 +
                                                          #:log-file "/var/log/cloudflared.log"))
91 +
                                                (stop #~(make-kill-destructor)))))
92 +
                         (service openssh-service-type
93 +
                                  (openssh-configuration
94 +
                                   (openssh openssh)
95 +
                                   (port-number 22)
96 +
                                   (permit-root-login #f)
97 +
                                   (password-authentication? #f)
98 +
                                   (authorized-keys
99 +
                                    `(("stevedylandev"
100 +
                                       ,(local-file "/home/stevedylandev/.ssh/authorized_keys")))))))
101 +
                   (modify-services %base-services
102 +
                                    (guix-service-type
103 +
                                     config => (guix-configuration
104 +
                                                (inherit config)
105 +
                                                (authorized-keys
106 +
                                                 (cons (local-file "nonguix-signing-key.pub")
107 +
                                                       %default-authorized-guix-keys))
108 +
                                                (substitute-urls
109 +
                                                 (append (list "https://substitutes.nonguix.org")
110 +
                                                         %default-substitute-urls))))))))
emacs/lisp/init-lang.el +66 −14
1 1
;;; init-lang.el -*- lexical-binding: t; -*-
2 2
3 -
;;; Syntax highlighting: tree-sitter (built-in)
4 -
;; Every built-in *-ts-mode replaces its classic mode, and the grammar is
5 -
;; compiled into ~/.config/emacs/tree-sitter the first time it's needed.
6 -
;; Needs a C compiler (xcode-select --install).
3 +
;;; Syntax highlighting: tree-sitter
7 4
(setopt treesit-enabled-modes t
8 5
        treesit-auto-install-grammar 'always
9 6
        treesit-font-lock-level 4)      ; 4 = everything (calls, properties, operators)
10 7
11 -
;;; LSP: eglot (built-in)
12 -
;; Add a language: one line here.  MODES is a ts-mode (or list of them),
13 -
;; SERVER is the command eglot runs.  Entries whose server binary isn't on
14 -
;; PATH are skipped, so it's fine to list servers you haven't installed.
15 -
;; A mode not built into Emacs needs its package first, e.g.
16 -
;;   (use-package zig-mode)  then  (zig-mode "zls")
8 +
;;; LSP: eglot
17 9
(defvar my/lsp-servers
18 10
  '(((typescript-ts-mode tsx-ts-mode js-ts-mode) "vtsls" "--stdio")
19 11
    (rust-ts-mode       "rust-analyzer")
20 12
    ((go-ts-mode go-mod-ts-mode) "gopls")
21 13
    ((c-ts-mode c++-ts-mode) "clangd")
22 14
    (lua-ts-mode        "lua-language-server")
23 -
    (css-ts-mode        "vscode-css-language-server" "--stdio")
15 +
    ;;(css-ts-mode        "vscode-css-language-server" "--stdio")
24 16
    ((mhtml-ts-mode html-ts-mode) "vscode-html-language-server" "--stdio")
25 17
    (json-ts-mode       "vscode-json-language-server" "--stdio")
26 -
    (python-ts-mode     "basedpyright-langserver" "--stdio")
27 -
    (bash-ts-mode       "bash-language-server" "start"))
18 +
    (python-ts-mode     "pylsp")
19 +
    (python-ts-mode     "basedpyright-langserver" "--stdio") ; wins if both installed
20 +
    (bash-ts-mode       "bash-language-server" "start")
21 +
    (scheme-mode        "guile-lsp-server"))
28 22
  "Alist of (MODES SERVER ARGS...) used to auto-start eglot.")
29 23
30 24
(use-package eglot
42 36
        (dolist (mode modes)
43 37
          (add-hook (intern (format "%s-hook" mode)) #'eglot-ensure))))))
44 38
39 +
;;; Indentation per language
40 +
(defvar my/indent-settings
41 +
  '(((typescript-ts-mode tsx-ts-mode) 2 nil typescript-ts-mode-indent-offset)
42 +
    (js-ts-mode                       2 nil js-indent-level)
43 +
    (rust-ts-mode                     4 nil rust-ts-mode-indent-offset)
44 +
    (go-ts-mode                       4 t   go-ts-mode-indent-offset)
45 +
    ((c-ts-mode c++-ts-mode)          4 nil c-ts-mode-indent-offset)
46 +
    (lua-ts-mode                      2 nil lua-ts-indent-offset)
47 +
    (css-ts-mode                      2 nil css-indent-offset)
48 +
    ((mhtml-ts-mode html-ts-mode)     2 nil html-ts-mode-indent-offset)
49 +
    (json-ts-mode                     2 nil json-ts-mode-indent-offset)
50 +
    (python-ts-mode                   4 nil python-indent-offset)
51 +
    (bash-ts-mode                     2 nil sh-basic-offset)
52 +
    ((emacs-lisp-mode scheme-mode)    2 nil nil))
53 +
  "List of (MODES WIDTH TABS OFFSET-VAR) applied in each mode's hook.")
54 +
55 +
(dolist (entry my/indent-settings)
56 +
  (pcase-let ((`(,modes ,width ,tabs ,var) entry))
57 +
    (dolist (mode (ensure-list modes))
58 +
      (add-hook (intern (format "%s-hook" mode))
59 +
                (lambda ()
60 +
                  (setq-local tab-width width
61 +
                              indent-tabs-mode tabs)
62 +
                  (when var (set (make-local-variable var) width)))))))
63 +
64 +
;;; Format on save
65 +
;; Uses eglot when the server can format, else re-indents lisp buffers.  Off for a
66 +
;; buffer with SPC c F, or per project via .dir-locals.el:
67 +
(defvar my/format-on-save t
68 +
  "Non-nil formats eglot-managed buffers before saving.")
69 +
(put 'my/format-on-save 'safe-local-variable #'booleanp)
70 +
71 +
(defvar my/reindent-modes '(emacs-lisp-mode scheme-mode)
72 +
  "Modes without an LSP formatter that format by re-indenting the buffer.")
73 +
74 +
(defun my/format-buffer ()
75 +
  "Format with eglot if the server can, else re-indent in `my/reindent-modes'."
76 +
  (interactive)
77 +
  (cond ((and (fboundp 'eglot-managed-p) (eglot-managed-p)
78 +
              (eglot-server-capable :documentFormattingProvider))
79 +
         (eglot-format-buffer))
80 +
        ((apply #'derived-mode-p my/reindent-modes)
81 +
         (indent-region (point-min) (point-max)))
82 +
        ((called-interactively-p 'any)
83 +
         (message "No formatter for %s" major-mode))))
84 +
85 +
(defun my/format-on-save ()
86 +
  (when my/format-on-save (my/format-buffer)))
87 +
88 +
(add-hook 'before-save-hook #'my/format-on-save)
89 +
90 +
(defun my/toggle-format-on-save ()
91 +
  "Toggle format on save for the current buffer."
92 +
  (interactive)
93 +
  (setq-local my/format-on-save (not my/format-on-save))
94 +
  (message "Format on save %s" (if my/format-on-save "on" "off")))
95 +
45 96
;; Diagnostics
46 97
(setq flymake-show-diagnostics-at-end-of-line 'short)
47 98
50 101
    "c"   '(:ignore t :wk "code")
51 102
    "ca"  '(eglot-code-actions :wk "actions")
52 103
    "cr"  '(eglot-rename :wk "rename")
53 -
    "cf"  '(eglot-format-buffer :wk "format")
104 +
    "cf"  '(my/format-buffer :wk "format")
105 +
    "cF"  '(my/toggle-format-on-save :wk "toggle format on save")
54 106
    "cd"  '(xref-find-definitions :wk "definition")
55 107
    "cR"  '(xref-find-references :wk "references")
56 108
    "ci"  '(eglot-find-implementation :wk "implementation")
home.scm +46 −37
21 21
         ;; encryption and password management
22 22
         "gnupg" "pinentry" "password-store")))
23 23
24 +
;; Language servers that emacs/lisp/init-lang.el starts through eglot
25 +
(define %lsp-packages
26 +
  (specifications->packages
27 +
   (list "guile-lsp-server"
28 +
         "rust-analyzer"
29 +
         "gopls"
30 +
         "lua-language-server"
31 +
         "python-lsp-server")))
32 +
24 33
(home-environment
25 -
  (packages %zsh-packages)
34 +
 (packages (append %zsh-packages %lsp-packages))
26 35
27 -
  (services
28 -
   (append
29 -
    (list
30 -
     (service home-zsh-service-type
31 -
              (home-zsh-configuration
32 -
               (zshrc (list (local-file "zsh/zshrc")))))
36 +
 (services
37 +
  (append
38 +
   (list
39 +
    (service home-zsh-service-type
40 +
             (home-zsh-configuration
41 +
              (zshrc (list (local-file "zsh/zshrc")))))
33 42
34 -
     ;; pinentry uses GTK under X and falls back to curses otherwise
35 -
     (service home-gpg-agent-service-type
36 -
              (home-gpg-agent-configuration
37 -
               (pinentry-program
38 -
                (file-append (specification->package "pinentry")
39 -
                             "/bin/pinentry"))))
43 +
    ;; pinentry uses GTK under X and falls back to curses otherwise
44 +
    (service home-gpg-agent-service-type
45 +
             (home-gpg-agent-configuration
46 +
              (pinentry-program
47 +
               (file-append (specification->package "pinentry")
48 +
                            "/bin/pinentry"))))
40 49
41 -
     (service home-files-service-type
42 -
              `((".guile" ,%default-dotguile)
43 -
                (".Xdefaults" ,%default-xdefaults)
44 -
                (".xsession" ,(local-file "xsession/xsession" #:recursive? #t))
45 -
                (".cwmrc" ,(local-file "cwm/cwmrc"))
46 -
                ;; Emacs config files are linked into ~/.emacs.d so that
47 -
                ;; elpa/ and other runtime state stay writable there.
48 -
                (".emacs.d/early-init.el" ,(local-file "emacs/early-init.el"))
49 -
                (".emacs.d/init.el" ,(local-file "emacs/init.el"))
50 -
                (".emacs.d/org.css" ,(local-file "emacs/org.css"))
51 -
                (".emacs.d/lisp" ,(local-file "emacs/lisp" #:recursive? #t))
52 -
                (".emacs.d/themes" ,(local-file "emacs/themes" #:recursive? #t))))
50 +
    (service home-files-service-type
51 +
             `((".guile" ,%default-dotguile)
52 +
               (".Xdefaults" ,%default-xdefaults)
53 +
               (".xsession" ,(local-file "xsession/xsession" #:recursive? #t))
54 +
               (".cwmrc" ,(local-file "cwm/cwmrc"))
55 +
               ;; Emacs config files are linked into ~/.emacs.d so that
56 +
               ;; elpa/ and other runtime state stay writable there.
57 +
               (".emacs.d/early-init.el" ,(local-file "emacs/early-init.el"))
58 +
               (".emacs.d/init.el" ,(local-file "emacs/init.el"))
59 +
               (".emacs.d/org.css" ,(local-file "emacs/org.css"))
60 +
               (".emacs.d/lisp" ,(local-file "emacs/lisp" #:recursive? #t))
61 +
               (".emacs.d/themes" ,(local-file "emacs/themes" #:recursive? #t))))
53 62
54 -
     (service home-xdg-configuration-files-service-type
55 -
              `(("starship.toml" ,(local-file "starship/starship.toml"))
56 -
                ("alacritty/alacritty.toml" ,(local-file "alacritty/alacritty.toml"))
57 -
                ("kitty/kitty.conf" ,(local-file "kitty/kitty.conf"))
58 -
                ("qtile/config.py" ,(local-file "qtile/config.py"))
59 -
                ("gdb/gdbinit" ,%default-gdbinit)
60 -
                ("nano/nanorc" ,%default-nanorc)))
63 +
    (service home-xdg-configuration-files-service-type
64 +
             `(("starship.toml" ,(local-file "starship/starship.toml"))
65 +
               ("alacritty/alacritty.toml" ,(local-file "alacritty/alacritty.toml"))
66 +
               ("kitty/kitty.conf" ,(local-file "kitty/kitty.conf"))
67 +
               ("qtile/config.py" ,(local-file "qtile/config.py"))
68 +
               ("gdb/gdbinit" ,%default-gdbinit)
69 +
               ("nano/nanorc" ,%default-nanorc)))
61 70
62 -
     ;; ~/.local/share/fonts is on fontconfig's default search path
63 -
     (service home-xdg-data-files-service-type
64 -
              `(("fonts/BerkeleyMonoNerdFontMono-Regular.ttf"
65 -
                 ,(local-file "fonts/BerkeleyMonoNerdFontMono-Regular.ttf")))))
71 +
    ;; ~/.local/share/fonts is on fontconfig's default search path
72 +
    (service home-xdg-data-files-service-type
73 +
             `(("fonts/BerkeleyMonoNerdFontMono-Regular.ttf"
74 +
                ,(local-file "fonts/BerkeleyMonoNerdFontMono-Regular.ttf")))))
66 75
67 -
    %base-home-services)))
76 +
   %base-home-services)))