From 348507638576563528b6a9ab5091ca906490dd51 Mon Sep 17 00:00:00 2001 From: "Henry J. Webster" Date: Thu, 30 Jul 2026 12:04:12 -0500 Subject: Convert dotfiles to GNU Stow package layout Restructure into per-app stow packages (bash, emacs, mako) whose trees mirror $HOME. Preserve emacs runtime data under the new package path and update .gitignore accordingly. Add README documenting stow usage. Assisted-by: Claude:claude-opus-4-8 --- .bashrc | 6 -- .gitignore | 8 +-- README.md | 26 ++++++++ bash/.bashrc | 6 ++ emacs/.config/emacs/early-init.el | 9 +++ emacs/.config/emacs/init.el | 128 ++++++++++++++++++++++++++++++++++++++ emacs/early-init.el | 9 --- emacs/init.el | 128 -------------------------------------- mako/.config/mako/README.md | 20 ++++++ mako/.config/mako/config | 4 ++ mako/README.md | 20 ------ mako/config | 4 -- 12 files changed, 197 insertions(+), 171 deletions(-) delete mode 100644 .bashrc create mode 100644 README.md create mode 100644 bash/.bashrc create mode 100644 emacs/.config/emacs/early-init.el create mode 100644 emacs/.config/emacs/init.el delete mode 100644 emacs/early-init.el delete mode 100644 emacs/init.el create mode 100644 mako/.config/mako/README.md create mode 100644 mako/.config/mako/config delete mode 100644 mako/README.md delete mode 100644 mako/config diff --git a/.bashrc b/.bashrc deleted file mode 100644 index 44305e9..0000000 --- a/.bashrc +++ /dev/null @@ -1,6 +0,0 @@ -# use emacs when inside emacs -if [ -n "INSIDE_EMACS" ]; then - export EDITOR="emacsclient" -else - export EDITOR="nvim" -fi diff --git a/.gitignore b/.gitignore index b47c821..19acfbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ -# Emacs -emacs/* -!emacs/init.el -!emacs/early-init.el +# Emacs (only track the config, not runtime data) +emacs/.config/emacs/* +!emacs/.config/emacs/init.el +!emacs/.config/emacs/early-init.el # Emacs temp files *~ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d9ff1e --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# dotfiles + +Managed with [GNU Stow](https://www.gnu.org/software/stow/). +Each top-level directory is a stow *package* whose contents mirror the layout under `$HOME`. + +## Install + +This repo lives outside `$HOME`, so pass the target explicitly: + +```sh +cd ~/git/dotfiles +stow -t "$HOME" bash emacs mako +``` + +## Remove + +```sh +cd ~/git/dotfiles +stow -D -t "$HOME" bash emacs mako +``` + +## Restow (after moving/renaming files) + +```sh +stow -R -t "$HOME" bash emacs mako +``` diff --git a/bash/.bashrc b/bash/.bashrc new file mode 100644 index 0000000..44305e9 --- /dev/null +++ b/bash/.bashrc @@ -0,0 +1,6 @@ +# use emacs when inside emacs +if [ -n "INSIDE_EMACS" ]; then + export EDITOR="emacsclient" +else + export EDITOR="nvim" +fi diff --git a/emacs/.config/emacs/early-init.el b/emacs/.config/emacs/early-init.el new file mode 100644 index 0000000..7770747 --- /dev/null +++ b/emacs/.config/emacs/early-init.el @@ -0,0 +1,9 @@ +(setq inhibit-startup-message t) + +;; minimal UI +(menu-bar-mode -1) +(tool-bar-mode -1) +(setq use-dialog-box nil) + +;; be quiet please... +(setq ring-bell-function 'ignore) diff --git a/emacs/.config/emacs/init.el b/emacs/.config/emacs/init.el new file mode 100644 index 0000000..8363cf5 --- /dev/null +++ b/emacs/.config/emacs/init.el @@ -0,0 +1,128 @@ +;;; init.el --- Emacs configuration -*- lexical-binding: t; -*- + +(require 'package) +(add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/") t) +(package-initialize) + +(unless package-archive-contents + (package-refresh-contents)) + +(require 'use-package) +(setq use-package-always-ensure t) + +(scroll-bar-mode -1) +(set-face-attribute 'default nil :height 130) +(setq display-line-numbers-type 'relative) +(global-display-line-numbers-mode 1) +(setq-default indent-tabs-mode nil) + +;; prevent fancy animations from garbling compilation buffers +(advice-add 'compilation-start :around + (lambda (orig &rest args) + (let ((process-connection-type nil)) + (apply orig args)))) + +(setq custom-file (concat user-emacs-directory "custom.el")) +(setq backup-directory-alist `(("." . ,(concat user-emacs-directory + "backups")))) + +(use-package ibuffer + :custom + (ibuffer-expert t) + (ibuffer-show-empty-filter-groups nil) + :hook (ibuffer-mode . ibuffer-auto-mode)) + +(use-package evil + :init + (setq evil-want-keybinding nil) + (setq evil-undo-system 'undo-redo) + :config + (evil-set-leader '(normal visual) (kbd "SPC")) + (evil-define-key '(normal visual) 'global + (kbd "bi") #'ibuffer) + (evil-mode 1)) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) + +;; TODO: make new custom theme based on this... +;; this theme doesn't have ANSI colors for vterm +;; (use-package vs-dark-theme +;; :config +;; (load-theme 'vs-dark t)) + +(load-theme 'modus-vivendi t) + +;; needs pgtk/GTK build +;; TODO: this is crashing my emacs :( +;;(add-to-list 'default-frame-alist '(alpha-background . 80)) +;;(set-frame-parameter nil 'alpha-background 75) + +;;;; dev + + +(use-package vterm + ;; provided by Nix (emacsPackages.vterm) + :ensure nil + :commands vterm + :init + (evil-define-key 'normal 'global (kbd "ot") #'vterm)) + +(use-package apheleia + :config + (add-to-list 'apheleia-mode-alist '(scheme-mode . lisp-indent)) + (apheleia-global-mode +1)) + + +;;;;; markdown +(use-package markdown-mode + :mode ("\\.md\\'" . gfm-mode) + :hook (markdown-mode . flyspell-mode)) + +(setq ispell-program-name "aspell" + ispell-dictionary "en_US") +(add-hook 'markdown-mode-hook #'flyspell-mode) + +(use-package nix-ts-mode + :mode "\\.nix\\'") + +;;;;; zig +;; grammar NOT from Nix: nixpkgs builds maxxnino/tree-sitter-zig, but +;; zig-ts-mode needs the tree-sitter-grammars variant. Install it with +;; `C-u M-x zig-ts-install-grammars' (lands in ~/.config/emacs/tree-sitter/). +;; apheleia formats via `zig fmt' (zig must be on PATH) +(use-package zig-ts-mode + :mode "\\.zig\\'") + +;;;;; javascript +;; grammar provided by Nix (treesit-grammars tree-sitter-javascript); +;; apheleia formats via prettier (needs prettier on PATH) +(use-package js + :ensure nil + :mode ("\\.js\\'" . js-ts-mode) + :custom (js-indent-level 2)) + +;;;;; scheme +(use-package geiser-guile) + +(use-package rainbow-delimiters + :hook + (scheme-mode . rainbow-delimiters-mode) + (emacs-lisp-mode . rainbow-delimiters-mode)) + +(add-hook 'scheme-mode-hook #'electric-pair-local-mode) + +;;;;; elisp +(add-hook 'emacs-lisp-mode-hook #'outline-minor-mode) +(add-hook 'emacs-lisp-mode-hook #'electric-pair-local-mode) + +;;;;; c + +;; TODO: I truly do not understand the interaction +;; between this and apheleia / clang format +(setq-default c-default-style "k&r" + c-basic-offset 4) + diff --git a/emacs/early-init.el b/emacs/early-init.el deleted file mode 100644 index 7770747..0000000 --- a/emacs/early-init.el +++ /dev/null @@ -1,9 +0,0 @@ -(setq inhibit-startup-message t) - -;; minimal UI -(menu-bar-mode -1) -(tool-bar-mode -1) -(setq use-dialog-box nil) - -;; be quiet please... -(setq ring-bell-function 'ignore) diff --git a/emacs/init.el b/emacs/init.el deleted file mode 100644 index 8363cf5..0000000 --- a/emacs/init.el +++ /dev/null @@ -1,128 +0,0 @@ -;;; init.el --- Emacs configuration -*- lexical-binding: t; -*- - -(require 'package) -(add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") t) -(package-initialize) - -(unless package-archive-contents - (package-refresh-contents)) - -(require 'use-package) -(setq use-package-always-ensure t) - -(scroll-bar-mode -1) -(set-face-attribute 'default nil :height 130) -(setq display-line-numbers-type 'relative) -(global-display-line-numbers-mode 1) -(setq-default indent-tabs-mode nil) - -;; prevent fancy animations from garbling compilation buffers -(advice-add 'compilation-start :around - (lambda (orig &rest args) - (let ((process-connection-type nil)) - (apply orig args)))) - -(setq custom-file (concat user-emacs-directory "custom.el")) -(setq backup-directory-alist `(("." . ,(concat user-emacs-directory - "backups")))) - -(use-package ibuffer - :custom - (ibuffer-expert t) - (ibuffer-show-empty-filter-groups nil) - :hook (ibuffer-mode . ibuffer-auto-mode)) - -(use-package evil - :init - (setq evil-want-keybinding nil) - (setq evil-undo-system 'undo-redo) - :config - (evil-set-leader '(normal visual) (kbd "SPC")) - (evil-define-key '(normal visual) 'global - (kbd "bi") #'ibuffer) - (evil-mode 1)) - -(use-package evil-collection - :after evil - :config - (evil-collection-init)) - -;; TODO: make new custom theme based on this... -;; this theme doesn't have ANSI colors for vterm -;; (use-package vs-dark-theme -;; :config -;; (load-theme 'vs-dark t)) - -(load-theme 'modus-vivendi t) - -;; needs pgtk/GTK build -;; TODO: this is crashing my emacs :( -;;(add-to-list 'default-frame-alist '(alpha-background . 80)) -;;(set-frame-parameter nil 'alpha-background 75) - -;;;; dev - - -(use-package vterm - ;; provided by Nix (emacsPackages.vterm) - :ensure nil - :commands vterm - :init - (evil-define-key 'normal 'global (kbd "ot") #'vterm)) - -(use-package apheleia - :config - (add-to-list 'apheleia-mode-alist '(scheme-mode . lisp-indent)) - (apheleia-global-mode +1)) - - -;;;;; markdown -(use-package markdown-mode - :mode ("\\.md\\'" . gfm-mode) - :hook (markdown-mode . flyspell-mode)) - -(setq ispell-program-name "aspell" - ispell-dictionary "en_US") -(add-hook 'markdown-mode-hook #'flyspell-mode) - -(use-package nix-ts-mode - :mode "\\.nix\\'") - -;;;;; zig -;; grammar NOT from Nix: nixpkgs builds maxxnino/tree-sitter-zig, but -;; zig-ts-mode needs the tree-sitter-grammars variant. Install it with -;; `C-u M-x zig-ts-install-grammars' (lands in ~/.config/emacs/tree-sitter/). -;; apheleia formats via `zig fmt' (zig must be on PATH) -(use-package zig-ts-mode - :mode "\\.zig\\'") - -;;;;; javascript -;; grammar provided by Nix (treesit-grammars tree-sitter-javascript); -;; apheleia formats via prettier (needs prettier on PATH) -(use-package js - :ensure nil - :mode ("\\.js\\'" . js-ts-mode) - :custom (js-indent-level 2)) - -;;;;; scheme -(use-package geiser-guile) - -(use-package rainbow-delimiters - :hook - (scheme-mode . rainbow-delimiters-mode) - (emacs-lisp-mode . rainbow-delimiters-mode)) - -(add-hook 'scheme-mode-hook #'electric-pair-local-mode) - -;;;;; elisp -(add-hook 'emacs-lisp-mode-hook #'outline-minor-mode) -(add-hook 'emacs-lisp-mode-hook #'electric-pair-local-mode) - -;;;;; c - -;; TODO: I truly do not understand the interaction -;; between this and apheleia / clang format -(setq-default c-default-style "k&r" - c-basic-offset 4) - diff --git a/mako/.config/mako/README.md b/mako/.config/mako/README.md new file mode 100644 index 0000000..7378bb2 --- /dev/null +++ b/mako/.config/mako/README.md @@ -0,0 +1,20 @@ +# mako - wayland notification daemon + +## Configuration + +### Location +`~/.config/mako/config` + +### How to Reload + +``` sh +makoctl reload +``` + +## Test +This requires `libnotify`. + +``` sh +notify-send "Title" "This is a test notification." +``` + diff --git a/mako/.config/mako/config b/mako/.config/mako/config new file mode 100644 index 0000000..9a0fdb9 --- /dev/null +++ b/mako/.config/mako/config @@ -0,0 +1,4 @@ +default-timeout=5000 +background-color=#1e1e1e +border-color=#505050 +margin=14 \ No newline at end of file diff --git a/mako/README.md b/mako/README.md deleted file mode 100644 index 7378bb2..0000000 --- a/mako/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# mako - wayland notification daemon - -## Configuration - -### Location -`~/.config/mako/config` - -### How to Reload - -``` sh -makoctl reload -``` - -## Test -This requires `libnotify`. - -``` sh -notify-send "Title" "This is a test notification." -``` - diff --git a/mako/config b/mako/config deleted file mode 100644 index 9a0fdb9..0000000 --- a/mako/config +++ /dev/null @@ -1,4 +0,0 @@ -default-timeout=5000 -background-color=#1e1e1e -border-color=#505050 -margin=14 \ No newline at end of file -- cgit v1.3