aboutsummaryrefslogtreecommitdiff
path: root/substrate.el
diff options
context:
space:
mode:
Diffstat (limited to 'substrate.el')
-rw-r--r--substrate.el228
1 files changed, 228 insertions, 0 deletions
diff --git a/substrate.el b/substrate.el
new file mode 100644
index 0000000..6dc93a5
--- /dev/null
+++ b/substrate.el
@@ -0,0 +1,228 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; .⌒. ▗▄▄▖▗ ▖ ▗▖ ▗▄ ▄▄ ▄▄ ▗ ▖▗▄▄ ▄▄ ▄▄▄▖▗▄▄ ▗▖ ▄▄▄▖▗▄▄▖ ;;;
+;;; .# #. ▐ ▐▌▐▌ ▐▌ ▗▘ ▘▐▘ ▘ ▐▘ ▘▐ ▌▐ ▌▐▘ ▘ ▐ ▐ ▝▌ ▐▌ ▐ ▐ ;;;
+;;; / \ ▐▄▄▖▐▐▌▌ ▌▐ ▐ ▝▙▄ ▝▙▄ ▐ ▌▐▄▄▘▝▙▄ ▐ ▐▄▄▘ ▌▐ ▐ ▐▄▄▖ ;;;
+;;; (,,,___,,,) ▐ ▐▝▘▌ ▙▟ ▐ ▝▌ ▝▌▐ ▌▐ ▌ ▝▌ ▐ ▐ ▝▖ ▙▟ ▐ ▐ ;;;
+;;; ) ( ▐▄▄▖▐ ▌▐ ▌ ▚▄▘▝▄▟▘ ▝▄▟▘▝▄▄▘▐▄▄▘▝▄▟▘ ▐ ▐ ▘▐ ▌ ▐ ▐▄▄▖ ;;;
+;;; (___) ;;;
+;;; ;;;
+;;; init.el ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Guardrail
+(when (< emacs-major-version 29)
+ (error "Emacs Substrate only works with Emacs 29 and newer; you have version %s" emacs-major-version))
+
+;;; Custom variables
+
+(defgroup substrate nil "Custom options for substrate")
+(defcustom substrate-initialise-packages t
+ "Initialise the substrate package system (straight.el)"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-enable-windmove t
+ "Enable windmove to hop around windows with ctrl+arrow"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-display-startup-help t
+ "Show a help window on startup"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-enable-which-key t
+ "Use which-key to list available key combos"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-display-line-numbers t
+ "Display line numbers on buffers"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-enable-cua-mode t
+ "Enable CUA mode or not"
+ :type 'boolean :group 'substrate)
+(defcustom substrate-configure-theme t
+ "Configure the default theme (evangelion) as part of the substrate init"
+ :type 'boolean :group 'substrate)
+
+
+(defun substrate-init ()
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;;
+ ;;; Basic settings
+ ;;;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;; Package initialization
+ ;;
+ (when substrate-initialise-packages
+ (defvar bootstrap-version)
+ (let ((bootstrap-file
+ (expand-file-name
+ "straight/repos/straight.el/bootstrap.el"
+ (or (bound-and-true-p straight-base-dir)
+ user-emacs-directory)))
+ (bootstrap-version 7))
+ (unless (file-exists-p bootstrap-file)
+ (with-current-buffer
+ (url-retrieve-synchronously
+ "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
+ 'silent 'inhibit-cookies)
+ (goto-char (point-max))
+ (eval-print-last-sexp)))
+ (load bootstrap-file nil 'nomessage)
+ (setq straight-use-package-by-default t)))
+
+ (setopt initial-major-mode 'fundamental-mode) ; default mode for the *scratch* buffer
+ (setopt display-time-default-load-average nil) ; this information is useless for most
+
+ ;; Automatically reread from disk if the underlying file changes
+ (setopt auto-revert-avoid-polling t)
+ ;; Some systems don't do file notifications well; see
+ ;; https://todo.sr.ht/~ashton314/emacs-bedrock/11
+ (setopt auto-revert-interval 5)
+ (setopt auto-revert-check-vc-info t)
+ (global-auto-revert-mode)
+
+ ;; Save history of minibuffer
+ (savehist-mode)
+
+ ;; Move through windows with Ctrl-<arrow keys>
+ (when substrate-enable-windmove
+ (windmove-default-keybindings 'control)) ; You can use other modifiers here
+
+ ;; Fix archaic defaults
+ (setopt sentence-end-double-space nil)
+
+ ;; Make right-click do something sensible
+ (when (display-graphic-p)
+ (context-menu-mode))
+
+ ;; Don't litter file system with *~ backup files; put them all inside
+ ;; ~/.emacs.d/backup or wherever
+ (defun substrate--backup-file-name (fpath)
+ "Return a new file path of a given file path.
+If the new path's directories does not exist, create them."
+ (let* ((backupRootDir (concat user-emacs-directory "emacs-backup/"))
+ (filePath (replace-regexp-in-string "[A-Za-z]:" "" fpath )) ; remove Windows driver letter in path
+ (backupFilePath (replace-regexp-in-string "//" "/" (concat backupRootDir filePath "~") )))
+ (make-directory (file-name-directory backupFilePath) (file-name-directory backupFilePath))
+ backupFilePath))
+ (setopt make-backup-file-name-function 'substrate--backup-file-name)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Discovery aids
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;; Show the help buffer after startup
+ (when substrate-display-startup-help
+ (add-hook 'after-init-hook 'help-quick))
+
+ ;; which-key: shows a popup of available keybindings when typing a long key
+ ;; sequence (e.g. C-x ...)
+ (use-package which-key
+ :ensure t
+ :if substrate-enable-which-key
+ :config
+ (which-key-mode))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Minibuffer/completion settings
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;; For help, see: https://www.masteringemacs.org/article/understanding-minibuffer-completion
+
+ (setopt enable-recursive-minibuffers t) ; Use the minibuffer whilst in the minibuffer
+ (setopt completion-cycle-threshold 1) ; TAB cycles candidates
+ (setopt completions-detailed t) ; Show annotations
+ (setopt tab-always-indent 'complete) ; When I hit TAB, try to complete, otherwise, indent
+ (setopt completion-styles '(basic initials substring)) ; Different styles to match input to candidates
+
+ (setopt completion-auto-help 'always) ; Open completion always; `lazy' another option
+ (setopt completions-max-height 20) ; This is arbitrary
+ (setopt completions-detailed t)
+ (setopt completions-format 'one-column)
+ (setopt completions-group t)
+ (setopt completion-auto-select 'second-tab) ; Much more eager
+ ;(setopt completion-auto-select t) ; See `C-h v completion-auto-select' for more possible values
+
+ (keymap-set minibuffer-mode-map "TAB" 'minibuffer-complete) ; TAB acts more like how it does in the shell
+
+ ;; For a fancier built-in completion option, try ido-mode,
+ ;; icomplete-vertical, or fido-mode. See also the file extras/base.el
+
+ ;(icomplete-vertical-mode)
+ ;(fido-vertical-mode)
+ ;(setopt icomplete-delay-completions-threshold 4000)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Interface enhancements/defaults
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;; Mode line information
+ (setopt line-number-mode t) ; Show current line in modeline
+ (setopt column-number-mode t) ; Show column as well
+
+ (setopt x-underline-at-descent-line nil) ; Prettier underlines
+ (setopt switch-to-buffer-obey-display-actions t) ; Make switching buffers more consistent
+
+ (setopt show-trailing-whitespace nil) ; By default, don't underline trailing spaces
+ (setopt indicate-buffer-boundaries 'left) ; Show buffer top and bottom in the margin
+
+ ;; Enable horizontal scrolling
+ (setopt mouse-wheel-tilt-scroll t)
+ (setopt mouse-wheel-flip-direction t)
+
+ ;; We won't set these, but they're good to know about
+ ;;
+ ;; (setopt indent-tabs-mode nil)
+ ;; (setopt tab-width 4)
+
+ ;; Misc. UI tweaks
+ (blink-cursor-mode -1) ; Steady cursor
+ (pixel-scroll-precision-mode) ; Smooth scrolling
+
+ ;; Use common keystrokes by default
+ (when substrate-enable-cua-mode
+ (cua-mode))
+
+ ;; Display line numbers in programming mode
+ (when substrate-display-line-numbers
+ (add-hook 'prog-mode-hook 'display-line-numbers-mode)
+ (setopt display-line-numbers-width 3)) ; Set a minimum width
+
+ ;; Nice line wrapping when working with text
+ (add-hook 'text-mode-hook 'visual-line-mode)
+
+ ;; Modes to highlight the current line with
+ (let ((hl-line-hooks '(text-mode-hook prog-mode-hook)))
+ (mapc (lambda (hook) (add-hook hook 'hl-line-mode)) hl-line-hooks))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Tab-bar configuration
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ ;; Show the tab-bar as soon as tab-bar functions are invoked
+ (setopt tab-bar-show 1)
+
+ ;; Add the time to the tab-bar, if visible
+ (add-to-list 'tab-bar-format 'tab-bar-format-align-right 'append)
+ (add-to-list 'tab-bar-format 'tab-bar-format-global 'append)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Theme
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ (use-package evangelion-theme
+ :if substrate-configure-theme
+ :config (load-theme 'evangelion t))
+
+;;; Relegate automatic custom variables to their own file.
+ (setq custom-file (expand-file-name "custom-vars.el"))
+
+) ;; End substrate-init
+
+(provide 'substrate)
+;;; End of substrate.el