summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitch Taylor <mitch@mitchtaylor.xyz>2026-03-22 22:07:22 -0300
committerMitch Taylor <mitch@mitchtaylor.xyz>2026-03-22 22:07:22 -0300
commit04126e9fda050fa753ddc22511e3c3f8dc275f7a (patch)
tree41d9f9276c1e09c1cb86f94133bdf90f041d1ed2
initial commit
-rw-r--r--files/emacs/.emacs.d/early-init.el492
-rw-r--r--files/emacs/.emacs.d/eshell.el207
-rw-r--r--files/emacs/.emacs.d/gnus.el48
-rw-r--r--files/emacs/.emacs.d/init.el578
-rw-r--r--files/emacs/.emacs.d/post-init.el100
-rw-r--r--home.scm309
-rw-r--r--home.scm~307
-rw-r--r--system.scm169
8 files changed, 2210 insertions, 0 deletions
diff --git a/files/emacs/.emacs.d/early-init.el b/files/emacs/.emacs.d/early-init.el
new file mode 100644
index 0000000..c0c97e9
--- /dev/null
+++ b/files/emacs/.emacs.d/early-init.el
@@ -0,0 +1,492 @@
+;;; early-init.el --- Early Init -*- lexical-binding: t; -*-
+
+;; Author: James Cherti <https://www.jamescherti.com/contact/>
+;; URL: https://github.com/jamescherti/minimal-emacs.d
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: maint
+;; Version: 1.4.1
+;; SPDX-License-Identifier: GPL-3.0-or-later
+
+;;; Commentary:
+;; The minimal-emacs.d project is a lightweight and optimized Emacs base
+;; (init.el and early-init.el) that gives you full control over your
+;; configuration. It provides better defaults, an optimized startup, and a clean
+;; foundation for building your own vanilla Emacs setup.
+;;
+;; Building the minimal-emacs.d init.el and early-init.el was the result of
+;; extensive research and testing to fine-tune the best parameters and
+;; optimizations for an Emacs configuration.
+;;
+;; Do not modify this file; instead, modify pre-early-init.el or
+;; post-early-init.el.
+
+;;; Code:
+
+;;; Internal variables
+
+;; Backup of `gc-cons-threshold' and `gc-cons-percentage' before startup.
+(defvar minimal-emacs--backup-gc-cons-threshold gc-cons-threshold)
+(defvar minimal-emacs--backup-gc-cons-percentage gc-cons-percentage)
+
+;; Temporarily raise the garbage collection threshold to its maximum value.
+;; It will be restored later to controlled values.
+(setq gc-cons-threshold most-positive-fixnum)
+(setq gc-cons-percentage 1.0)
+
+;;; Variables
+
+(defvar minimal-emacs-ui-features '()
+ "List of user interface features to enable in minimal Emacs setup.
+This variable holds a list of Emacs UI features that can be enabled:
+- context-menu (Enables the context menu in graphical environments.)
+- tool-bar (Enables the tool bar in graphical environments.)
+- menu-bar (Enables the menu bar in graphical environments.)
+- dialogs (Enables both file dialogs and dialog boxes.)
+- tooltips (Enables tooltips.)")
+
+(defvar minimal-emacs-frame-title-format "%b – Emacs"
+ "Template for displaying the title bar of visible and iconified frame.")
+
+(defvar minimal-emacs-debug (bound-and-true-p init-file-debug)
+ "Non-nil to enable debug.")
+
+(defvar minimal-emacs-optimize-startup-gc t
+ "If non-nil, increase `gc-cons-threshold' during startup to reduce pauses.
+After Emacs finishes loading, `gc-cons-threshold' is restored to the value
+stored in `minimal-emacs-gc-cons-threshold'.")
+
+(defvar minimal-emacs-gc-cons-threshold (* 32 1024 1024)
+ "Value to which `gc-cons-threshold' is set after Emacs startup.
+Ignored if `minimal-emacs-optimize-startup-gc' is nil.")
+
+(defvar minimal-emacs-gc-cons-percentage gc-cons-percentage
+ "Value to which `gc-cons-percentage' is set after Emacs startup.
+Ignored if `minimal-emacs-optimize-startup-gc' is nil.")
+
+(defvar minimal-emacs-gc-cons-threshold-restore-delay nil
+ "Number of seconds to wait before restoring `gc-cons-threshold'.")
+
+(defvar minimal-emacs-optimize-file-name-handler-alist t
+ "Enable optimization of `file-name-handler-alist'.
+When non-nil, this variable activates optimizations to reduce file name handler
+lookups during Emacs startup.")
+
+(defvar minimal-emacs-disable-mode-line-during-startup t
+ "Disable the mode line during startup.
+This reduces visual clutter and slightly enhances startup performance. The
+tradeoff is that the mode line is hidden during the startup phase.")
+
+(defvar minimal-emacs-package-initialize-and-refresh t
+ "Whether to automatically initialize and refresh packages.
+When set to non-nil, Emacs will automatically call `package-initialize' and
+`package-refresh-contents' to set up and update the package system.")
+
+(defvar minimal-emacs-inhibit-redisplay-during-startup nil
+ "Suppress redisplay during startup to improve performance.
+This prevents visual updates while Emacs initializes. The tradeoff is that you
+won't see the progress or activities during the startup process.")
+
+(defvar minimal-emacs-inhibit-message-during-startup nil
+ "Suppress startup messages for a cleaner experience.
+This slightly enhances performance. The tradeoff is that you won't be informed
+of the progress or any relevant activities during startup.")
+
+(defvar minimal-emacs-user-directory user-emacs-directory
+ "Directory beneath minimal-emacs.d files are placed.
+Note that this should end with a directory separator.")
+
+(defvar minimal-emacs-load-pre-early-init t
+ "If non-nil, attempt to load `pre-early-init.el`.")
+
+(defvar minimal-emacs-load-post-early-init t
+ "If non-nil, attempt to load `post-early-init.el`.")
+
+(defvar minimal-emacs-load-pre-init t
+ "If non-nil, attempt to load `pre-init.el`.")
+
+(defvar minimal-emacs-load-post-init t
+ "If non-nil, attempt to load `post-init.el`.")
+
+;;; Load pre-early-init.el
+
+;; Prefer loading newer compiled files
+(setq load-prefer-newer t)
+(when minimal-emacs-debug
+ (setq debug-on-error minimal-emacs-debug))
+
+(defvar minimal-emacs--success nil)
+(defun minimal-emacs--check-success ()
+ "Verify that the Emacs configuration has loaded successfully."
+ (unless minimal-emacs--success
+ (cond
+ ((or (file-exists-p (expand-file-name "~/.emacs.el"))
+ (file-exists-p (expand-file-name "~/.emacs")))
+ (error "Emacs ignored loading 'init.el'. Please ensure that files such as ~/.emacs or ~/.emacs.el do not exist, as they may be preventing Emacs from loading the 'init.el' file"))
+
+ (t
+ (error "Configuration error. Debug by starting Emacs with: --debug-init")))))
+
+(unless noninteractive
+ (add-hook 'emacs-startup-hook #'minimal-emacs--check-success 102))
+
+(defvar minimal-emacs-load-compiled-init-files nil
+ "If non-nil, attempt to load byte-compiled .elc for init files.
+This will enable minimal-emacs to load byte-compiled or possibly native-compiled
+init files for the following initialization files: pre-init.el, post-init.el,
+pre-early-init.el, and post-early-init.el.")
+
+(defun minimal-emacs--remove-el-file-suffix (filename)
+ "Remove the Elisp file suffix from FILENAME and return it (.el, .el.gz...)."
+ (let ((suffixes (mapcar (lambda (ext) (concat ".el" ext))
+ load-file-rep-suffixes)))
+ (catch 'done
+ (dolist (suffix suffixes filename)
+ (when (string-suffix-p suffix filename)
+ (setq filename (substring filename 0 (- (length suffix))))
+ (throw 'done t))))
+ filename))
+
+(defun minimal-emacs-load-user-init (filename)
+ "Execute a file of Lisp code named FILENAME."
+ (let ((init-file (expand-file-name filename
+ minimal-emacs-user-directory)))
+ (if (not minimal-emacs-load-compiled-init-files)
+ (load init-file :no-error (not minimal-emacs-debug) :nosuffix)
+ ;; Remove the file suffix (.el, .el.gz, etc.) to let the `load' function
+ ;; select between .el and .elc files.
+ (setq init-file (minimal-emacs--remove-el-file-suffix init-file))
+ (load init-file :no-error (not minimal-emacs-debug)))))
+
+(when minimal-emacs-load-pre-early-init
+ (minimal-emacs-load-user-init "pre-early-init.el"))
+
+(setq custom-theme-directory
+ (expand-file-name "themes/" minimal-emacs-user-directory))
+
+(setq custom-file (expand-file-name "custom.el" minimal-emacs-user-directory))
+
+;;; Garbage collection
+;; Garbage collection significantly affects startup times. This setting delays
+;; garbage collection during startup but will be reset later.
+
+(defun minimal-emacs--restore-gc-values ()
+ "Restore garbage collection values to minimal-emacs.d values."
+ (setq gc-cons-threshold minimal-emacs-gc-cons-threshold)
+ (setq gc-cons-percentage minimal-emacs-gc-cons-percentage))
+
+(defun minimal-emacs--restore-gc ()
+ "Restore garbage collection settings."
+ (if (and (bound-and-true-p minimal-emacs-gc-cons-threshold-restore-delay)
+ ;; In noninteractive mode, the event loop does not run
+ (not noninteractive))
+ ;; Defer garbage collection during initialization to avoid 2 collections.
+ (run-with-timer minimal-emacs-gc-cons-threshold-restore-delay nil
+ #'minimal-emacs--restore-gc-values)
+ (minimal-emacs--restore-gc-values)))
+
+(if minimal-emacs-optimize-startup-gc
+ ;; `gc-cons-threshold' is managed by minimal-emacs.d
+ (add-hook 'emacs-startup-hook #'minimal-emacs--restore-gc 105)
+ ;; gc-cons-threshold is not managed by minimal-emacs.d.
+ (when (= gc-cons-threshold most-positive-fixnum)
+ (setq gc-cons-threshold minimal-emacs--backup-gc-cons-threshold)
+ (setq gc-cons-percentage minimal-emacs--backup-gc-cons-percentage)))
+
+;;; Native compilation and Byte compilation
+
+(unless (and (featurep 'native-compile)
+ (fboundp 'native-comp-available-p)
+ (native-comp-available-p))
+ ;; Deactivate the `native-compile' feature if it is not available
+ (setq features (delq 'native-compile features)))
+
+(setq native-comp-warning-on-missing-source minimal-emacs-debug
+ native-comp-async-report-warnings-errors (or minimal-emacs-debug 'silent))
+
+(setq jka-compr-verbose minimal-emacs-debug)
+(setq byte-compile-warnings minimal-emacs-debug
+ byte-compile-verbose minimal-emacs-debug)
+
+;;; Miscellaneous
+
+(set-language-environment "UTF-8")
+
+;; Increase how much is read from processes in a single chunk
+(setq read-process-output-max (* 2 1024 1024)) ; 1024kb
+
+(setq process-adaptive-read-buffering nil)
+
+;; Don't ping things that look like domain names.
+(setq ffap-machine-p-known 'reject)
+
+(setq warning-minimum-level (if minimal-emacs-debug :warning :error))
+(setq warning-suppress-types '((lexical-binding)))
+
+(when minimal-emacs-debug
+ (setq message-log-max 16384))
+
+;; In PGTK, this timeout introduces latency. Reducing it from the default 0.1
+;; improves responsiveness of childframes and related packages.
+(when (boundp 'pgtk-wait-for-event-timeout)
+ (setq pgtk-wait-for-event-timeout 0.001))
+
+;; Disable warnings from the legacy advice API. They aren't useful.
+(setq ad-redefinition-action 'accept)
+
+;;; Performance: Miscellaneous options
+
+;; Font compacting can be very resource-intensive, especially when rendering
+;; icon fonts on Windows. This will increase memory usage.
+(setq inhibit-compacting-font-caches t)
+
+(when (not noninteractive)
+ ;; Resizing the Emacs frame can be costly when changing the font. Disable this
+ ;; to improve startup times with fonts larger than the system default.
+ (setq frame-resize-pixelwise t)
+
+ ;; Without this, Emacs will try to resize itself to a specific column size
+ (setq frame-inhibit-implied-resize t)
+
+ ;; A second, case-insensitive pass over `auto-mode-alist' is time wasted.
+ ;; No second pass of case-insensitive search over auto-mode-alist.
+ (setq auto-mode-case-fold nil)
+
+ ;; Reduce *Message* noise at startup. An empty scratch buffer (or the
+ ;; dashboard) is more than enough, and faster to display.
+ (setq inhibit-startup-screen t
+ inhibit-startup-echo-area-message user-login-name)
+ (setq initial-buffer-choice nil
+ inhibit-startup-buffer-menu t
+ inhibit-x-resources t)
+
+ ;; Disable bidirectional text scanning for a modest performance boost.
+ (setq-default bidi-display-reordering 'left-to-right
+ bidi-paragraph-direction 'left-to-right)
+
+ ;; Give up some bidirectional functionality for slightly faster re-display.
+ (setq bidi-inhibit-bpa t)
+
+ ;; Remove "For information about GNU Emacs..." message at startup
+ (advice-add 'display-startup-echo-area-message :override #'ignore)
+
+ ;; Suppress the vanilla startup screen completely. We've disabled it with
+ ;; `inhibit-startup-screen', but it would still initialize anyway.
+ (advice-add 'display-startup-screen :override #'ignore)
+
+ (unless minimal-emacs-debug
+ ;; Unset command line options irrelevant to the current OS. These options
+ ;; are still processed by `command-line-1` but have no effect.
+ (unless (eq system-type 'darwin)
+ (setq command-line-ns-option-alist nil))
+ (unless (memq initial-window-system '(x pgtk))
+ (setq command-line-x-option-alist nil))))
+
+;;; Performance: File-name-handler-alist
+
+(defvar minimal-emacs--old-file-name-handler-alist (default-toplevel-value
+ 'file-name-handler-alist))
+
+(defun minimal-emacs--respect-file-handlers (fn args-left)
+ "Respect file handlers.
+FN is the function and ARGS-LEFT is the same argument as `command-line-1'.
+Emacs processes command-line files very early in startup. These files may
+include special paths like TRAMP paths, so restore `file-name-handler-alist' for
+this stage of initialization."
+ (let ((file-name-handler-alist (if args-left
+ minimal-emacs--old-file-name-handler-alist
+ file-name-handler-alist)))
+ (funcall fn args-left)))
+
+(defun minimal-emacs--restore-file-name-handler-alist ()
+ "Restore `file-name-handler-alist'."
+ (set-default-toplevel-value
+ 'file-name-handler-alist
+ ;; Merge instead of overwrite to preserve any changes made since startup.
+ (delete-dups (append file-name-handler-alist
+ minimal-emacs--old-file-name-handler-alist))))
+
+(when (and minimal-emacs-optimize-file-name-handler-alist
+ (not minimal-emacs-debug))
+ ;; Determine the state of bundled libraries using calc-loaddefs.el. If
+ ;; compressed, retain the gzip handler in `file-name-handler-alist`. If
+ ;; compiled or neither, omit the gzip handler during startup for improved
+ ;; startup and package load time.
+ (set-default-toplevel-value
+ 'file-name-handler-alist
+ (if (locate-file-internal "calc-loaddefs.el" load-path)
+ nil
+ (list (rassq 'jka-compr-handler
+ minimal-emacs--old-file-name-handler-alist))))
+
+ ;; Ensure the new value persists through any current let-binding.
+ (put 'file-name-handler-alist 'initial-value
+ minimal-emacs--old-file-name-handler-alist)
+
+ ;; Emacs processes command-line files very early in startup. These files may
+ ;; include special paths TRAMP. Restore `file-name-handler-alist'.
+ (advice-add 'command-line-1 :around #'minimal-emacs--respect-file-handlers)
+
+ (add-hook 'emacs-startup-hook #'minimal-emacs--restore-file-name-handler-alist
+ 101))
+
+;;; Performance: Inhibit redisplay
+
+(defun minimal-emacs--reset-inhibit-redisplay ()
+ "Reset inhibit redisplay."
+ (setq-default inhibit-redisplay nil)
+ (remove-hook 'post-command-hook #'minimal-emacs--reset-inhibit-redisplay))
+
+(when (and minimal-emacs-inhibit-redisplay-during-startup
+ (not noninteractive)
+ (not minimal-emacs-debug))
+ ;; Suppress redisplay and redraw during startup to avoid delays and
+ ;; prevent flashing an unstyled Emacs frame.
+ (setq-default inhibit-redisplay t)
+ (add-hook 'post-command-hook #'minimal-emacs--reset-inhibit-redisplay -100))
+
+;;; Performance: Inhibit message
+
+(defun minimal-emacs--reset-inhibit-message ()
+ "Reset inhibit message."
+ (setq-default inhibit-message nil)
+ (remove-hook 'post-command-hook #'minimal-emacs--reset-inhibit-message))
+
+(when (and minimal-emacs-inhibit-message-during-startup
+ (not noninteractive)
+ (not minimal-emacs-debug))
+ (setq-default inhibit-message t)
+ (add-hook 'post-command-hook #'minimal-emacs--reset-inhibit-message -100))
+
+;;; Performance: Disable mode-line during startup
+
+(defvar-local minimal-emacs--hidden-mode-line nil
+ "Store the buffer-local value of `mode-line-format' during startup.")
+
+(when (and minimal-emacs-disable-mode-line-during-startup
+ (not noninteractive)
+ (not minimal-emacs-debug))
+ (put 'mode-line-format
+ 'initial-value (default-toplevel-value 'mode-line-format))
+ (setq-default mode-line-format nil)
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
+ (when (local-variable-p 'mode-line-format)
+ (setq minimal-emacs--hidden-mode-line mode-line-format)
+ (setq mode-line-format nil)))))
+
+;;; Restore values
+
+(defun minimal-emacs--startup-load-user-init-file (fn &rest args)
+ "Advice to reset `mode-line-format'. FN and ARGS are the function and args."
+ (unwind-protect
+ ;; Start up as normal
+ (apply fn args)
+ ;; If we don't undo inhibit-{message, redisplay} and there's an error, we'll
+ ;; see nothing but a blank Emacs frame.
+ (when minimal-emacs-inhibit-message-during-startup
+ (setq-default inhibit-message nil))
+ (when minimal-emacs-inhibit-redisplay-during-startup
+ (setq-default inhibit-redisplay nil))
+ ;; Restore the mode-line
+ (when minimal-emacs-disable-mode-line-during-startup
+ (unless (default-toplevel-value 'mode-line-format)
+ (setq-default mode-line-format (get 'mode-line-format
+ 'initial-value)))
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
+ (when (local-variable-p 'minimal-emacs--hidden-mode-line)
+ (setq mode-line-format minimal-emacs--hidden-mode-line)
+ (kill-local-variable 'minimal-emacs--hidden-mode-line)))))))
+
+(advice-add 'startup--load-user-init-file :around
+ #'minimal-emacs--startup-load-user-init-file)
+
+;;; UI elements
+
+(setq frame-title-format minimal-emacs-frame-title-format
+ icon-title-format minimal-emacs-frame-title-format)
+
+;; Disable startup screens and messages
+(setq inhibit-splash-screen t)
+
+;; I intentionally avoid calling `menu-bar-mode', `tool-bar-mode', and
+;; `scroll-bar-mode' because manipulating frame parameters can trigger or queue
+;; a superfluous and potentially expensive frame redraw at startup, depending
+;; on the window system. The variables must also be set to `nil' so users don't
+;; have to call the functions twice to re-enable them.
+(unless (memq 'menu-bar minimal-emacs-ui-features)
+ (push '(menu-bar-lines . 0) default-frame-alist)
+ (unless (memq window-system '(mac ns))
+ (setq menu-bar-mode nil)))
+
+(defun minimal-emacs--setup-toolbar (&rest _)
+ "Setup the toolbar."
+ (when (fboundp 'tool-bar-setup)
+ (advice-remove 'tool-bar-setup #'ignore)
+ (when (bound-and-true-p tool-bar-mode)
+ (funcall 'tool-bar-setup))))
+
+(unless noninteractive
+ (when (fboundp 'tool-bar-setup)
+ ;; Temporarily override the tool-bar-setup function to prevent it from
+ ;; running during the initial stages of startup
+ (advice-add 'tool-bar-setup :override #'ignore)
+
+ (advice-add 'startup--load-user-init-file :after
+ #'minimal-emacs--setup-toolbar)))
+
+(unless (memq 'tool-bar minimal-emacs-ui-features)
+ (push '(tool-bar-lines . 0) default-frame-alist)
+ (setq tool-bar-mode nil))
+
+(setq default-frame-scroll-bars 'right)
+(push '(vertical-scroll-bars) default-frame-alist)
+(push '(horizontal-scroll-bars) default-frame-alist)
+(setq scroll-bar-mode nil)
+
+(unless (memq 'tooltips minimal-emacs-ui-features)
+ (when (bound-and-true-p tooltip-mode)
+ (tooltip-mode -1)))
+
+;; Disable GUIs because they are inconsistent across systems, desktop
+;; environments, and themes, and they don't match the look of Emacs.
+(unless (memq 'dialogs minimal-emacs-ui-features)
+ (setq use-file-dialog nil)
+ (setq use-dialog-box nil))
+
+;;; Security
+(setq gnutls-verify-error t) ; Prompts user if there are certificate issues
+(setq tls-checktrust t) ; Ensure SSL/TLS connections undergo trust verification
+(setq gnutls-min-prime-bits 3072) ; Stronger GnuTLS encryption
+
+;; This results in a more compact output that emphasizes performance
+(setq use-package-expand-minimally t)
+
+(setq use-package-minimum-reported-time (if minimal-emacs-debug 0 0.1))
+(setq use-package-verbose minimal-emacs-debug)
+(setq use-package-always-ensure (not noninteractive))
+(setq use-package-enable-imenu-support t)
+
+;; package.el
+(setq package-enable-at-startup nil) ; Let the init.el file handle this
+(setq package-quickstart-file
+ (expand-file-name "package-quickstart.el" user-emacs-directory))
+(setq package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("gnu" . "https://elpa.gnu.org/packages/")
+ ("nongnu" . "https://elpa.nongnu.org/nongnu/")
+ ("melpa-stable" . "https://stable.melpa.org/packages/")))
+(setq package-archive-priorities '(("gnu" . 99)
+ ("nongnu" . 80)
+ ("melpa" . 70)
+ ("melpa-stable" . 50)))
+
+;;; Load post-early-init.el
+
+(when minimal-emacs-load-post-early-init
+ (minimal-emacs-load-user-init "post-early-init.el"))
+
+;; Local variables:
+;; byte-compile-warnings: (not obsolete free-vars)
+;; End:
+
+;;; early-init.el ends here
diff --git a/files/emacs/.emacs.d/eshell.el b/files/emacs/.emacs.d/eshell.el
new file mode 100644
index 0000000..f48142d
--- /dev/null
+++ b/files/emacs/.emacs.d/eshell.el
@@ -0,0 +1,207 @@
+(use-package eshell
+ :ensure nil
+ :bind
+ (("C-c e" . eshell)
+ ("C-!" . eshell-here))
+ :defer t
+ :config
+ (setq eshell-history-size 100000)
+ (setq eshell-hist-ignoredups t)
+
+
+ ;; MAKE ALL INSTANCES OF ESHELL SHARE/MERGE ITS COMMAND HISTORY
+ ;;
+ (defun emacs-solo/eshell--collect-all-history ()
+ "Return a list of all eshell history entries from all buffers and disk."
+ (let ((history-from-buffers
+ (cl-loop for buf in (buffer-list)
+ when (with-current-buffer buf (derived-mode-p 'eshell-mode))
+ append (with-current-buffer buf
+ (when (boundp 'eshell-history-ring)
+ (ring-elements eshell-history-ring)))))
+ (history-from-file
+ (when (file-exists-p eshell-history-file-name)
+ (with-temp-buffer
+ (insert-file-contents eshell-history-file-name)
+ (split-string (buffer-string) "\n" t)))))
+ (seq-uniq (append history-from-buffers history-from-file))))
+
+ (defun emacs-solo/eshell--save-merged-history ()
+ "Save all eshell buffer histories merged into `eshell-history-file-name`."
+ (let ((all-history (emacs-solo/eshell--collect-all-history)))
+ (with-temp-file eshell-history-file-name
+ (insert (mapconcat #'identity all-history "\n")))))
+
+ (add-hook 'kill-emacs-hook #'emacs-solo/eshell--save-merged-history)
+
+ (add-hook 'eshell-mode-hook
+ (lambda ()
+ (eshell-read-history)))
+
+ ;; MAKES C-c l GIVE AN ICOMPLETE LIKE SEARCH TO HISTORY COMMANDS
+ ;;
+ (defun emacs-solo/eshell-pick-history ()
+ "Show a unified and unique Eshell history from all open sessions + history file.
+Pre-fills the minibuffer with current Eshell input (from prompt to point)."
+ (interactive)
+ (unless (derived-mode-p 'eshell-mode)
+ (user-error "This command must be called from an Eshell buffer"))
+ (let* (;; Safely get current input from prompt to point
+ (bol (save-excursion (eshell-bol) (point)))
+ (eol (point))
+ (current-input (buffer-substring-no-properties bol eol))
+
+ ;; Path to Eshell history file
+ (history-file (expand-file-name eshell-history-file-name
+ eshell-directory-name))
+
+ ;; Read from history file
+ (history-from-file
+ (when (file-exists-p history-file)
+ (with-temp-buffer
+ (insert-file-contents-literally history-file)
+ (split-string (buffer-string) "\n" t))))
+
+ ;; Read from in-memory Eshell buffers
+ (history-from-rings
+ (cl-loop for buf in (buffer-list)
+ when (with-current-buffer buf (derived-mode-p 'eshell-mode))
+ append (with-current-buffer buf
+ (when (bound-and-true-p eshell-history-ring)
+ (ring-elements eshell-history-ring)))))
+
+ ;; Deduplicate and sort
+ (all-history (reverse
+ (seq-uniq
+ (seq-filter (lambda (s) (and s (not (string-empty-p s))))
+ (append history-from-rings history-from-file)))))
+
+ ;; Prompt user with current input as initial suggestion
+ (selection (completing-read "Eshell History: " all-history
+ nil t current-input)))
+
+ (when selection
+ ;; Replace current input with selected history entry
+ (delete-region bol eol)
+ (insert selection))))
+
+
+ ;; GIVES SYNTAX HIGHLIGHTING TO CAT
+ ;;
+ (defun eshell/cat-with-syntax-highlighting (filename)
+ "Like cat(1) but with syntax highlighting.
+ Stole from aweshell"
+ (let ((existing-buffer (get-file-buffer filename))
+ (buffer (find-file-noselect filename)))
+ (eshell-print
+ (with-current-buffer buffer
+ (if (fboundp 'font-lock-ensure)
+ (font-lock-ensure)
+ (with-no-warnings
+ (font-lock-fontify-buffer)))
+ (let ((contents (buffer-string)))
+ (remove-text-properties 0 (length contents) '(read-only nil) contents)
+ contents)))
+ (unless existing-buffer
+ (kill-buffer buffer))
+ nil))
+ (advice-add 'eshell/cat :override #'eshell/cat-with-syntax-highlighting)
+
+
+ ;; LOCAL ESHELL BINDINGS
+ ;;
+ (add-hook 'eshell-mode-hook
+ (lambda ()
+ (local-set-key (kbd "C-c l") #'emacs-solo/eshell-pick-history)
+ (local-set-key (kbd "C-l")
+ (lambda ()
+ (interactive)
+ (eshell/clear 1)))))
+
+ (defun eshell-here ()
+ "Opens up a new shell in the directory associated with the
+current buffer's file. The eshell is renamed to match that
+directory to make multiple eshell windows easier."
+ (interactive)
+ (let* ((parent (if (buffer-file-name)
+ (file-name-directory (buffer-file-name))
+ default-directory))
+ (height (/ (window-total-height) 3))
+ (name (car (last (split-string parent "/" t)))))
+ (split-window-vertically (- height))
+ (other-window 1)
+ (eshell "new")
+ (rename-buffer (concat "*eshell: " name "*"))))
+
+ (defun eshell/x ()
+ (insert "exit")
+ (eshell-send-input)
+ (delete-window))
+
+ (defun fish-path (path max-len)
+ "Return a potentially trimmed-down version of the directory PATH, replacing
+parent directories with their initial characters to try to get the character
+length of PATH (sans directory slashes) down to MAX-LEN."
+ (let* ((components (split-string (abbreviate-file-name path) "/"))
+ (len (+ (1- (length components))
+ (cl-reduce '+ components :key 'length)))
+ (str ""))
+ (while (and (> len max-len)
+ (cdr components))
+ (setq str (concat str
+ (cond ((= 0 (length (car components))) "/")
+ ((= 1 (length (car components)))
+ (concat (car components) "/"))
+ (t
+ (if (string= "."
+ (string (elt (car components) 0)))
+ (concat (substring (car components) 0 2)
+ "/")
+ (string (elt (car components) 0) ?/)))))
+ len (- len (1- (length (car components))))
+ components (cdr components)))
+ (concat str (cl-reduce (lambda (a b) (concat a "/" b)) components))))
+
+ (defun heks-emacs-eshell-prompt ()
+ (defun with-face (str &rest face-plist)
+ (propertize str 'face face-plist))
+ (concat
+ "\n"
+ (with-face user-login-name :inherit 'font-lock-function-name-face)
+ "@"
+ (with-face (system-name) :inherit 'font-lock-function-name-face)
+ ": "
+ (with-face (if (string= (eshell/pwd) (getenv "HOME"))
+ "~" (fish-path (eshell/pwd) 36))
+ :inherit 'font-lock-function-name-face)
+ ": "
+ (with-face
+ (or (ignore-errors (git-prompt-branch-name)) "")
+ :inherit 'font-lock-function-name-face)
+ "\n"
+ (if (= (user-uid) 0)
+ "#"
+ "λ")
+ " "))
+
+ (setopt eshell-prompt-regexp "^[^#λ\n]*[#λ] ")
+ (setopt eshell-prompt-function 'heks-emacs-eshell-prompt)
+ (setopt eshell-highlight-prompt nil)
+
+
+ ;; SET TERM ENV SO MOST PROGRAMS WON'T COMPLAIN
+ ;;
+ (add-hook 'eshell-mode-hook (lambda () (setenv "TERM" "xterm-256color")))
+
+
+ (setq eshell-visual-subcommands
+ '(("podman" "run" "exec" "attach" "top" "logs" "stats" "compose")
+ ("docker" "run" "exec" "attach" "top" "logs" "stats" "compose")
+ ("jj" "resolve" "squash" "split")))
+
+ (setq eshell-visual-commands
+ '("vi" "screen" "top" "htop" "btm" "less" "more" "lynx" "ncftp" "pine" "tin" "trn"
+ "elm" "irssi" "nmtui-connect" "nethack" "vim" "alsamixer" "nvim" "w3m" "psql"
+ "lazygit" "lazydocker" "ncmpcpp" "newsbeuter" "nethack" "mutt" "neomutt" "tmux"
+ "jqp")))
+
diff --git a/files/emacs/.emacs.d/gnus.el b/files/emacs/.emacs.d/gnus.el
new file mode 100644
index 0000000..bded303
--- /dev/null
+++ b/files/emacs/.emacs.d/gnus.el
@@ -0,0 +1,48 @@
+;;; gnus.el --- Gnus Configuration -*- lexical-binding: t; -*-
+(setq gnus-select-method '(nnnil nil))
+
+(setq gnus-secondary-select-methods
+ '((nnimap "disroot"
+ (nnimap-address "disroot.org")
+ (nnimap-server-port "imaps")
+ (nnimap-inbox "INBOX/disroot")
+ (nnimap-user "mitchtaylor@disroot.org")
+ (nnimap-stream ssl))
+ (nnimap "cockmail"
+ (nnimap-address "mail.cock.li")
+ (nnimap-server-port "imaps")
+ (nnimap-inbox "INBOK")
+ (nnimap-user "tractorhearted@cock.li")
+ (nnimap-stream ssl))))
+
+(setq gnus-posting-styles
+ '(( ".*"
+ (address "Mitch Taylor <mitch@mitchtaylor.xyz>")
+ ("X-Message-SMTP-Method"
+ "smtp disroot.org 465 mitchtaylor@disroot.org"))
+ ( "nnimap\\+cockmail:"
+ (name "James Mason")
+ (address "James Mason <tractorhearted@cock.li>")
+ ("X-Message-SMTP-Method"
+ "smtp mail.cock.li 465 tractorhearted@cock.li"))))
+
+(when window-system
+ (setq gnus-sum-thread-tree-indent " ")
+ (setq gnus-sum-thread-tree-root "● ")
+ (setq gnus-sum-thread-tree-false-root "◯ ")
+ (setq gnus-sum-thread-tree-single-indent "◎ ")
+ (setq gnus-sum-thread-tree-vertical "│")
+ (setq gnus-sum-thread-tree-leaf-with-other "├─► ")
+ (setq gnus-sum-thread-tree-single-leaf "╰─► "))
+(setq gnus-summary-line-format
+ (concat
+ "%0{%U%R%z%}"
+ "%3{│%}" "%1{%d%}" "%3{│%}" ;; date
+ " "
+ "%4{%-20,20f%}" ;; name
+ " "
+ "%3{│%}"
+ " "
+ "%1{%B%}"
+ "%s\n"))
+(setq gnus-summary-display-arrow t)
diff --git a/files/emacs/.emacs.d/init.el b/files/emacs/.emacs.d/init.el
new file mode 100644
index 0000000..fc25abe
--- /dev/null
+++ b/files/emacs/.emacs.d/init.el
@@ -0,0 +1,578 @@
+;;; init.el --- Init -*- lexical-binding: t; -*-
+
+;; Author: James Cherti <https://www.jamescherti.com/contact/>
+;; URL: https://github.com/jamescherti/minimal-emacs.d
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: maint
+;; Version: 1.4.1
+;; SPDX-License-Identifier: GPL-3.0-or-later
+
+;;; Commentary:
+;; The minimal-emacs.d project is a lightweight and optimized Emacs base
+;; (init.el and early-init.el) that gives you full control over your
+;; configuration. It provides better defaults, an optimized startup, and a clean
+;; foundation for building your own vanilla Emacs setup.
+;;
+;; Building the minimal-emacs.d init.el and early-init.el was the result of
+;; extensive research and testing to fine-tune the best parameters and
+;; optimizations for an Emacs configuration.
+;;
+;; Do not modify this file; instead, modify pre-init.el or post-init.el.
+
+;;; Code:
+
+;;; Load pre-init.el
+
+(if (fboundp 'minimal-emacs-load-user-init)
+ (when minimal-emacs-load-pre-init
+ (minimal-emacs-load-user-init "pre-init.el"))
+ (error "The early-init.el file failed to load"))
+
+;;; Before package
+
+;; The initial buffer is created during startup even in non-interactive
+;; sessions, and its major mode is fully initialized. Modes like `text-mode',
+;; `org-mode', or even the default `lisp-interaction-mode' load extra packages
+;; and run hooks, which can slow down startup.
+;;
+;; Using `fundamental-mode' for the initial buffer to avoid unnecessary
+;; startup overhead.
+(setq initial-major-mode 'fundamental-mode
+ initial-scratch-message nil)
+
+;; Set-language-environment sets default-input-method, which is unwanted.
+(setq default-input-method nil)
+
+;; Ask the user whether to terminate asynchronous compilations on exit.
+;; This prevents native compilation from leaving temporary files in /tmp.
+(setq native-comp-async-query-on-exit t)
+
+;; Allow for shorter responses: "y" for yes and "n" for no.
+(setq read-answer-short t)
+(if (boundp 'use-short-answers)
+ (setq use-short-answers t)
+ (advice-add 'yes-or-no-p :override #'y-or-n-p))
+
+;;; Undo/redo
+
+(setq undo-limit (* 13 160000)
+ undo-strong-limit (* 13 240000)
+ undo-outer-limit (* 13 24000000))
+
+;;; package.el
+
+(when (and (bound-and-true-p minimal-emacs-package-initialize-and-refresh)
+ (not (bound-and-true-p byte-compile-current-file))
+ (not (or (fboundp 'straight-use-package)
+ (fboundp 'elpaca))))
+ ;; Initialize and refresh package contents again if needed
+ (package-initialize)
+ (unless package-archive-contents
+ (package-refresh-contents))
+ (when (and (version< emacs-version "29.1")
+ (not (package-installed-p 'use-package)))
+ (package-install 'use-package))
+ (require 'use-package))
+
+;;; Minibuffer
+
+(setq enable-recursive-minibuffers t) ; Allow nested minibuffers
+
+;; Keep the cursor out of the read-only portions of the.minibuffer
+(setq minibuffer-prompt-properties
+ '(read-only t intangible t cursor-intangible t face minibuffer-prompt))
+(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
+
+;;; Display and user interface
+
+;; By default, Emacs "updates" its ui more often than it needs to
+(setq which-func-update-delay 1.0)
+(setq idle-update-delay which-func-update-delay) ;; Obsolete in >= 30.1
+
+(defalias #'view-hello-file #'ignore) ; Never show the hello file
+
+;; No beeping or blinking
+(setq visible-bell nil)
+(setq ring-bell-function #'ignore)
+
+;; Position underlines at the descent line instead of the baseline.
+(setq x-underline-at-descent-line t)
+
+(setq truncate-string-ellipsis "…")
+
+(setq display-time-default-load-average nil) ; Omit load average
+
+;;; Show-paren
+
+(setq show-paren-delay 0.1
+ show-paren-highlight-openparen t
+ show-paren-when-point-inside-paren t
+ show-paren-when-point-in-periphery t)
+
+;;; Buffer management
+
+(setq custom-buffer-done-kill t)
+
+;; Disable auto-adding a new line at the bottom when scrolling.
+(setq next-line-add-newlines nil)
+
+;; This setting forces Emacs to save bookmarks immediately after each change.
+;; Benefit: you never lose bookmarks if Emacs crashes.
+(setq bookmark-save-flag 1)
+
+(setq uniquify-buffer-name-style 'forward)
+
+(setq remote-file-name-inhibit-cache 50)
+
+;; Disable fontification during user input to reduce lag in large buffers.
+;; Also helps marginally with scrolling performance.
+(setq redisplay-skip-fontification-on-input t)
+
+;;; Misc
+
+(setq whitespace-line-column nil) ; Use the value of `fill-column'.
+
+;; Disable ellipsis when printing s-expressions in the message buffer
+(setq eval-expression-print-length nil
+ eval-expression-print-level nil)
+
+;; This directs gpg-agent to use the minibuffer for passphrase entry
+(setq epg-pinentry-mode 'loopback)
+
+;; By default, Emacs stores sensitive authinfo credentials as unencrypted text
+;; in your home directory. Use GPG to encrypt the authinfo file for enhanced
+;; security.
+(setq auth-sources (list "~/.authinfo.gpg"))
+
+;;; `display-line-numbers-mode'
+
+(setq-default display-line-numbers-width 3)
+(setq-default display-line-numbers-widen t)
+
+;;; imenu
+
+;; Automatically rescan the buffer for Imenu entries when `imenu' is invoked
+;; This ensures the index reflects recent edits.
+(setq imenu-auto-rescan t)
+
+;; Prevent truncation of long function names in `imenu' listings
+(setq imenu-max-item-length 160)
+
+;;; Tramp
+
+(setq tramp-verbose 1)
+
+;;; Files
+
+;; Delete by moving to trash in interactive mode
+(setq delete-by-moving-to-trash (not noninteractive))
+(setq remote-file-name-inhibit-delete-by-moving-to-trash t)
+
+;; Ignoring this is acceptable since it will redirect to the buffer regardless.
+(setq find-file-suppress-same-file-warnings t)
+
+;; Resolve symlinks to avoid duplicate buffers
+(setq find-file-visit-truename t
+ ;; Automatically follow a symlink to its source if that source is managed
+ ;; by a version control system, rather than asking for permission.
+ vc-follow-symlinks t)
+
+;; Prefer vertical splits over horizontal ones
+(setq split-width-threshold 170
+ split-height-threshold nil)
+
+;;; comint (general command interpreter in a window)
+
+(setq ansi-color-for-comint-mode t
+ comint-prompt-read-only t
+ comint-buffer-maximum-size 4096)
+
+;;; Compilation
+
+(setq compilation-ask-about-save nil
+ compilation-always-kill t
+ compilation-scroll-output 'first-error)
+
+;; Skip confirmation prompts when creating a new file or buffer
+(setq confirm-nonexistent-file-or-buffer nil)
+
+;;; Backup files
+
+;; Disable the creation of lockfiles (e.g., .#filename).
+;; Modern workflows rely on `global-auto-revert-mode' to handle external file
+;; changes gracefully, making the restrictive nature of lockfiles unnecessary.
+(setq create-lockfiles nil)
+
+;; Disable backup files (e.g., filename~). Note that `auto-save-default'
+;; remains enabled by default. Even with `make-backup-files' backups disabled,
+;; Emacs will still generate temporary recovery files (e.g., #filename#) for
+;; unsaved buffers. This protects your active work from sudden crashes while
+;; ensuring the file system is cleaned up immediately upon a successful save.
+(setq make-backup-files nil)
+
+(setq backup-directory-alist
+ `(("." . ,(expand-file-name "backup" user-emacs-directory))))
+(setq tramp-backup-directory-alist backup-directory-alist)
+(setq backup-by-copying-when-linked t)
+(setq backup-by-copying t) ; Backup by copying rather renaming
+(setq delete-old-versions t) ; Delete excess backup versions silently
+(setq version-control t) ; Use version numbers for backup files
+(setq kept-new-versions 5)
+(setq kept-old-versions 5)
+
+;;; VC
+
+(setq vc-git-print-log-follow t)
+(setq vc-git-diff-switches '("--histogram")) ; Faster algorithm for diffing.
+
+;;; Auto save
+
+;; Enable auto-save to safeguard against crashes or data loss. The
+;; `recover-file' or `recover-session' functions can be used to restore
+;; auto-saved data.
+(setq auto-save-no-message t)
+
+(when noninteractive
+ ;; The command line interface
+ (setq enable-dir-local-variables nil)
+ (setq case-fold-search nil))
+
+;; Do not auto-disable auto-save after deleting large chunks of
+;; text.
+(setq auto-save-include-big-deletions t)
+
+(setq auto-save-list-file-prefix
+ (expand-file-name "autosave/" user-emacs-directory))
+(setq tramp-auto-save-directory
+ (expand-file-name "tramp-autosave/" user-emacs-directory))
+
+(setq auto-save-file-name-transforms
+ `(("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'"
+ ,(file-name-concat auto-save-list-file-prefix "tramp-\\2-") sha1)
+ ("\\`/\\([^/]+/\\)*\\([^/]+\\)\\'"
+ ,(file-name-concat auto-save-list-file-prefix "\\2-") sha1)))
+
+;; Ensure the directory for auto-save session logs exists with restricted
+;; permissions.
+(when auto-save-default
+ (let ((auto-save-dir (file-name-directory auto-save-list-file-prefix)))
+ (unless (file-exists-p auto-save-dir)
+ (with-file-modes #o700
+ (make-directory auto-save-dir t)))))
+
+;; Auto save options
+(setq kill-buffer-delete-auto-save-files t)
+
+;; Remove duplicates from the kill ring to reduce clutter
+(setq kill-do-not-save-duplicates t)
+
+;;; Auto revert
+;; Auto-revert in Emacs is a feature that automatically updates the contents of
+;; a buffer to reflect changes made to the underlying file.
+
+;; Revert other buffers (e.g, Dired)
+(setq global-auto-revert-non-file-buffers t)
+(setq global-auto-revert-ignore-modes '(Buffer-menu-mode)) ; Resolve issue #29
+
+;;; recentf
+
+;; `recentf' is an that maintains a list of recently accessed files.
+(setq recentf-max-saved-items 300) ; default is 20
+(setq recentf-max-menu-items 15)
+(setq recentf-auto-cleanup 'mode)
+
+;;; saveplace
+
+;; Enables Emacs to remember the last location within a file upon reopening.
+(setq save-place-file (expand-file-name "saveplace" user-emacs-directory))
+(setq save-place-limit 600)
+
+;;; savehist
+
+;; `savehist-mode' is an Emacs feature that preserves the minibuffer history
+;; between sessions.
+(setq history-length 300)
+(setq savehist-additional-variables
+ '(register-alist ; macros
+ mark-ring global-mark-ring ; marks
+ search-ring regexp-search-ring)) ; searches
+
+;;; Frames and windows
+
+(setq resize-mini-windows 'grow-only)
+
+;; The native border "uses" a pixel of the fringe on the rightmost
+;; splits, whereas `window-divider-mode' does not.
+(setq window-divider-default-bottom-width 1
+ window-divider-default-places t
+ window-divider-default-right-width 1)
+
+;;; Scrolling
+
+;; Enables faster scrolling. This may result in brief periods of inaccurate
+;; syntax highlighting, which should quickly self-correct.
+(setq fast-but-imprecise-scrolling t)
+
+;; Move point to top/bottom of buffer before signaling a scrolling error.
+(setq scroll-error-top-bottom t)
+
+;; Keep screen position if scroll command moved it vertically out of the window.
+(setq scroll-preserve-screen-position t)
+
+;; Emacs recenters the window when the cursor moves past `scroll-conservatively'
+;; lines beyond the window edge. A value over 101 disables recentering; the
+;; default (0) is too eager. Here it is set to 20 for a balanced behavior.
+(setq scroll-conservatively 20)
+
+;; 1. Preventing automatic adjustments to `window-vscroll' for long lines.
+;; 2. Resolving the issue of random half-screen jumps during scrolling.
+(setq auto-window-vscroll nil)
+
+;; Horizontal scrolling
+(setq hscroll-margin 2
+ hscroll-step 1)
+
+;; Emacs 29
+(when (memq 'context-menu minimal-emacs-ui-features)
+ (when (and (display-graphic-p) (fboundp 'context-menu-mode))
+ (add-hook 'after-init-hook #'context-menu-mode)))
+
+;;; Cursor
+
+;; The blinking cursor is distracting and interferes with cursor settings in
+;; some minor modes that try to change it buffer-locally (e.g., Treemacs).
+(when (bound-and-true-p blink-cursor-mode)
+ (blink-cursor-mode -1))
+
+;; Don't blink the paren matching the one at point, it's too distracting.
+(setq blink-matching-paren nil)
+
+;; Reduce rendering/line scan work by not rendering cursors or regions in
+;; non-focused windows.
+(setq highlight-nonselected-windows nil)
+
+;;; Text editing, indent, font, and formatting
+
+;; Avoid automatic frame resizing when adjusting settings.
+(setq global-text-scale-adjust-resizes-frames nil)
+
+;; A longer delay can be annoying as it causes a noticeable pause after each
+;; deletion, disrupting the flow of editing.
+(setq delete-pair-blink-delay 0.03)
+
+;; Continue wrapped lines at whitespace rather than breaking in the
+;; middle of a word.
+(setq-default word-wrap t)
+
+;; Disable wrapping by default due to its performance cost.
+(setq-default truncate-lines t)
+
+;; If enabled and `truncate-lines' is disabled, soft wrapping will not occur
+;; when the window is narrower than `truncate-partial-width-windows' characters.
+(setq truncate-partial-width-windows nil)
+
+;; Configure automatic indentation to be triggered exclusively by newline and
+;; DEL (backspace) characters.
+(setq-default electric-indent-chars '(?\n ?\^?))
+
+;; Prefer spaces over tabs. Spaces offer a more consistent default compared to
+;; 8-space tabs. This setting can be adjusted on a per-mode basis as needed.
+(setq-default indent-tabs-mode nil
+ tab-width 4)
+
+;; Enable indentation and completion using the TAB key
+(setq tab-always-indent 'complete)
+(setq tab-first-completion 'word-or-paren-or-punct)
+
+;; Perf: Reduce command completion overhead.
+(setq read-extended-command-predicate #'command-completion-default-include-p)
+
+;; Enable multi-line commenting which ensures that `comment-indent-new-line'
+;; properly continues comments onto new lines.
+(setq comment-multi-line t)
+
+;; Ensures that empty lines within the commented region are also commented out.
+;; This prevents unintended visual gaps and maintains a consistent appearance.
+(setq comment-empty-lines t)
+
+;; We often split terminals and editor windows or place them side-by-side,
+;; making use of the additional horizontal space.
+(setq-default fill-column 80)
+
+;; Disable the obsolete practice of end-of-line spacing from the typewriter era.
+(setq sentence-end-double-space nil)
+
+;; According to the POSIX, a line is defined as "a sequence of zero or more
+;; non-newline characters followed by a terminating newline".
+(setq require-final-newline t)
+
+;; Eliminate delay before highlighting search matches
+(setq lazy-highlight-initial-delay 0)
+
+;;; Filetype
+
+;; Do not notify the user each time Python tries to guess the indentation offset
+(setq python-indent-guess-indent-offset-verbose nil)
+
+(setq sh-indent-after-continuation 'always)
+
+;;; Dired and ls-lisp
+
+(setq dired-free-space nil
+ dired-dwim-target t ; Propose a target for intelligent moving/copying
+ dired-deletion-confirmer 'y-or-n-p
+ dired-filter-verbose nil
+ dired-recursive-deletes 'top
+ dired-recursive-copies 'always
+ dired-vc-rename-file t
+ dired-create-destination-dirs 'ask
+ ;; Suppress Dired buffer kill prompt for deleted dirs
+ dired-clean-confirm-killing-deleted-buffers nil)
+
+;; This is a higher-level predicate that wraps `dired-directory-changed-p'
+;; with additional logic. This `dired-buffer-stale-p' predicate handles remote
+;; files, wdired, unreadable dirs, and delegates to dired-directory-changed-p
+;; for modification checks.
+(setq auto-revert-remote-files nil)
+(setq dired-auto-revert-buffer 'dired-buffer-stale-p)
+
+;; dired-omit-mode
+(setq dired-omit-verbose nil
+ dired-omit-files (concat "\\`[.]\\'"))
+
+(setq ls-lisp-verbosity nil)
+(setq ls-lisp-dirs-first t)
+
+;;; Ediff
+
+;; Configure Ediff to use a single frame and split windows horizontally
+(setq ediff-window-setup-function 'ediff-setup-windows-plain
+ ediff-split-window-function 'split-window-horizontally)
+
+;;; Help
+
+;; Enhance `apropos' and related functions to perform more extensive searches
+(setq apropos-do-all t)
+
+;; Fixes #11: Prevents help command completion from triggering autoload.
+;; Loading additional files for completion can slow down help commands and may
+;; unintentionally execute initialization code from some libraries.
+(setq help-enable-completion-autoload nil)
+(setq help-enable-autoload nil)
+(setq help-enable-symbol-autoload nil)
+(setq help-window-select t) ;; Focus new help windows when opened
+
+;;; Eglot
+
+(setq eglot-report-progress minimal-emacs-debug) ; Prevent minibuffer spam
+(setq eglot-autoshutdown t) ; Shut down after killing last managed buffer
+
+;; A setting of nil or 0 means Eglot will not block the UI at all, allowing
+;; Emacs to remain fully responsive, although LSP features will only become
+;; available once the connection is established in the background.
+(setq eglot-sync-connect 0)
+
+;; Activate Eglot in cross-referenced non-project files
+(setq eglot-extend-to-xref t)
+
+;; Eglot optimization
+(if minimal-emacs-debug
+ (setq eglot-events-buffer-config '(:size 2000000 :format full))
+ ;; This reduces log clutter to improves performance.
+ (setq jsonrpc-event-hook nil)
+ ;; Reduce memory usage and avoid cluttering *EGLOT events* buffer
+ (setq eglot-events-buffer-size 0) ; Deprecated
+ (setq eglot-events-buffer-config '(:size 0 :format short)))
+
+;;; Flymake
+
+(setq flymake-show-diagnostics-at-end-of-line nil)
+(setq flymake-wrap-around nil)
+
+;;; hl-line-mode
+
+;; Highlighting the current window, reducing clutter and improving performance
+(setq hl-line-sticky-flag nil)
+(setq global-hl-line-sticky-flag nil)
+
+;;; icomplete
+
+;; Do not delay displaying completion candidates in `fido-mode' or
+;; `fido-vertical-mode'
+(setq icomplete-compute-delay 0.01)
+
+;;; flyspell
+
+;; Improves flyspell performance by preventing messages from being displayed for
+;; each word when checking the entire buffer.
+(setq flyspell-issue-message-flag nil)
+(setq flyspell-issue-welcome-flag nil)
+
+;;; ispell
+
+;; In Emacs 30 and newer, disable Ispell completion to avoid annotation errors
+;; when no `ispell' dictionary is set.
+(setq text-mode-ispell-word-completion nil)
+
+(setq ispell-silently-savep t)
+
+;;; ibuffer
+
+(setq ibuffer-formats
+ '((mark modified read-only locked
+ " " (name 55 55 :left :elide)
+ " " (size 8 -1 :right)
+ " " (mode 18 18 :left :elide) " " filename-and-process)
+ (mark " " (name 16 -1) " " filename)))
+
+;;; xref
+
+;; Enable completion in the minibuffer instead of the definitions buffer
+(setq xref-show-definitions-function 'xref-show-definitions-completing-read
+ xref-show-xrefs-function 'xref-show-definitions-completing-read)
+
+;;; abbrev
+
+;; Ensure the abbrev_defs file is stored in the correct location when
+;; `user-emacs-directory' is modified, as it defaults to ~/.emacs.d/abbrev_defs
+;; regardless of the change.
+(setq abbrev-file-name (expand-file-name "abbrev_defs" user-emacs-directory))
+
+(setq save-abbrevs 'silently)
+
+;;; dabbrev
+
+(setq dabbrev-upcase-means-case-search t)
+
+(setq dabbrev-ignored-buffer-modes
+ '(archive-mode image-mode docview-mode tags-table-mode
+ pdf-view-mode tags-table-mode))
+
+(setq dabbrev-ignored-buffer-regexps
+ '(;; - Buffers starting with a space (internal or temporary buffers)
+ "\\` "
+ ;; Tags files such as ETAGS, GTAGS, RTAGS, TAGS, e?tags, and GPATH,
+ ;; including versions with numeric extensions like <123>
+ "\\(?:\\(?:[EG]?\\|GR\\)TAGS\\|e?tags\\|GPATH\\)\\(<[0-9]+>\\)?"))
+
+;;; Remove warnings from narrow-to-region, upcase-region...
+
+(dolist (cmd '(list-timers narrow-to-region narrow-to-page
+ upcase-region downcase-region
+ list-threads erase-buffer scroll-left
+ dired-find-alternate-file set-goal-column))
+ (put cmd 'disabled nil))
+
+;;; Load post init
+
+(when (and minimal-emacs-load-post-init
+ (fboundp 'minimal-emacs-load-user-init))
+ (minimal-emacs-load-user-init "post-init.el"))
+
+(setq minimal-emacs--success t)
+
+;; Local variables:
+;; byte-compile-warnings: (not obsolete free-vars)
+;; End:
+
+;;; init.el ends here
diff --git a/files/emacs/.emacs.d/post-init.el b/files/emacs/.emacs.d/post-init.el
new file mode 100644
index 0000000..ebd061c
--- /dev/null
+++ b/files/emacs/.emacs.d/post-init.el
@@ -0,0 +1,100 @@
+;;; post-init.el --- User Init -*- lexical-binding: t; -*-
+(load-theme 'modus-vivendi)
+
+(repeat-mode 1)
+
+(setq auth-sources '(password-store "~/.authinfo.gpg"))
+(require 'auth-source-pass)
+(auth-source-pass-enable)
+
+(setopt tab-always-indent 'complete
+ read-buffer-completion-ignore-case t
+ read-file-name-completion-ignore-case t
+
+ ;; This *may* need to be set to 'always just so that you don't
+ ;; miss other possible good completions that match the input
+ ;; string.
+ completion-auto-help 'always
+
+ ;; Include more information with completion listings
+ completions-detailed t
+
+ ;; Move focus to the completions window after hitting tab
+ ;; twice.
+ completion-auto-select 'second-tab
+
+ ;; Cycle through completion options vertically, not
+ ;; horizontally.
+ completions-format 'vertical
+
+ ;; Sort recently used completions first.
+ completions-sort 'historical
+
+ ;; Only show up to 10 lines in the completions window.
+ completions-max-height 10
+
+ ;; Don't show the unneeded help string at the top of the
+ ;; completions buffer.
+ completion-show-help nil
+
+ ;; Add more `completion-styles' to improve candidate selection.
+ completion-styles '(basic partial-completion substring initials))
+
+(keymap-set minibuffer-local-map "C-p" #'minibuffer-previous-completion)
+(keymap-set minibuffer-local-map "C-n" #'minibuffer-next-completion)
+
+(completion-preview-mode 1)
+
+(electric-pair-mode 1)
+
+(setq load-prefer-newer t)
+
+(use-package compile-angel
+ :demand t
+ :config
+ (setq compile-angel-verbose nil)
+ (push "/init.el" compile-angel-excluded-files)
+ (push "/early-init.el" compile-angel-excluded-files)
+ (push "/post-init.el" compile-angel-excluded-files)
+ (push "/eshell.el" compile-angel-excluded-files)
+ (push "/gnus.el" compile-angel-excluded-files)
+
+ (compile-angel-on-load-mode 1))
+
+(use-package paren
+ :ensure nil
+ :hook (after-init-hook . show-paren-mode)
+ :custom
+ (show-paren-delay 0)
+ (show-paren-style 'mixed)
+ (show-paren-context-when-offscreen t))
+
+(use-package guix
+ :ensure nil)
+
+(use-package geiser-guile
+ :ensure nil)
+
+(use-package rainbow-delimiters
+ :ensure nil
+ :init
+ (rainbow-delimiters-mode))
+
+(use-package pinentry
+ :ensure nil)
+
+(use-package pass
+ :ensure nil)
+
+(use-package bluetooth
+ :ensure nil)
+
+(use-package enwc
+ :ensure nil
+ :init
+ (setq enwc-default-backend 'nm))
+
+(load-file (expand-file-name "gnus.el" user-emacs-directory))
+(load-file (expand-file-name "eshell.el" user-emacs-directory))
+
+(server-start)
diff --git a/home.scm b/home.scm
new file mode 100644
index 0000000..d6d1d26
--- /dev/null
+++ b/home.scm
@@ -0,0 +1,309 @@
+;; This is a sample Guix Home configuration which can help setup your
+;; home directory in the same declarative manner as Guix System.
+;; For more information, see the Home Configuration section of the manual.
+(define-module (guix-home-config)
+ #:use-module (gnu home)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shells)
+ #:use-module (gnu services)
+ #:use-module (gnu system shadow)
+ #:use-module (gnu packages)
+ #:use-module (gnu home services gnupg)
+ #:use-module (gnu packages gnupg)
+ #:use-module (guix gexp)
+ #:use-module (guix sets)
+ #:use-module (gnu home services sway)
+ #:use-module (gnu packages wm)
+ #:use-module (gnu home services sound)
+ #:use-module (gnu services dbus)
+ #:use-module (gnu system keyboard)
+ #:use-module (gnu home services guix)
+ #:use-module (guix channels)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages terminals)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (gnu home services desktop)
+ #:use-module (gnu home services ssh)
+ #:use-module (gnu home services dotfiles))
+
+(define home-config
+ (home-environment
+ (packages
+ (append
+ (map specification->package
+ '("xorg-server-xwayland"
+
+ "font-google-noto"
+ "font-google-noto-emoji"
+ "font-sarasa-gothic"
+
+ "flatpak"
+ "xdg-desktop-portal"
+ "xdg-desktop-portal-gtk"
+ "xdg-desktop-portal-wlr"
+ "xdg-utils" ;; For "xdg-open, etc
+ "xdg-dbus-proxy"
+ "shared-mime-info"
+
+ "adwaita-icon-theme"
+ "hicolor-icon-theme"
+
+ "icecat"
+ "fuzzel"
+ "wl-clipboard"
+ "mako"
+ "foot"
+ "network-manager-applet"
+
+ "password-store"
+ "pass-otp"
+ "passff-host"
+
+ "mpv"
+ "mpv-mpris"
+ "yt-dlp"
+ "playerctl"
+ "gstreamer"
+ "gst-plugins-base"
+ "gst-plugins-good"
+ "gst-plugins-bad"
+ "gst-plugins-ugly"
+ "gst-libav"
+ "alsa-utils"
+ "pavucontrol"
+
+ "gimp"
+
+ "zathura"
+ "zathura-pdf-mupdf"
+ "ghostscript"
+
+ "syncthing-gtk"
+ "stow"
+
+ "emacs-pgtk"
+ "emacs-guix"
+ "emacs-rainbow-delimiters"
+ "emacs-pinentry"
+ "emacs-pass"
+ "emacs-bluetooth"
+ "emacs-enwc"
+ "emacs-emms"
+ "emacs-compile-angel"
+
+ "pinentry-fuzzel"
+ ))))
+
+ (services
+ (append
+ (list
+ ;; Uncomment the shell you wish to use for your user:
+ ;(service home-fish-service-type)
+ (service home-bash-service-type)
+
+ (simple-service 'custom-bash-service
+ home-bash-service-type
+ (home-bash-extension
+ (variables
+ '(("PS1" . "\\u \\wλ ")))
+ (aliases
+ '(("dbus-sway" . "exec dbus-run-session -- sway")))
+ (bash-profile
+ `(,(local-file "/home/mitch/.guix-home/profile/etc/profile.d/flatpak.sh")))))
+
+ (service home-dotfiles-service-type
+ (home-dotfiles-configuration
+ (layout 'stow)
+ (directories '("./files"))))
+
+ (service home-gpg-agent-service-type
+ (home-gpg-agent-configuration
+ (pinentry-program
+ (file-append pinentry-fuzzel "/bin/pinentry-fuzzel"))))
+
+ (service home-ssh-agent-service-type)
+
+ (service home-openssh-service-type
+ (home-openssh-configuration
+ (add-keys-to-agent "yes")))
+
+ (service home-files-service-type
+ `((".guile" ,%default-dotguile)
+ (".Xdefaults" ,%default-xdefaults)))
+
+ (service home-dbus-service-type)
+ (service home-pipewire-service-type)
+
+ (service home-xdg-configuration-files-service-type
+ `(("gdb/gdbinit" ,%default-gdbinit)
+ ("nano/nanorc" ,%default-nanorc)))
+
+ (simple-service 'extra-packages-service
+ home-channels-service-type
+ (list
+ (channel
+ (name 'nonguix)
+ (url "https://gitlab.com/nonguix/nonguix")
+ (branch "master")
+ (introduction
+ (make-channel-introduction
+ "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
+ (openpgp-fingerprint
+ "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5"))))
+ (channel
+ (name 'mitch)
+ (url
+ "git://git.omnifarious.net/channel.git"))))
+
+ (service home-redshift-service-type
+ (home-redshift-configuration
+ (location-provider 'manual)
+ (latitude 45.27) ;northern hemisphere
+ (longitude -66.06))) ;west of Greenwich
+
+ (service home-unclutter-service-type)
+
+ (service home-sway-service-type
+ (sway-configuration
+ (inputs
+ (list (sway-input
+ (identifier "type:keyboard")
+ (layout (keyboard-layout "us" "dvorak"
+ #:options '("ctrl:nocaps"))))
+ (sway-input
+ (identifier "type:touchpad")
+ (tap #t)
+ (disable-while-typing #t)
+ (extra-content '("middle_emulation enabled"
+ "tap enabled"
+ "dwt enabled"
+ "natural_scroll enabled")))))
+
+ (variables `((mod . "Mod4") ; string
+ (term ; file-append
+ . ,(file-append foot "/bin/foot"))
+ (menu
+ . ,(file-append fuzzel "/bin/fuzzel"))
+ (up . "p")
+ (down . "n")
+ (left . "b")
+ (right . "f")))
+ (gestures
+ '((swipe:3:left . "workspace prev")
+ (swipe:3:right . "workspace next")))
+ (startup-programs
+ `("emacs"
+ "flatpak run com.github.wwmm.easyeffects --service-mode"
+ "dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway"
+ ,#~(string-append
+ #$swayidle "/bin/swayidle -w \\\n "
+ ;; 300: lock screen.
+ "timeout 300 '" #$swaylock "/bin/swaylock "
+ "--indicator-radius 75 \\\n "
+ "-i /home/mitch/Pictures/Backgrounds/lain-dining-room.jpg \\\n "
+ "-f -c 000000' \\\n "
+ ;; 600: lock + screen off.
+ "timeout 600 '" #$sway "/bin/swaymsg \"output * power off\"' \\\n "
+ ;; Resume + sleep.
+ "resume '" #$sway "/bin/swaymsg \"output * power on\"' \\\n "
+ "before-sleep '" #$swaylock "/bin/swaylock -f -c 000000'")))
+ (keybindings
+ `(($mod+return . "exec $term")
+ ($mod+grave . "exec $menu")
+
+ (XF86AudioMute . "exec pactl set-sink-mute @DEFAULT_SINK@ toggle")
+ (XF86AudioLowerVolume . "exec pactl set-sink-volume @DEFAULT_SINK@ -5%")
+ (XF86AudioRaiseVolume . "exec pactl set-sink-volume @DEFAULT_SINK@ +5%")
+ (XF86AudioPlay . "exec playerctl play-pause")
+ (XF86AudioNext . "exec playerctl next")
+ (XF86AudioPrev . "exec playerctl previous")
+ (XF86MonBrightnessDown . "exec brightnessctl set 10%-")
+ (XF86MonBrightnessUp . "exec brightnessctl set 10%+")
+
+ ($mod+apostrophe . "kill")
+ ($mod+Shift+e . "exit")
+ ($mod+Shift+c . "reload")
+
+ ($mod+$left . "focus left")
+ ($mod+$down . "focus down")
+ ($mod+$up . "focus up")
+ ($mod+$right . "focus right")
+ ($mod+Left . "focus left")
+ ($mod+Down . "focus down")
+ ($mod+Up . "focus up")
+ ($mod+Right . "focus right")
+
+ ($mod+Shift+$left . "move left")
+ ($mod+Shift+$down . "move down")
+ ($mod+Shift+$up . "move up")
+ ($mod+Shift+$right . "move right")
+ ($mod+Shift+Left . "move left")
+ ($mod+Shift+Down . "move down")
+ ($mod+Shift+Up . "move up")
+ ($mod+Shift+Right . "move right")
+
+ ($mod+1 . "workspace number 1")
+ ($mod+2 . "workspace number 2")
+ ($mod+3 . "workspace number 3")
+ ($mod+4 . "workspace number 4")
+ ($mod+5 . "workspace number 5")
+ ($mod+6 . "workspace number 6")
+ ($mod+7 . "workspace number 7")
+ ($mod+8 . "workspace number 8")
+ ($mod+9 . "workspace number 9")
+ ($mod+0 . "workspace number 10")
+
+ ($mod+Shift+1 . "move container to workspace number 1")
+ ($mod+Shift+2 . "move container to workspace number 2")
+ ($mod+Shift+3 . "move container to workspace number 3")
+ ($mod+Shift+4 . "move container to workspace number 4")
+ ($mod+Shift+5 . "move container to workspace number 5")
+ ($mod+Shift+6 . "move container to workspace number 6")
+ ($mod+Shift+7 . "move container to workspace number 7")
+ ($mod+Shift+8 . "move container to workspace number 8")
+ ($mod+Shift+9 . "move container to workspace number 9")
+ ($mod+Shift+0 . "move container to workspace number 10")
+
+ ($mod+w . "layout tabbed")
+ ($mod+e . "layout toggle split")
+
+ ($mod+F11 . "fullscreen")
+
+ ($mod+Shift+space . "floating toggle")))
+ (bar
+ (sway-bar
+ (position 'top)
+ (hidden-state 'hide)
+ (status-command
+ (program-file
+ "sway-bar-status"
+ #~(begin
+ (use-modules (ice-9 format)
+ (srfi srfi-19))
+ (let loop ()
+ (let* ((date (date->string
+ (current-date)
+ "~d/~m/~Y (~a) • ~H:~M:~S"))
+ (percent (read (open-input-file "/sys/class/power_supply/BAT1/capacity"))))
+ (close-port (open-input-file "/sys/class/power_supply/BAT1/capacity"))
+ (format #t "~a~%~!"
+ (string-concatenate
+ (list date
+ " | "
+ (number->string percent)
+ "%")))
+ (sleep 1)
+ (loop))))))))
+ (outputs
+ (list (sway-output
+ (identifier '*)
+ (background "/home/mitch/Pictures/Backgrounds/lain-dining-room.jpg"))))
+ (extra-content
+ '("for_window [title=\"Icecat — Sharing Indicator\"] kill"
+ "for_window [title=\".* - mpv$\"] floating enable, sticky enable"
+ "for_window [app_id=\"Icecat\"] inhibit_idle fullscreen"
+ "floating_modifier $mod")))))
+
+ %base-home-services))))
+
+home-config
diff --git a/home.scm~ b/home.scm~
new file mode 100644
index 0000000..1738090
--- /dev/null
+++ b/home.scm~
@@ -0,0 +1,307 @@
+;; This is a sample Guix Home configuration which can help setup your
+;; home directory in the same declarative manner as Guix System.
+;; For more information, see the Home Configuration section of the manual.
+(define-module (guix-home-config)
+ #:use-module (gnu home)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shells)
+ #:use-module (gnu services)
+ #:use-module (gnu system shadow)
+ #:use-module (gnu packages)
+ #:use-module (gnu home services gnupg)
+ #:use-module (gnu packages gnupg)
+ #:use-module (guix gexp)
+ #:use-module (guix sets)
+ #:use-module (gnu home services sway)
+ #:use-module (gnu packages wm)
+ #:use-module (gnu home services sound)
+ #:use-module (gnu services dbus)
+ #:use-module (gnu system keyboard)
+ #:use-module (gnu home services guix)
+ #:use-module (guix channels)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages terminals)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (gnu home services desktop)
+ #:use-module (gnu home services ssh))
+
+(define home-config
+ (home-environment
+ (packages
+ (append
+ (map specification->package
+ '("xorg-server-xwayland"
+
+ "font-google-noto"
+ "font-google-noto-emoji"
+ "font-sarasa-gothic"
+
+ "flatpak"
+ "xdg-desktop-portal"
+ "xdg-desktop-portal-gtk"
+ "xdg-desktop-portal-wlr"
+ "xdg-utils" ;; For "xdg-open, etc
+ "xdg-dbus-proxy"
+ "shared-mime-info"
+
+ "adwaita-icon-theme"
+ "hicolor-icon-theme"
+
+ "icecat"
+ "fuzzel"
+ "wl-clipboard"
+ "mako"
+ "foot"
+ "network-manager-applet"
+
+ "password-store"
+ "pass-otp"
+ "passff-host"
+
+ "mpv"
+ "mpv-mpris"
+ "yt-dlp"
+ "playerctl"
+ "gstreamer"
+ "gst-plugins-base"
+ "gst-plugins-good"
+ "gst-plugins-bad"
+ "gst-plugins-ugly"
+ "gst-libav"
+ "alsa-utils"
+ "pavucontrol"
+
+ "gimp"
+
+ "zathura"
+ "zathura-pdf-mupdf"
+ "ghostscript"
+
+ "syncthing-gtk"
+ "stow"
+
+ "emacs-pgtk"
+ "emacs-guix"
+ "emacs-rainbow-delimiters"
+ "emacs-pinentry"
+ "emacs-pass"
+ "emacs-bluetooth"
+ "emacs-enwc"
+ "emacs-emms"
+ "emacs-compile-angel"
+
+ "pinentry-fuzzel"
+ ))))
+
+ (services
+ (append
+ (list
+ ;; Uncomment the shell you wish to use for your user:
+ ;(service home-fish-service-type)
+ (service home-bash-service-type)
+
+ (simple-service 'custom-bash-service
+ home-bash-service-type
+ (home-bash-extension
+ (variables
+ '(("PS1" . "\\u \\wλ ")))
+ (aliases
+ '(("dbus-sway" . "exec dbus-run-session -- sway")))
+ (bash-profile
+ `(,(local-file "/home/mitch/.guix-home/profile/etc/profile.d/flatpak.sh")))))
+
+ (service home-dotfiles-configuration
+ (layout 'stow)
+ (directories ("./files")))
+
+ (service home-gpg-agent-service-type
+ (home-gpg-agent-configuration
+ (pinentry-program
+ (file-append pinentry-fuzzel "/bin/pinentry-fuzzel"))))
+
+ (service home-ssh-agent-service-type)
+
+ (service home-openssh-service-type
+ (home-openssh-configuration
+ (add-keys-to-agent "yes")))
+
+ (service home-files-service-type
+ `((".guile" ,%default-dotguile)
+ (".Xdefaults" ,%default-xdefaults)))
+
+ (service home-dbus-service-type)
+ (service home-pipewire-service-type)
+
+ (service home-xdg-configuration-files-service-type
+ `(("gdb/gdbinit" ,%default-gdbinit)
+ ("nano/nanorc" ,%default-nanorc)))
+
+ (simple-service 'extra-packages-service
+ home-channels-service-type
+ (list
+ (channel
+ (name 'nonguix)
+ (url "https://gitlab.com/nonguix/nonguix")
+ (branch "master")
+ (introduction
+ (make-channel-introduction
+ "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
+ (openpgp-fingerprint
+ "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5"))))
+ (channel
+ (name 'mitch)
+ (url
+ "git://git.omnifarious.net/channel.git"))))
+
+ (service home-redshift-service-type
+ (home-redshift-configuration
+ (location-provider 'manual)
+ (latitude 45.27) ;northern hemisphere
+ (longitude -66.06))) ;west of Greenwich
+
+ (service home-unclutter-service-type)
+
+ (service home-sway-service-type
+ (sway-configuration
+ (inputs
+ (list (sway-input
+ (identifier "type:keyboard")
+ (layout (keyboard-layout "us" "dvorak"
+ #:options '("ctrl:nocaps"))))
+ (sway-input
+ (identifier "type:touchpad")
+ (tap #t)
+ (disable-while-typing #t)
+ (extra-content '("middle_emulation enabled"
+ "tap enabled"
+ "dwt enabled"
+ "natural_scroll enabled")))))
+
+ (variables `((mod . "Mod4") ; string
+ (term ; file-append
+ . ,(file-append foot "/bin/foot"))
+ (menu
+ . ,(file-append fuzzel "/bin/fuzzel"))
+ (up . "p")
+ (down . "n")
+ (left . "b")
+ (right . "f")))
+ (gestures
+ '((swipe:3:left . "workspace prev")
+ (swipe:3:right . "workspace next")))
+ (startup-programs
+ `("emacs"
+ "flatpak run com.github.wwmm.easyeffects --service-mode"
+ "dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway"
+ ,#~(string-append
+ #$swayidle "/bin/swayidle -w \\\n "
+ ;; 300: lock screen.
+ "timeout 300 '" #$swaylock "/bin/swaylock "
+ "--indicator-radius 75 \\\n "
+ "-i /home/mitch/Pictures/Backgrounds/lain-dining-room.jpg \\\n "
+ "-f -c 000000' \\\n "
+ ;; 600: lock + screen off.
+ "timeout 600 '" #$sway "/bin/swaymsg \"output * power off\"' \\\n "
+ ;; Resume + sleep.
+ "resume '" #$sway "/bin/swaymsg \"output * power on\"' \\\n "
+ "before-sleep '" #$swaylock "/bin/swaylock -f -c 000000'")))
+ (keybindings
+ `(($mod+return . "exec $term")
+ ($mod+grave . "exec $menu")
+
+ (XF86AudioMute . "exec pactl set-sink-mute @DEFAULT_SINK@ toggle")
+ (XF86AudioLowerVolume . "exec pactl set-sink-volume @DEFAULT_SINK@ -5%")
+ (XF86AudioRaiseVolume . "exec pactl set-sink-volume @DEFAULT_SINK@ +5%")
+ (XF86AudioPlay . "exec playerctl play-pause")
+ (XF86AudioNext . "exec playerctl next")
+ (XF86AudioPrev . "exec playerctl previous")
+ (XF86MonBrightnessDown . "exec brightnessctl set 10%-")
+ (XF86MonBrightnessUp . "exec brightnessctl set 10%+")
+
+ ($mod+apostrophe . "kill")
+ ($mod+Shift+e . "exit")
+ ($mod+Shift+c . "reload")
+
+ ($mod+$left . "focus left")
+ ($mod+$down . "focus down")
+ ($mod+$up . "focus up")
+ ($mod+$right . "focus right")
+ ($mod+Left . "focus left")
+ ($mod+Down . "focus down")
+ ($mod+Up . "focus up")
+ ($mod+Right . "focus right")
+
+ ($mod+Shift+$left . "move left")
+ ($mod+Shift+$down . "move down")
+ ($mod+Shift+$up . "move up")
+ ($mod+Shift+$right . "move right")
+ ($mod+Shift+Left . "move left")
+ ($mod+Shift+Down . "move down")
+ ($mod+Shift+Up . "move up")
+ ($mod+Shift+Right . "move right")
+
+ ($mod+1 . "workspace number 1")
+ ($mod+2 . "workspace number 2")
+ ($mod+3 . "workspace number 3")
+ ($mod+4 . "workspace number 4")
+ ($mod+5 . "workspace number 5")
+ ($mod+6 . "workspace number 6")
+ ($mod+7 . "workspace number 7")
+ ($mod+8 . "workspace number 8")
+ ($mod+9 . "workspace number 9")
+ ($mod+0 . "workspace number 10")
+
+ ($mod+Shift+1 . "move container to workspace number 1")
+ ($mod+Shift+2 . "move container to workspace number 2")
+ ($mod+Shift+3 . "move container to workspace number 3")
+ ($mod+Shift+4 . "move container to workspace number 4")
+ ($mod+Shift+5 . "move container to workspace number 5")
+ ($mod+Shift+6 . "move container to workspace number 6")
+ ($mod+Shift+7 . "move container to workspace number 7")
+ ($mod+Shift+8 . "move container to workspace number 8")
+ ($mod+Shift+9 . "move container to workspace number 9")
+ ($mod+Shift+0 . "move container to workspace number 10")
+
+ ($mod+w . "layout tabbed")
+ ($mod+e . "layout toggle split")
+
+ ($mod+F11 . "fullscreen")
+
+ ($mod+Shift+space . "floating toggle")))
+ (bar
+ (sway-bar
+ (position 'top)
+ (hidden-state 'hide)
+ (status-command
+ (program-file
+ "sway-bar-status"
+ #~(begin
+ (use-modules (ice-9 format)
+ (srfi srfi-19))
+ (let loop ()
+ (let* ((date (date->string
+ (current-date)
+ "~d/~m/~Y (~a) • ~H:~M:~S"))
+ (percent (read (open-input-file "/sys/class/power_supply/BAT1/capacity"))))
+ (close-port (open-input-file "/sys/class/power_supply/BAT1/capacity"))
+ (format #t "~a~%~!"
+ (string-concatenate
+ (list date
+ " | "
+ (number->string percent)
+ "%")))
+ (sleep 1)
+ (loop))))))))
+ (outputs
+ (list (sway-output
+ (identifier '*)
+ (background "/home/mitch/Pictures/Backgrounds/lain-dining-room.jpg"))))
+ (extra-content
+ '("for_window [title=\"Icecat — Sharing Indicator\"] kill"
+ "for_window [title=\".* - mpv$\"] floating enable, sticky enable"
+ "for_window [app_id=\"Icecat\"] inhibit_idle fullscreen"
+ "floating_modifier $mod")))))
+
+ %base-home-services))))
+
+home-config
diff --git a/system.scm b/system.scm
new file mode 100644
index 0000000..637f04a
--- /dev/null
+++ b/system.scm
@@ -0,0 +1,169 @@
+;; This is an operating system configuration generated
+;; by the graphical installer.
+;;
+;; Once installation is complete, you can learn and modify
+;; this file to tweak the system configuration, and pass it
+;; to the 'guix system reconfigure' command to effect your
+;; changes.
+
+
+;; Indicate which modules to import to access the variables
+;; used in this configuration.
+(use-modules (gnu)
+ (nongnu packages linux)
+ (nongnu system linux-initrd)
+ (mitch packages tailscale)
+ (mitch services tailscale))
+(use-service-modules cups desktop networking ssh xorg pm avahi dbus mcron)
+(use-package-modules fonts wm)
+
+(operating-system
+ (locale "en_CA.utf8")
+ (timezone "America/Halifax")
+ (keyboard-layout (keyboard-layout "us" "dvorak"
+ #:options '("ctrl:nocaps")))
+ (host-name "claver")
+
+ (kernel linux)
+
+ (firmware (list linux-firmware
+ radeon-firmware))
+
+ ;; The list of user accounts ('root' is implicit).
+ (users (cons* (user-account
+ (name "mitch")
+ (comment "Mitch Taylor")
+ (group "users")
+ (home-directory "/home/mitch")
+ (supplementary-groups '("wheel" "netdev" "audio" "video")))
+ %base-user-accounts))
+
+ ;; Packages installed system-wide. Users can also install packages
+ ;; under their own account: use 'guix search KEYWORD' to search
+ ;; for packages and 'guix install PACKAGE' to install a package.
+ (packages
+ (append
+ (map specification->package
+ '("zile"
+ "git"
+ "gvfs"
+ "brightnessctl"
+ "sway"
+ "wmenu"
+ "foot"
+ "tailscale"
+ "bluez"
+ "blueman"))
+ %base-packages))
+
+ ;; Below is the list of system services. To search for available
+ ;; services, run 'guix system search KEYWORD' in a terminal.
+ (services
+ (append
+ (modify-services %base-services
+ (delete console-font-service-type)
+ (guix-service-type config =>
+ (guix-configuration
+ (inherit config)
+ (extra-options '("--max-jobs=4" "--cores=4"))))
+ (mingetty-service-type config =>
+ (mingetty-configuration
+ (inherit config)
+ ;; Automatically log in as "guest".
+ (auto-login "mitch"))))
+ (list
+ (service elogind-service-type)
+
+ (service console-font-service-type
+ (map (lambda (tty)
+ ;; Use a larger font for HIDPI screens
+ (cons tty (file-append
+ font-terminus
+ "/share/consolefonts/ter-132n")))
+ '("tty1" "tty2" "tty3")))
+
+ (service screen-locker-service-type
+ (screen-locker-configuration
+ (name "swaylock")
+ (program (file-append swaylock "/bin/swaylock"))
+ (using-pam? #t)
+ (using-setuid? #f)))
+
+ polkit-wheel-service
+
+ (service network-manager-service-type)
+ (service wpa-supplicant-service-type) ;; Needed by NetworkManager
+ (service bluetooth-service-type
+ (bluetooth-configuration
+ (auto-enable? #t)))
+ (service usb-modeswitch-service-type)
+
+ (service power-profiles-daemon-service-type)
+ (service thermald-service-type)
+
+ (service x11-socket-directory-service-type)
+
+ (service avahi-service-type)
+ (service udisks-service-type)
+ (service upower-service-type)
+ (service cups-pk-helper-service-type)
+ (service geoclue-service-type)
+ (service polkit-service-type)
+ (service dbus-root-service-type)
+ fontconfig-file-system-service ;; Manage the fontconfig cache
+
+ (service ntp-service-type)
+
+ ;; To configure OpenSSH, pass an 'openssh-configuration'
+ ;; record as a second argument to 'service' below.
+ (service openssh-service-type)
+ (set-xorg-configuration
+ (xorg-configuration (keyboard-layout keyboard-layout)))
+
+ (service tailscaled-service-type)
+
+ (simple-service 'system-cron-jobs
+ mcron-service-type
+ (list
+ ;; Run `guix gc' 5 minutes after midnight every day.
+ ;; Clean up generations older than 2 months and free
+ ;; at least 10G of space.
+ #~(job "5 0 * * *" "guix gc -d 2m -F 10G")))
+
+
+ (simple-service 'add-nonguix-substitutes
+ guix-service-type
+ (guix-extension
+ (substitute-urls
+ (cons* "https://nonguix-proxy.ditigal.xyz"
+ %default-substitute-urls))
+ (authorized-keys
+ (append (list (plain-file "nonguix.pub"
+ "(public-key (ecc (curve Ed25519) (q #C1FD53E5D4CE971933EC50C9F307AE2171A2D3B52C804642A7A35F84F3A4EA98#)))"))
+ %default-authorized-guix-keys)))))))
+
+ (bootloader (bootloader-configuration
+ (bootloader grub-efi-bootloader)
+ (targets
+ (list "/boot/efi"))
+ (keyboard-layout keyboard-layout)))
+
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "bc3f2c7f-d158-40ed-9734-5512d8b146ca"))
+ (target "cryptroot")
+ (type luks-device-mapping))))
+
+ ;; The list of file systems that get "mounted". The unique
+ ;; file system identifiers there ("UUIDs") can be obtained
+ ;; by running 'blkid' in a terminal.
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/cryptroot")
+ (type "btrfs")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "B22C-45CF"
+ 'fat32))
+ (type "vfat")) %base-file-systems)))