mirror of
https://git.sr.ht/~ashton314/emacs-bedrock
synced 2024-09-28 15:20:36 +02:00
254 lines
10 KiB
EmacsLisp
254 lines
10 KiB
EmacsLisp
;;; ________ _______ __ __
|
|
;;; / | / \ / | / |
|
|
;;; $$$$$$$$/ _____ ____ ______ _______ _______ $$$$$$$ | ______ ____$$ | ______ ______ _______$$ | __
|
|
;;; $$ |__ / \/ \ / \ / |/ | $$ |__$$ |/ \ / $$ |/ \ / \ / $$ | / |
|
|
;;; $$ | $$$$$$ $$$$ |$$$$$$ /$$$$$$$//$$$$$$$/ $$ $$</$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$/$$ |_/$$/
|
|
;;; $$$$$/ $$ | $$ | $$ |/ $$ $$ | $$ \ $$$$$$$ $$ $$ $$ | $$ $$ | $$/$$ | $$ $$ | $$ $$<
|
|
;;; $$ |_____$$ | $$ | $$ /$$$$$$$ $$ \_____ $$$$$$ | $$ |__$$ $$$$$$$$/$$ \__$$ $$ | $$ \__$$ $$ \_____$$$$$$ \
|
|
;;; $$ $$ | $$ | $$ $$ $$ $$ / $$/ $$ $$/$$ $$ $$ $$ | $$ $$/$$ $$ | $$ |
|
|
;;; $$$$$$$$/$$/ $$/ $$/ $$$$$$$/ $$$$$$$/$$$$$$$/ $$$$$$$/ $$$$$$$/ $$$$$$$/$$/ $$$$$$/ $$$$$$$/$$/ $$/
|
|
|
|
;;; Minimal init.el
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Basic settings
|
|
;;; - Discovery aids
|
|
;;; - Minibuffer/completion settings
|
|
;;; - Interface enhancements/defaults
|
|
;;; - Tab-bar configuration
|
|
;;; - Theme
|
|
;;; - Optional extras
|
|
;;; - Built-in customization framework
|
|
|
|
;;; Guardrail
|
|
|
|
(when (< emacs-major-version 29)
|
|
(error (format "Emacs Bedrock only works with Emacs 29 and newer; you have version ~a" emacs-major-version)))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Basic settings
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Package initialization
|
|
;;
|
|
;; We'll stick to the built-in GNU and non-GNU ELPAs (Emacs Lisp Package
|
|
;; Archive) for the base install, but there are some other ELPAs you could look
|
|
;; at if you want more packages. MELPA in particular is very popular. See
|
|
;; instructions at:
|
|
;;
|
|
;; https://melpa.org/#/getting-started
|
|
;;
|
|
;; You can simply uncomment the following if you'd like to get started with
|
|
;; MELPA packages quickly:
|
|
;;
|
|
;; (with-eval-after-load 'package
|
|
;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t))
|
|
|
|
;; If you want to turn off the welcome screen, uncomment this
|
|
;(setopt inhibit-splash-screen 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>
|
|
(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 bedrock--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 "~/.emacs.d/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 'bedrock--backup-file-name)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Discovery aids
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Show the help buffer after startup
|
|
(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
|
|
: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
|
|
(cua-mode)
|
|
|
|
;; Display line numbers in programming mode
|
|
(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)
|
|
(setopt display-time-format "%a %F %T")
|
|
(setopt display-time-interval 1)
|
|
(display-time-mode)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Theme
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package emacs
|
|
:config
|
|
(load-theme 'modus-vivendi)) ; for light theme, use modus-operandi
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Optional extras
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Uncomment the (load-file …) lines or copy code from the extras/ elisp files
|
|
;; as desired
|
|
|
|
;; UI/UX enhancements mostly focused on minibuffer and autocompletion interfaces
|
|
;; These ones are *strongly* recommended!
|
|
;(load-file (expand-file-name "extras/base.el" user-emacs-directory))
|
|
|
|
;; Packages for software development
|
|
;(load-file (expand-file-name "extras/dev.el" user-emacs-directory))
|
|
|
|
;; Vim-bindings in Emacs (evil-mode configuration)
|
|
;(load-file (expand-file-name "extras/vim-like.el" user-emacs-directory))
|
|
|
|
;; Org-mode configuration
|
|
;; WARNING: need to customize things inside the elisp file before use! See
|
|
;; the file extras/org-intro.txt for help.
|
|
;(load-file (expand-file-name "extras/org.el" user-emacs-directory))
|
|
|
|
;; Email configuration in Emacs
|
|
;; WARNING: needs the `mu' program installed; see the elisp file for more
|
|
;; details.
|
|
;(load-file (expand-file-name "extras/email.el" user-emacs-directory))
|
|
|
|
;; Tools for academic researchers
|
|
;(load-file (expand-file-name "extras/researcher.el" user-emacs-directory))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Built-in customization framework
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(custom-set-variables
|
|
;; custom-set-variables was added by Custom.
|
|
;; If you edit it by hand, you could mess it up, so be careful.
|
|
;; Your init file should contain only one such instance.
|
|
;; If there is more than one, they won't work right.
|
|
'(package-selected-packages '(which-key)))
|
|
(custom-set-faces
|
|
;; custom-set-faces was added by Custom.
|
|
;; If you edit it by hand, you could mess it up, so be careful.
|
|
;; Your init file should contain only one such instance.
|
|
;; If there is more than one, they won't work right.
|
|
)
|