Compare commits

...
8 Commits
Author SHA1 Message Date
jasonhilder c43ff55d32 Emacs clean up. 2026-10-27 07:59:41 +02:00
jasonhilder 62e4feba61 Custom theme 2026-10-26 09:34:18 +02:00
jasonhilder d2e47dec2a Emacs omg. 2026-10-26 08:26:57 +02:00
jasonhilder d2de783f3b Updated ignore files. 2026-10-26 08:26:45 +02:00
jasonhilder 1c4f950e3f Emacs config wip, split to better fit modules. 2026-10-26 08:06:00 +02:00
jasonhilder 2e6bbc77fd Cleanups. 2026-10-26 08:05:45 +02:00
jasonhilder 60c8d863d3 Cleaned up gitignore. 2026-10-26 08:05:31 +02:00
jasonhilder 30c87a36af Steam install script. 2026-10-26 08:05:19 +02:00
11 changed files with 681 additions and 139 deletions
+10 -2
View File
@@ -1,13 +1,21 @@
# emacs
config/emacs/.ignore config/emacs/.ignore
config/emacs/var/ config/emacs/var/
config/emacs/elfeed/
config/emacs/eshell/
config/emacs/auto-save-list/
# fish
config/fish/conf.d config/fish/conf.d
config/fish/functions config/fish/functions
config/fish/fish_variables config/fish/fish_variables
config/fish/generated_completions/ config/fish/generated_completions/
# vim/nvim
config/vim/autoload/ config/vim/autoload/
config/vim/pack/ config/vim/pack/
config/vim/.netrwhist config/vim/.netrwhist
config/nvim/nvim-pack-lock.json config/nvim/nvim-pack-lock.json
config/awesome/bling # other
scripts/bin/Obsidian
scripts/bin/ols scripts/bin/ols
scripts/bin/deno
scripts/bin/yt-dlp
scripts/bin/tiled
+1 -12
View File
@@ -1,8 +1,6 @@
;;; early-init.el --- Pre-init: GC ceiling and frame chrome -*- lexical-binding: t; -*- ;;; early-init.el --- Pre-init: GC ceiling and frame chrome -*- lexical-binding: t; -*-
;;; Commentary: ;;; Commentary:
;; Runs before package.el initialises and before the first frame is drawn, so ;; Runs before package.el initialises and first frame is drawn, the only place these take effect:
;; it is the only place two things can take effect:
;; 1. Raising the GC ceiling, so the whole startup (package load + init.el) ;; 1. Raising the GC ceiling, so the whole startup (package load + init.el)
;; runs without garbage-collection pauses. ;; runs without garbage-collection pauses.
;; 2. Removing the menu/tool/scroll bars via `default-frame-alist', so they ;; 2. Removing the menu/tool/scroll bars via `default-frame-alist', so they
@@ -10,15 +8,6 @@
;; them and then removes them, a visible flicker on launch. ;; them and then removes them, a visible flicker on launch.
;; ;;
;; Nothing here may depend on a package: none are loaded yet. ;; Nothing here may depend on a package: none are loaded yet.
;;
;; IMPORTANT: the GC bump below is only half the pair. Restore a working value
;; once startup is done by adding this to init.el:
;;
;; (add-hook 'emacs-startup-hook
;; (lambda () (setq gc-cons-threshold (* 16 1024 1024))))
;;
;; Without it, GC never runs again and Emacs slowly eats memory.
;;; Code: ;;; Code:
(startup-redirect-eln-cache (expand-file-name "var/eln-cache/" user-emacs-directory)) (startup-redirect-eln-cache (expand-file-name "var/eln-cache/" user-emacs-directory))
+34 -73
View File
@@ -1,15 +1,20 @@
;;; init.el --- Minimal Emacs: built-ins + evil + consult -*- lexical-binding: t; -*- ;;; init.el --- Minimal Emacs: built-ins + evil + consult -*- lexical-binding: t; -*-
;; Learning: F1 k KEY, F1 f FUNCTION, F1 v VARIABLE, ;; Learning: F1 k KEY, F1 f FUNCTION, F1 v VARIABLE, F1 m (modes), F1 b (bindings).
;; F1 m (modes), F1 b (bindings). ;; C-h works too, except in normal/motion state where it moves to the window on the left.
;; C-h works too, except in normal/motion state where it moves
;; to the window on the left.
;;; Code:
;;;; 1. Emac setup, files, packages and paths ;;; Code:
(let ((bin (expand-file-name "~/.local/bin"))) ;;;; 1. Emac setup, gc, files, packages
(add-hook 'emacs-startup-hook
(lambda () (setq gc-cons-threshold (* 16 1024 1024))))
(dolist (bin (list (expand-file-name "~/.local/bin")
(expand-file-name "~/.go/bin")))
(add-to-list 'exec-path bin) (add-to-list 'exec-path bin)
(setenv "PATH" (concat bin path-separator (getenv "PATH")))) (setenv "PATH" (concat bin path-separator (getenv "PATH"))))
;; Add the themes directory to the load path
(add-to-list 'custom-theme-load-path (expand-file-name "themes" user-emacs-directory))
;; all the emacs runtime files live in var/. ;; all the emacs runtime files live in var/.
;; early-init.el redirects eln-cache and elpa. ;; early-init.el redirects eln-cache and elpa.
(defvar my/var (locate-user-emacs-file "var/")) (defvar my/var (locate-user-emacs-file "var/"))
@@ -46,14 +51,12 @@
(blink-cursor-mode -1) (blink-cursor-mode -1)
(setq inhibit-startup-screen t (setq inhibit-startup-screen t
initial-scratch-message nil
ring-bell-function #'ignore ring-bell-function #'ignore
use-short-answers t use-short-answers t
scroll-conservatively 101 scroll-conservatively 101
scroll-margin 15) scroll-margin 20)
(setq-default indent-tabs-mode nil (setq-default indent-tabs-mode nil tab-width 4)
tab-width 4)
(global-hl-line-mode 1) (global-hl-line-mode 1)
(global-display-line-numbers-mode 1) (global-display-line-numbers-mode 1)
@@ -62,17 +65,14 @@
(electric-pair-mode 1) (electric-pair-mode 1)
(which-key-mode 1) (which-key-mode 1)
(add-to-list 'warning-suppress-types '(files)) ;; Load the compline theme
(use-package jbeans-theme (load-theme 'minimal t)
:config
(load-theme 'jbeans t))
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 120)
(setq-default line-spacing '(4 . 4))
;; set mode line at the top of each window ;; set mode line at the top of each window
(setq-default header-line-format mode-line-format mode-line-format nil) (setq-default header-line-format mode-line-format mode-line-format nil)
(set-face-attribute 'header-line nil :inherit 'mode-line :background "#131313")
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 120)
(setq-default line-spacing '(4 . 4))
;; Command launcher. ;; Command launcher.
(keymap-global-set "C-S-p" #'execute-extended-command) (keymap-global-set "C-S-p" #'execute-extended-command)
@@ -130,18 +130,14 @@
(setq evil-want-C-u-scroll t (setq evil-want-C-u-scroll t
evil-undo-system 'undo-redo evil-undo-system 'undo-redo
evil-want-keybinding nil) evil-want-keybinding nil)
:config :config
(evil-mode 1) (evil-mode 1)
(evil-define-key 'insert 'global (evil-define-key 'insert 'global
(kbd "TAB") #'my/insert-tab (kbd "TAB") #'my/insert-tab
(kbd "<tab>") #'my/insert-tab (kbd "C-SPC") #'completion-at-point)
;; complete using the buffer's completion sources.
(kbd "C-SPC") #'completion-at-point
(kbd "C-@") #'completion-at-point)
;; C-p, C-f and C-b are assigned to Consult below. ;; C-p and C-f are assigned to Consult below, C-m to ibuffer.
(evil-define-key '(normal motion) 'global (evil-define-key '(normal motion) 'global
(kbd "C-e") #'dired-jump)) (kbd "C-e") #'dired-jump))
@@ -151,7 +147,7 @@
;; Don't add its global [b ]b [e ]e ... bindings. ;; Don't add its global [b ]b [e ]e ... bindings.
(evil-collection-want-unimpaired-p nil) (evil-collection-want-unimpaired-p nil)
:config :config
(evil-collection-init '(info))) (evil-collection-init '(info ibuffer)))
;; Minibuffer. Vertico ;; Minibuffer. Vertico
(with-eval-after-load 'vertico (with-eval-after-load 'vertico
@@ -164,14 +160,6 @@
(evil-define-key '(insert normal) minibuffer-local-map (evil-define-key '(insert normal) minibuffer-local-map
(kbd "<escape>") #'abort-minibuffers) (kbd "<escape>") #'abort-minibuffers)
;; Window navigation (normal/motion state): Ctrl+hjkl move, Ctrl+` closes.
(evil-define-key '(normal motion) 'global
(kbd "C-h") #'windmove-left
(kbd "C-j") #'windmove-down
(kbd "C-k") #'windmove-up
(kbd "C-l") #'windmove-right
(kbd "C-q") #'delete-window)
;; Result buffers: hjkl motions and RET to jump to a result. ;; Result buffers: hjkl motions and RET to jump to a result.
(dolist (m '(occur-mode grep-mode xref--xref-buffer-mode)) (dolist (m '(occur-mode grep-mode xref--xref-buffer-mode))
(evil-set-initial-state m 'motion)) (evil-set-initial-state m 'motion))
@@ -198,22 +186,16 @@
;; Searches start at the project root when there is one, else the current directory. ;; Searches start at the project root when there is one, else the current directory.
(use-package consult (use-package consult
:config :config
;; Hide noise from the buffer picker.
(dolist (re '("\\`\\*scratch\\*\\'"
"\\`\\*Messages\\*\\'"
"\\`\\*Warnings\\*\\'"
"\\`\\*xref\\*\\'"))
(add-to-list 'consult-buffer-filter re))
;; Don't re-run the preview on every keystroke while typing a search. ;; Don't re-run the preview on every keystroke while typing a search.
(consult-customize consult-ripgrep (consult-customize consult-ripgrep
:preview-key '(:debounce 0.4 any))) :preview-key '(:debounce 0.4 any)))
;; Bind immediately, without waiting for consult to load. ;; Bind immediately, without waiting for consult to load.
;; C-m opens the full ibuffer list (evil-collection provides its navigation).
(evil-define-key '(normal motion) 'global (evil-define-key '(normal motion) 'global
(kbd "C-p") #'consult-fd (kbd "C-p") #'consult-fd
(kbd "C-f") #'consult-ripgrep (kbd "C-f") #'consult-ripgrep
(kbd "C-b") #'consult-buffer) (kbd "C-m") #'ibuffer)
;;;; 7. Dired ;;;; 7. Dired
(setq dired-dwim-target t (setq dired-dwim-target t
@@ -234,41 +216,20 @@
"." #'dired-omit-mode "." #'dired-omit-mode
(kbd "RET") #'dired-find-file)) (kbd "RET") #'dired-find-file))
;;;; 8. Build ;;;; Core config ends here.
(setq compile-command "./build.sh" ;;;; -----------------------------------------------------------------
compilation-read-command nil ;;;; 8. Modules - additional functionality outside of the core init.el
compilation-ask-about-save nil
compilation-scroll-output t)
(add-hook 'compilation-filter-hook #'ansi-color-compilation-filter) ;; Setup for orgmode
(load (locate-user-emacs-file "modules/org.el") nil 'nomessage)
;; Compilation buffer always at the bottom, full frame width.
(add-to-list 'display-buffer-alist
'((derived-mode . compilation-mode)
(display-buffer-reuse-window display-buffer-at-bottom)
(window-height . 0.45)))
;; C-c C-c builds from the project root.
;; C-c b asks first: the prompt is pre-filled with ./build.sh, so type the args after it.
(defun my/project-compile-prompt ()
"Run `project-compile', prompting to edit the command."
(interactive)
(let ((compilation-read-command t))
(call-interactively #'project-compile)))
(keymap-global-set "C-c C-c" #'project-compile)
(keymap-global-set "C-c b" #'my/project-compile-prompt)
;; Focus the compilation window when a build starts.
(add-hook 'compilation-start-hook
(lambda (proc)
(when-let* ((win (get-buffer-window (process-buffer proc))))
(select-window win))))
;;;; 9. Modules - additional functionality outside of the core init.el
;; Magit and the :git command live in modules/git.el. ;; Magit and the :git command live in modules/git.el.
(load (locate-user-emacs-file "modules/git.el") nil 'nomessage) (load (locate-user-emacs-file "modules/git.el") nil 'nomessage)
;; Setup for personal build commands and system.
(load (locate-user-emacs-file "modules/build.el") nil 'nomessage)
;; Setup for dev languages, modes, lsp and lsp keybinds. ;; Setup for dev languages, modes, lsp and lsp keybinds.
(load (locate-user-emacs-file "modules/development.el") nil 'nomessage) (load (locate-user-emacs-file "modules/dev.el") nil 'nomessage)
;;; init.el ends here ;;; init.el ends here
+47
View File
@@ -0,0 +1,47 @@
;;; build.el --- Project build, set up for Evil -*- lexical-binding: t; -*-
;;; Commentary:
;; Loaded from init.el after Evil.
;;
;; :build Run ./build.sh from the nearest ancestor dir containing it.
;; :build ARGS Run ./build.sh ARGS, e.g. :build release -v
;;
;; If no build.sh is found (or it isn't executable), report it and do nothing.
;;
;; The compilation buffer opens at the bottom (45% height, full width) and
;; takes focus when the build starts. ANSI colours are rendered.
;; Kill a running build with M-x kill-compilation.
;;; Code:
(setq compilation-read-command nil ; run without prompting
compilation-ask-about-save nil
compilation-scroll-output t)
(add-hook 'compilation-filter-hook #'ansi-color-compilation-filter)
;; Compilation buffer at the bottom, full frame width.
(add-to-list 'display-buffer-alist
'((derived-mode . compilation-mode)
(display-buffer-reuse-window display-buffer-at-bottom)
(window-height . 0.45)))
;; Focus the compilation window when a build starts.
(add-hook 'compilation-start-hook
(lambda (proc)
(when-let* ((win (get-buffer-window (process-buffer proc))))
(select-window win))))
;; :build runs ./build.sh; :build ARGS appends ARGS.
(evil-define-command my/ex-build (args)
"Run `./build.sh ARGS' from the nearest directory containing build.sh."
(interactive "<a>")
(let ((root (locate-dominating-file default-directory "build.sh")))
(unless root
(user-error "No build.sh found"))
(let ((default-directory root))
(unless (file-executable-p "build.sh")
(user-error "build.sh is not executable"))
(compile (string-trim (concat "./build.sh " args)))))) ; nil args -> ""
(evil-ex-define-cmd "build" #'my/ex-build)
;;; build.el ends here
+99
View File
@@ -0,0 +1,99 @@
;;; development.el --- Languages, Eglot and code navigation -*- lexical-binding: t; -*-
;;; Commentary:
;; Loaded from init.el. Requires Evil.
;;
;; Languages:
;; Markdown markdown-mode.
;; PHP php-mode, PSR-2 style, 4 spaces.
;; Odin odin-mode from git (needs Emacs 30+ for :vc), Eglot + OLS.
;; Go go-mode, Eglot + gopls; organize imports and format on save.
;;
;; Normal/motion state:
;; gd definitions gD references K eldoc
;; C-t jump back ESC closes any open eldoc window.
;;; Code:
;;;; Markdown
(use-package markdown-mode)
;;;; PHP
(use-package php-mode
:mode "\\.php\\'"
:hook
(php-mode . (lambda ()
(setq-local indent-tabs-mode nil)
(setq-local tab-width 4)
(setq-local c-basic-offset 4)))
:custom
(php-mode-coding-style 'psr2))
;;;; Odin
(use-package odin-mode
:vc (:url "https://github.com/mattt-b/odin-mode"
:rev :newest)
:mode "\\.odin\\'"
:hook (odin-mode . eglot-ensure))
;;;; Go
;; Emacs started from the desktop doesn't inherit fish env.
(dolist (d '("/usr/local/go/bin" "/home/jason/.go/bin"))
(add-to-list 'exec-path d)
(setenv "PATH" (concat d ":" (getenv "PATH"))))
(setenv "GOPATH" "/home/jason/.go")
(setenv "GOCACHE" "/home/jason/.go/cache")
(defun my/go-before-save ()
"Organize imports and format the buffer through Eglot."
(when (eglot-managed-p)
(eglot-code-actions nil nil "source.organizeImports" t)
(eglot-format-buffer)))
(use-package go-mode
:mode "\\.go\\'"
:hook ((go-mode . eglot-ensure)
(go-mode . (lambda ()
(setq-local tab-width 4)
(add-hook 'before-save-hook #'my/go-before-save nil t)))))
;;;; Eglot
(use-package eglot
:ensure nil
:config
(setq eglot-autoshutdown t)
(add-to-list 'eglot-ignored-server-capabilities :signatureHelpProvider)
;; Explicit OLS configuration.
(add-to-list
'eglot-server-programs
'(odin-mode
. ("/home/jason/.local/bin/ols"
:initializationOptions
(:odin_command "/home/jason/.odin/odin"
:enable_document_symbols t
:enable_format t
:collections
[(:name "core"
:path "/home/jason/.odin/core")
(:name "vendor"
:path "/home/jason/.odin/vendor")])))))
;; OLS built-in definitions.
(setenv "OLS_BUILTIN_FOLDER" "/home/jason/ThirdParty/ols/builtin")
;;;; Code navigation
;; Vim-style code navigation.
(evil-define-key '(normal motion) 'global
"gd" #'xref-find-definitions
"gD" #'xref-find-references
"K" #'eldoc
(kbd "C-t") #'xref-go-back)
;; ESC closes any open eldoc window.
(defun my/eldoc-close (&rest _)
"Quit every window showing an *eldoc* buffer."
(dolist (w (window-list))
(when (string-prefix-p "*eldoc" (buffer-name (window-buffer w)))
(quit-window nil w))))
(advice-add 'evil-force-normal-state :after #'my/eldoc-close)
;;; development.el ends here
-48
View File
@@ -1,48 +0,0 @@
;;;; Markdown
(use-package markdown-mode)
;;;; Odin
(use-package odin-mode
:vc (:url "https://github.com/mattt-b/odin-mode"
:rev :newest)
:mode "\\.odin\\'"
:hook (odin-mode . eglot-ensure))
(use-package eglot
:ensure nil
:config
(setq eglot-autoshutdown t)
(add-to-list 'eglot-ignored-server-capabilities :signatureHelpProvider)
;; Explicit OLS configuration.
(add-to-list
'eglot-server-programs
'(odin-mode
. ("/home/jason/.local/bin/ols"
:initializationOptions
(:odin_command "/home/jason/.odin/odin"
:enable_document_symbols t
:enable_format t
:collections
[(:name "core"
:path "/home/jason/.odin/core")
(:name "vendor"
:path "/home/jason/.odin/vendor")])))))
;; OLS built-in definitions.
(setenv "OLS_BUILTIN_FOLDER" "/home/jason/ThirdParty/ols/builtin")
;;;; Code navigation
;; Vim-style code navigation.
(evil-define-key '(normal motion) 'global
"gd" #'xref-find-definitions
"gD" #'xref-find-references
"K" #'eldoc
(kbd "C-t") #'xref-go-back)
;; ESC closes any open eldoc window.
(defun my/eldoc-close (&rest _)
(dolist (w (window-list))
(when (string-prefix-p "*eldoc" (buffer-name (window-buffer w)))
(quit-window nil w))))
(advice-add 'evil-force-normal-state :after #'my/eldoc-close)
+58
View File
@@ -0,0 +1,58 @@
;;; org.el --- Org appearance -*- lexical-binding: t; -*-
;;; Code:
;; Styled stars, bullets, tags, tables and blocks.
(use-package org-modern
:hook (org-mode . org-modern-mode))
(setq org-directory "~/Projects/notebook")
(setq org-startup-indented t ; visual indent per level, no real spaces
org-hide-emphasis-markers t ; *bold* shows bold, markers hidden
org-pretty-entities t ; \rarr, \alpha etc. as symbols
org-ellipsis " ▾" ; folded-heading marker
org-startup-folded 'show2levels ; open with headings only
org-fontify-whole-heading-line t
org-fontify-done-headline t
org-fontify-quote-and-verse-blocks t
org-src-fontify-natively t ; highlight src blocks with their own mode
org-src-tab-acts-natively t
org-edit-src-content-indentation 0
org-return-follows-link t)
;; org-modern's recommended settings.
(setq org-auto-align-tags nil
org-tags-column 0
org-catch-invisible-edits 'show-and-error
org-special-ctrl-a/e t
org-insert-heading-respect-content t)
(add-hook 'org-mode-hook #'visual-line-mode) ; wrap at window edge
(add-hook 'org-mode-hook (lambda () (display-line-numbers-mode -1))) ; prose reads better without
;; doom-themes' own Org fontification fixes (blocks, headings).
(doom-themes-org-config)
;; Heading sizes; 'user survives theme reloads, same as in init.el.
(doom-themes-set-faces 'user
'(org-document-title :height 1.3 :weight 'bold)
'(org-level-1 :height 1.2 :weight 'bold)
'(org-level-2 :height 1.15 :weight 'bold)
'(org-level-3 :height 1.1 :weight 'bold)
'(org-level-4 :height 1.0 :weight 'bold))
(defun my/notes-index ()
"Open the notes index."
(interactive)
(find-file (expand-file-name "index.org" org-directory)))
(keymap-global-set "C-c n" #'my/notes-index)
;; Evil's TAB (= C-i, jump-forward) shadows Org's. Rebind for Org buffers only.
(with-eval-after-load 'org
(evil-define-key 'normal org-mode-map
(kbd "TAB") #'org-cycle ; fold/unfold the heading at point
(kbd "<tab>") #'org-cycle ; GUI emits <tab>, so bind both
(kbd "RET") #'org-open-at-point
(kbd "<backtab>") #'org-shifttab)) ; S-TAB: cycle all headings
;;; org.el ends here
+360
View File
@@ -0,0 +1,360 @@
;;; minimal-theme.el --- Minimal high-functionality Ujelly port -*- lexical-binding: t; -*-
;;
;; Built on the compline-theme face structure, updated with the color palette
;; from Ujelly (color-theme-ujelly by marktran).
;;
;;; Code:
(deftheme minimal
"Created 2026-10-26.")
(custom-theme-set-faces
'minimal
;;;; Core
'(default ((t (:inherit nil :extend nil :stipple nil :background "#151515" :foreground "#e8e8d3" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight regular :height 143 :width normal))))
'(cursor ((t (:background "#8fbfdc"))))
'(fixed-pitch ((t (:height 140))))
'(variable-pitch ((t (:height 140))))
'(escape-glyph ((t (:foreground "#8fbfdc"))))
'(homoglyph ((t (:foreground "#8fbfdc"))))
'(minibuffer-prompt ((t (:foreground "#8fbfdc"))))
'(highlight ((t (:foreground "#e8e8d3" :background "#303030" :weight bold))))
'(hl-line ((t (:extend t :background "#1b1b1b"))))
'(region ((t (:extend t :background "#404040"))))
'(shadow ((t (:foreground "#7f7f7f"))))
'(secondary-selection ((t (:extend t :background "#404040"))))
'(trailing-whitespace ((t (:background "#cf6a4c"))))
'(vertical-border ((t (:foreground "#262626"))))
'(error ((t (:foreground "#cf6a4c"))))
'(warning ((t (:foreground "#fad07a"))))
'(success ((t (:foreground "#99ad6a"))))
;;;; Line numbers
'(line-number ((t (:foreground "#404040"))))
'(line-number-current-line ((t (:foreground "#e8e8d3"))))
;;;; Font lock
'(font-lock-bracket-face ((t (:inherit (font-lock-punctuation-face)))))
'(font-lock-builtin-face ((t (:foreground "#8fbfdc"))))
'(font-lock-comment-delimiter-face ((default (:inherit (font-lock-comment-face)))))
'(font-lock-comment-face ((t (:foreground "#767676"))))
'(font-lock-constant-face ((t (:foreground "#c6b5ed"))))
'(font-lock-delimiter-face ((t (:inherit (font-lock-punctuation-face)))))
'(font-lock-doc-face ((t (:foreground "#767676" :inherit (font-lock-comment-face)))))
'(font-lock-doc-markup-face ((t (:inherit (font-lock-constant-face)))))
'(font-lock-escape-face ((t (:inherit (font-lock-regexp-grouping-backslash)))))
'(font-lock-function-call-face ((t (:slant italic :foreground "#8fbfdc" :inherit (font-lock-function-name-face)))))
'(font-lock-function-name-face ((t (:foreground "#8fbfdc"))))
'(font-lock-keyword-face ((t (:foreground "#fad07a"))))
'(font-lock-negation-char-face ((t (:foreground "#cf6a4c" :inherit (bold)))))
'(font-lock-number-face ((t (:foreground "#cf6a4c"))))
'(font-lock-misc-punctuation-face ((t (:inherit (font-lock-punctuation-face)))))
'(font-lock-operator-face ((t (:foreground "#a0a8b0"))))
'(font-lock-preprocessor-face ((t (:foreground "#fad07a" :inherit (bold)))))
'(font-lock-property-name-face ((t (:weight bold :foreground "#8fbfdc"))))
'(font-lock-property-use-face ((t (:weight regular :inherit (font-lock-property-name-face)))))
'(font-lock-punctuation-face ((t (:foreground "#a0a8b0"))))
'(font-lock-regexp-grouping-backslash ((t (:foreground "#fad07a" :inherit (bold)))))
'(font-lock-regexp-grouping-construct ((t (:foreground "#fad07a" :inherit (bold)))))
'(font-lock-string-face ((t (:foreground "#99ad6a"))))
'(font-lock-type-face ((t (:foreground "#ffb17a"))))
'(font-lock-variable-name-face ((t (:foreground "#e8e8d3"))))
'(font-lock-variable-use-face ((t (:foreground "#e8e8d3" :inherit (font-lock-variable-name-face)))))
'(font-lock-warning-face ((t (:inherit (warning)))))
;;;; Links, buttons, tooltips
'(button ((t (:inherit (link)))))
'(link ((t (:weight bold :underline (:color foreground-color :style line :position nil) :foreground "#8fbfdc"))))
'(link-visited ((t (:inherit link :foreground "#c6b5ed"))))
'(fringe ((t (:foreground "#404040" :inherit (default)))))
'(tooltip ((t (:foreground "#e8e8d3" :background "#1b1b1b"))))
;;;; Mode line
'(header-line ((t (:inherit (mode-line)))))
'(mode-line ((t (:background "#1c1c1c" :foreground unspecified))))
'(mode-line-buffer-id ((t (:weight bold))))
'(mode-line-emphasis ((t (:foreground "#fad07a"))))
'(mode-line-highlight ((t (:inherit (highlight)))))
'(mode-line-inactive ((t (:foreground "#767676" :background "#121212"))))
;;;; Tab bar
'(tab-bar ((t (:inherit default :background "#151515" :foreground "#767676"))))
'(tab-bar-tab ((t (:inherit tab-bar :background "#262626" :foreground "#e8e8d3" :weight bold :box nil))))
'(tab-bar-tab-inactive ((t (:inherit tab-bar :background "#151515" :foreground "#999999" :weight normal :box nil))))
;;;; Search & Completions
'(isearch ((t (:weight bold :inherit (lazy-highlight)))))
'(isearch-fail ((t (:weight bold :foreground "#151515" :background "#cf6a4c"))))
'(lazy-highlight ((t (:weight bold :foreground "#e8e8d3" :background "#303030"))))
'(match ((t (:weight bold :foreground "#99ad6a" :background "#151515"))))
'(next-error ((t (:inherit (region)))))
'(query-replace ((t (:inherit (isearch)))))
;;;; VC gutter: added = green, deleted = red, modified = sand/yellow
'(diff-hl-insert ((t (:foreground "#99ad6a" :background "#99ad6a"))))
'(diff-hl-delete ((t (:foreground "#cf6a4c" :background "#cf6a4c"))))
'(diff-hl-change ((t (:foreground "#fad07a" :background "#fad07a"))))
'(git-gutter:added ((t (:foreground "#99ad6a" :background "#99ad6a"))))
'(git-gutter:deleted ((t (:foreground "#cf6a4c" :background "#cf6a4c"))))
'(git-gutter:modified ((t (:foreground "#fad07a" :background "#fad07a"))))
'(git-gutter-fr:added ((t (:foreground "#99ad6a"))))
'(git-gutter-fr:deleted ((t (:foreground "#cf6a4c"))))
'(git-gutter-fr:modified ((t (:foreground "#fad07a"))))
;;;; gnus: group buffer
'(gnus-group-news-1 ((t (:foreground "#e8e8d3" :weight bold))))
'(gnus-group-news-1-empty ((t (:foreground "#e8e8d3" :weight normal))))
'(gnus-group-news-2 ((t (:foreground "#8fbfdc" :weight bold))))
'(gnus-group-news-2-empty ((t (:foreground "#8fbfdc" :weight normal))))
'(gnus-group-news-3 ((t (:foreground "#fad07a" :weight bold))))
'(gnus-group-news-3-empty ((t (:foreground "#fad07a" :weight normal))))
'(gnus-group-news-low ((t (:foreground "#767676" :weight bold))))
'(gnus-group-news-low-empty ((t (:foreground "#404040" :weight normal))))
'(gnus-group-mail-1 ((t (:foreground "#99ad6a" :weight bold))))
'(gnus-group-mail-1-empty ((t (:foreground "#99ad6a" :weight normal))))
'(gnus-group-mail-2 ((t (:foreground "#c6b5ed" :weight bold))))
'(gnus-group-mail-2-empty ((t (:foreground "#c6b5ed" :weight normal))))
'(gnus-group-mail-3 ((t (:foreground "#ffb17a" :weight bold))))
'(gnus-group-mail-3-empty ((t (:foreground "#ffb17a" :weight normal))))
'(gnus-group-mail-low ((t (:foreground "#767676" :weight bold))))
'(gnus-group-mail-low-empty ((t (:foreground "#404040" :weight normal))))
;;;; gnus: summary buffer
'(gnus-summary-normal-unread ((t (:foreground "#e8e8d3" :weight bold))))
'(gnus-summary-normal-read ((t (:foreground "#767676" :weight normal))))
'(gnus-summary-normal-ticked ((t (:foreground "#cf6a4c" :weight bold))))
'(gnus-summary-normal-ancient ((t (:foreground "#404040" :weight normal))))
'(gnus-summary-normal-undownloaded ((t (:foreground "#8fbfdc" :slant italic))))
'(gnus-summary-high-unread ((t (:foreground "#fad07a" :weight bold))))
'(gnus-summary-high-read ((t (:foreground "#99ad6a" :weight normal))))
'(gnus-summary-high-ticked ((t (:foreground "#cf6a4c" :weight bold))))
'(gnus-summary-high-ancient ((t (:foreground "#767676" :weight normal))))
'(gnus-summary-low-unread ((t (:foreground "#8fbfdc" :slant italic :weight bold))))
'(gnus-summary-low-read ((t (:foreground "#404040" :slant italic :weight normal))))
'(gnus-summary-low-ticked ((t (:foreground "#cf6a4c" :slant italic))))
'(gnus-summary-low-ancient ((t (:foreground "#404040" :slant italic))))
'(gnus-summary-selected ((t (:background "#404040" :foreground "#e8e8d3" :weight bold))))
'(gnus-summary-cancelled ((t (:foreground "#cf6a4c" :strike-through t))))
;;;; gnus: article headers, citations, misc
'(gnus-header-name ((t (:foreground "#8fbfdc" :weight bold))))
'(gnus-header-content ((t (:foreground "#fad07a" :slant italic))))
'(gnus-header-from ((t (:foreground "#e8e8d3" :weight bold))))
'(gnus-header-subject ((t (:foreground "#ffb17a"))))
'(gnus-header-newsgroups ((t (:foreground "#fad07a" :slant italic))))
'(gnus-cite-1 ((t (:foreground "#8fbfdc"))))
'(gnus-cite-2 ((t (:foreground "#99ad6a"))))
'(gnus-cite-3 ((t (:foreground "#fad07a"))))
'(gnus-cite-4 ((t (:foreground "#cf6a4c"))))
'(gnus-cite-5 ((t (:foreground "#c6b5ed"))))
'(gnus-cite-6 ((t (:foreground "#ffb17a"))))
'(gnus-cite-7 ((t (:foreground "#8fbfdc"))))
'(gnus-cite-8 ((t (:foreground "#99ad6a"))))
'(gnus-cite-9 ((t (:foreground "#fad07a"))))
'(gnus-cite-10 ((t (:foreground "#767676"))))
'(gnus-cite-11 ((t (:foreground "#404040"))))
'(gnus-signature ((t (:foreground "#767676" :slant italic))))
'(gnus-button ((t (:inherit link))))
'(gnus-splash ((t (:foreground "#767676"))))
'(gnus-emphasis-bold ((t (:weight bold))))
'(gnus-emphasis-italic ((t (:slant italic))))
'(gnus-emphasis-underline ((t (:underline t))))
'(gnus-emphasis-bold-italic ((t (:weight bold :slant italic))))
'(gnus-server-opened ((t (:foreground "#99ad6a" :weight bold))))
'(gnus-server-closed ((t (:foreground "#767676" :slant italic))))
'(gnus-server-denied ((t (:foreground "#cf6a4c" :weight bold))))
'(gnus-server-offline ((t (:foreground "#fad07a" :weight bold))))
'(gnus-server-agent ((t (:foreground "#8fbfdc" :weight bold))))
;;;; message (gnus composition buffers)
'(message-header-name ((t (:foreground "#8fbfdc" :weight bold))))
'(message-header-to ((t (:foreground "#e8e8d3" :weight bold))))
'(message-header-cc ((t (:foreground "#ffb17a"))))
'(message-header-subject ((t (:foreground "#e8e8d3" :weight bold))))
'(message-header-newsgroups ((t (:foreground "#fad07a" :slant italic))))
'(message-header-other ((t (:foreground "#fad07a"))))
'(message-header-xheader ((t (:foreground "#767676"))))
'(message-separator ((t (:foreground "#404040"))))
'(message-mml ((t (:foreground "#99ad6a"))))
'(message-cited-text-1 ((t (:foreground "#8fbfdc"))))
'(message-cited-text-2 ((t (:foreground "#99ad6a"))))
'(message-cited-text-3 ((t (:foreground "#fad07a"))))
'(message-cited-text-4 ((t (:foreground "#cf6a4c"))))
;;;; magit: sections
'(magit-section-heading ((t (:foreground "#fad07a" :weight bold :extend t))))
'(magit-section-secondary-heading ((t (:foreground "#c6b5ed" :weight bold :extend t))))
'(magit-section-heading-selection ((t (:foreground "#99ad6a" :weight bold :extend t))))
'(magit-section-highlight ((t (:background "#1b1b1b" :extend t))))
'(magit-section-child-count ((t (:foreground "#767676"))))
;;;; magit: refs, hashes, log
'(magit-branch-local ((t (:foreground "#8fbfdc"))))
'(magit-branch-remote ((t (:foreground "#99ad6a"))))
'(magit-branch-current ((t (:foreground "#8fbfdc" :weight bold :box (:line-width -1 :color "#767676")))))
'(magit-branch-remote-head ((t (:foreground "#99ad6a" :weight bold :box (:line-width -1 :color "#767676")))))
'(magit-branch-upstream ((t (:slant italic))))
'(magit-tag ((t (:foreground "#fad07a"))))
'(magit-hash ((t (:foreground "#767676"))))
'(magit-dimmed ((t (:foreground "#404040"))))
'(magit-filename ((t (:foreground "#e8e8d3"))))
'(magit-refname ((t (:foreground "#767676"))))
'(magit-refname-stash ((t (:foreground "#767676"))))
'(magit-refname-wip ((t (:foreground "#767676"))))
'(magit-log-author ((t (:foreground "#fad07a"))))
'(magit-log-date ((t (:foreground "#767676"))))
'(magit-log-graph ((t (:foreground "#404040"))))
'(magit-keyword ((t (:foreground "#fad07a"))))
'(magit-keyword-squash ((t (:foreground "#fad07a"))))
'(magit-cherry-equivalent ((t (:foreground "#e8e8d3"))))
'(magit-cherry-unmatched ((t (:foreground "#8fbfdc"))))
;;;; magit: diffs
'(magit-diff-file-heading ((t (:foreground "#e8e8d3" :weight bold :extend t))))
'(magit-diff-file-heading-highlight ((t (:inherit magit-diff-file-heading :background "#1b1b1b"))))
'(magit-diff-file-heading-selection ((t (:inherit magit-diff-file-heading :foreground "#fad07a" :background "#404040"))))
'(magit-diff-hunk-heading ((t (:foreground "#c6b5ed" :background "#222222" :extend t))))
'(magit-diff-hunk-heading-highlight ((t (:foreground "#e8e8d3" :background "#404040" :extend t))))
'(magit-diff-hunk-heading-selection ((t (:foreground "#fad07a" :background "#404040" :extend t))))
'(magit-diff-lines-heading ((t (:foreground "#151515" :background "#fad07a" :extend t))))
'(magit-diff-context ((t (:foreground "#767676" :extend t))))
'(magit-diff-context-highlight ((t (:foreground "#c6b5ed" :background "#1b1b1b" :extend t))))
'(magit-diff-added ((t (:foreground "#99ad6a" :background "#1a261a" :extend t))))
'(magit-diff-added-highlight ((t (:foreground "#99ad6a" :background "#223322" :extend t))))
'(magit-diff-removed ((t (:foreground "#cf6a4c" :background "#261a1a" :extend t))))
'(magit-diff-removed-highlight ((t (:foreground "#cf6a4c" :background "#332222" :extend t))))
'(magit-diffstat-added ((t (:foreground "#99ad6a"))))
'(magit-diffstat-removed ((t (:foreground "#cf6a4c"))))
'(magit-diff-whitespace-warning ((t (:background "#cf6a4c"))))
;;;; magit: process, signatures, sequences, blame, header line
'(magit-process-ok ((t (:foreground "#99ad6a" :weight bold))))
'(magit-process-ng ((t (:foreground "#cf6a4c" :weight bold))))
'(magit-mode-line-process ((t (:foreground "#fad07a"))))
'(magit-mode-line-process-error ((t (:foreground "#cf6a4c"))))
'(magit-signature-good ((t (:foreground "#99ad6a"))))
'(magit-signature-bad ((t (:foreground "#cf6a4c" :weight bold))))
'(magit-signature-untrusted ((t (:foreground "#8fbfdc"))))
'(magit-signature-expired ((t (:foreground "#fad07a"))))
'(magit-signature-expired-key ((t (:foreground "#fad07a"))))
'(magit-signature-revoked ((t (:foreground "#cf6a4c"))))
'(magit-signature-error ((t (:foreground "#cf6a4c"))))
'(magit-sequence-head ((t (:foreground "#8fbfdc"))))
'(magit-sequence-stop ((t (:foreground "#99ad6a"))))
'(magit-sequence-part ((t (:foreground "#fad07a"))))
'(magit-sequence-done ((t (:foreground "#767676"))))
'(magit-sequence-onto ((t (:foreground "#767676"))))
'(magit-bisect-good ((t (:foreground "#99ad6a"))))
'(magit-bisect-skip ((t (:foreground "#fad07a"))))
'(magit-bisect-bad ((t (:foreground "#cf6a4c"))))
'(magit-blame-heading ((t (:foreground "#c6b5ed" :background "#222222" :extend t))))
'(magit-header-line ((t (:foreground "#fad07a" :weight bold))))
'(magit-header-line-key ((t (:foreground "#fad07a"))))
'(magit-header-line-log-select ((t (:foreground "#e8e8d3" :weight bold))))
;;;; transient (magit popups)
'(transient-heading ((t (:foreground "#fad07a" :weight bold))))
'(transient-key ((t (:foreground "#fad07a" :weight bold))))
'(transient-key-exit ((t (:foreground "#cf6a4c" :weight bold))))
'(transient-key-return ((t (:foreground "#fad07a" :weight bold))))
'(transient-key-stay ((t (:foreground "#99ad6a" :weight bold))))
'(transient-argument ((t (:foreground "#99ad6a" :weight bold))))
'(transient-value ((t (:foreground "#99ad6a"))))
'(transient-inactive-argument ((t (:foreground "#767676"))))
'(transient-inactive-value ((t (:foreground "#767676"))))
'(transient-unreachable ((t (:foreground "#404040"))))
'(transient-unreachable-key ((t (:foreground "#404040"))))
'(transient-disabled-suffix ((t (:foreground "#151515" :background "#cf6a4c" :weight bold))))
'(transient-enabled-suffix ((t (:foreground "#151515" :background "#99ad6a" :weight bold))))
'(transient-delimiter ((t (:foreground "#767676"))))
'(transient-separator ((t (:background "#1c1c1c"))))
'(transient-active-infix ((t (:foreground "#e8e8d3" :background "#404040"))))
'(transient-mismatched-key ((t (:underline t))))
'(transient-nonstandard-key ((t (:underline t))))
;;;; git-commit (magit commit message buffer)
'(git-commit-summary ((t (:foreground "#e8e8d3" :weight bold))))
'(git-commit-overlong-summary ((t (:foreground "#cf6a4c" :weight bold))))
'(git-commit-nonempty-second-line ((t (:foreground "#cf6a4c"))))
'(git-commit-keyword ((t (:foreground "#8fbfdc"))))
'(git-commit-comment-heading ((t (:foreground "#fad07a" :weight bold))))
'(git-commit-comment-branch-local ((t (:foreground "#8fbfdc"))))
'(git-commit-comment-branch-remote ((t (:foreground "#99ad6a"))))
'(git-commit-comment-detached ((t (:foreground "#fad07a"))))
'(git-commit-comment-file ((t (:foreground "#fad07a"))))
'(git-commit-comment-action ((t (:foreground "#99ad6a"))))
;;;; erc: buffer text
'(erc-default-face ((t (:foreground "#e8e8d3"))))
'(erc-input-face ((t (:foreground "#99ad6a"))))
'(erc-my-nick-face ((t (:foreground "#99ad6a" :weight bold))))
'(erc-my-nick-prefix-face ((t (:foreground "#99ad6a" :weight bold))))
'(erc-nick-default-face ((t (:foreground "#e8e8d3" :weight bold))))
'(erc-nick-prefix-face ((t (:foreground "#fad07a"))))
'(erc-notice-face ((t (:foreground "#767676" :weight normal))))
'(erc-information ((t (:foreground "#c6b5ed"))))
'(erc-timestamp-face ((t (:foreground "#404040" :weight normal))))
'(erc-action-face ((t (:foreground "#ffb17a" :weight bold))))
'(erc-prompt-face ((t (:foreground "#fad07a" :weight bold))))
'(erc-command-indicator-face ((t (:foreground "#c6b5ed" :weight bold))))
'(erc-error-face ((t (:foreground "#cf6a4c"))))
'(erc-button ((t (:inherit link :foreground "#e8e8d3"))))
'(erc-button-nick-default-face ((t (:foreground "#e8e8d3" :weight bold))))
'(erc-bold-face ((t (:weight bold))))
'(erc-italic-face ((t (:slant italic))))
'(erc-underline-face ((t (:underline t))))
'(erc-inverse-face ((t (:foreground "#151515" :background "#e8e8d3"))))
'(erc-keep-place-indicator-line ((t (:underline (:color "#404040" :style line)))))
'(erc-keep-place-indicator-arrow ((t (:foreground "#cf6a4c"))))
'(erc-header-line ((t (:foreground "#c6b5ed" :background "#1c1c1c"))))
'(erc-header-line-disconnected ((t (:foreground "#cf6a4c" :background "#1c1c1c"))))
;;;; erc: highlighting rules
'(erc-current-nick-face ((t (:foreground "#fad07a" :weight bold))))
'(erc-keyword-face ((t (:foreground "#fad07a" :weight bold))))
'(erc-nick-msg-face ((t (:foreground "#fad07a" :weight bold))))
'(erc-direct-msg-face ((t (:foreground "#cf6a4c"))))
'(erc-pal-face ((t (:foreground "#99ad6a" :weight bold))))
'(erc-fool-face ((t (:foreground "#404040"))))
'(erc-dangerous-host-face ((t (:foreground "#cf6a4c"))))
;;;; css-mode / scss-mode
'(css-proprietary-property ((t (:foreground "#fad07a"))))
'(css-property ((t (:foreground "#e8e8d3"))))
'(css-selector ((t (:foreground "#cf6a4c"))))
;;;; markdown-mode
'(markdown-markup-face ((t (:foreground "#404040"))))
'(markdown-header-face ((t (:inherit bold :foreground "#cf6a4c"))))
'(markdown-code-face ((t (:background "#1c1c1c"))))
;;;; outline
'(outline-1 ((t (:foreground "#e8e8d3" :weight ultra-bold))))
'(outline-2 ((t (:foreground "#8fbfdc"))))
'(outline-3 ((t (:foreground "#99ad6a"))))
'(outline-4 ((t (:foreground "#c6b5ed"))))
'(outline-5 ((t (:foreground "#ffb17a"))))
'(outline-6 ((t (:foreground "#fad07a"))))
'(outline-7 ((t (:foreground "#cf6a4c"))))
'(outline-8 ((t (:foreground "#e8e8d3"))))
;;;; org
'(org-block ((t (:background "#1b1b1b"))))
'(org-block-begin-line ((t (:foreground "#404040" :slant italic :background "#121212"))))
'(org-ellipsis ((t (:underline nil :background "#151515" :foreground "#cf6a4c"))))
'(org-quote ((t (:background "#1c1c1c"))))
'(org-hide ((t (:foreground "#151515"))))
;;;; solaire-mode
'(solaire-mode-line-face ((t (:inherit mode-line :background "#1c1c1c"))))
'(solaire-mode-line-inactive-face ((t (:inherit mode-line-inactive :background "#1c1c1c")))))
;;;###autoload
(when load-file-name
(add-to-list 'custom-theme-load-path
(file-name-as-directory (file-name-directory load-file-name))))
(provide-theme 'minimal)
;;; minimal-theme.el ends here
+4 -1
View File
@@ -21,7 +21,6 @@ set -gx COLORTERM "truecolor"
set -gx DEBUG 1 set -gx DEBUG 1
set -gx GOPATH "$HOME/.go" set -gx GOPATH "$HOME/.go"
set -gx GOCACHE "$HOME/.go/cache" set -gx GOCACHE "$HOME/.go/cache"
set -gx GOROOT /usr/local/go
set -gx OLS_BUILTIN_FOLDER "/home/jason/ThirdParty/ols/builtin" set -gx OLS_BUILTIN_FOLDER "/home/jason/ThirdParty/ols/builtin"
# Direnv # Direnv
@@ -82,6 +81,10 @@ alias bat 'bat --theme="ansi" --paging=never'
alias :q 'exit' alias :q 'exit'
alias files 'thunar .' alias files 'thunar .'
alias fetch 'pfetch' alias fetch 'pfetch'
# Map 'php' directly to FrankenPHP's bundled PHP CLI runtime
alias php="frankenphp php-cli"
# Optional: A shorthand to spin up your local dev server instantly using your Caddyfile
alias phpserve="frankenphp php-server --config Caddyfile"
# Custom shortcuts # Custom shortcuts
alias reload 'source ~/.config/fish/config.fish' alias reload 'source ~/.config/fish/config.fish'
+4 -3
View File
@@ -150,10 +150,11 @@ if [ "$DO_INSTALL" = true ]; then
wget curl ca-certificates gnupg rsync wget curl ca-certificates gnupg rsync
# core utilities & CLI tools # core utilities & CLI tools
git fd jq fzf ripgrep tree direnv make git fd jq fzf ripgrep tree direnv make
bat unzip 7zip tar gzip bzip2 xz ark bat unzip 7zip tar gzip bzip2 xz ark
mpv xfce4-screenshooter xkill xwininfo
xdotool wmctrl
# build & dev tools # build & dev tools
emacs-x11 alacritty base-devel valgrind emacs-x11 alacritty base-devel valgrind go
xfce4-screenshooter xkill xwininfo xdotool wmctrl
) )
MISSING_PACKAGES=() MISSING_PACKAGES=()
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
# ---------------------------------------------------------------------------------
# Steam install recipe
# Target: Void Linux (x86_64 glibc only)
# Enables nonfree + multilib repos, installs Steam, 32-bit runtime libs, GPU drivers
# Usage: GPU=amd|nvidia|intel ./steam.sh (default: amd)
# ---------------------------------------------------------------------------------
set -e
GPU="${GPU:-amd}"
if [ "$(xbps-uhelper arch)" != "x86_64" ]; then
echo "Steam requires x86_64 glibc. Aborting." >&2
exit 1
fi
echo "Enabling nonfree and multilib repositories..."
sudo xbps-install -Sy void-repo-nonfree void-repo-multilib void-repo-multilib-nonfree
sudo xbps-install -Sy # sync the newly added repos
echo "Installing Steam and 32-bit runtime libraries..."
sudo xbps-install -y \
steam \
steam-udev-rules \
libgcc-32bit \
libstdc++-32bit \
libdrm-32bit \
libglvnd-32bit \
mesa-dri \
mesa-dri-32bit \
vulkan-loader \
vulkan-loader-32bit \
alsa-lib-32bit \
libpulseaudio-32bit
echo "Installing GPU drivers ($GPU)..."
case "$GPU" in
amd)
sudo xbps-install -y \
mesa-vulkan-radeon mesa-vulkan-radeon-32bit \
mesa-vaapi
;;
nvidia)
sudo xbps-install -y nvidia nvidia-libs nvidia-libs-32bit
;;
intel)
sudo xbps-install -y \
mesa-vulkan-intel mesa-vulkan-intel-32bit \
intel-video-accel
;;
*)
echo "Unknown GPU '$GPU' (amd|nvidia|intel)" >&2
exit 1
;;
esac
echo "Reloading udev rules..."
sudo udevadm control --reload
sudo udevadm trigger
echo ""
echo "✓ Steam installed. Log out/in (or reboot) before first launch."
echo ""