diff options
Diffstat (limited to 'share/home/emacs')
| -rw-r--r-- | share/home/emacs/default.nix | 2 | ||||
| -rw-r--r-- | share/home/emacs/emacs.el | 144 | ||||
| -rw-r--r-- | share/home/emacs/emacs.org | 155 |
3 files changed, 231 insertions, 70 deletions
diff --git a/share/home/emacs/default.nix b/share/home/emacs/default.nix index 6c40b78..fbef3f1 100644 --- a/share/home/emacs/default.nix +++ b/share/home/emacs/default.nix @@ -1,7 +1,7 @@ { pkgs, ... }: let my-emacs = pkgs.emacsWithPackagesFromUsePackage { - config = ./emacs.el; + config = ./emacs.org; defaultInitFile = true; package = pkgs.emacs-pgtk; alwaysEnsure = true; diff --git a/share/home/emacs/emacs.el b/share/home/emacs/emacs.el index 3baa19b..8eb5a89 100644 --- a/share/home/emacs/emacs.el +++ b/share/home/emacs/emacs.el @@ -1,18 +1,55 @@ ;; -*- lexical-binding: t -*- ;;; emacs-config --- My emacs config +;;; ;;; Commentary: +;;; Various resources were used to hack together this config: +;;; - https://sanemacs.com/ +;;; - https://rossabaker.com/configs/emacs/ +;;; ;;; Code: -;; Lots of stuff copied from Sanemacs version 0.3.2 -;; https://sanemacs.com/ -;;; For performance -(setq gc-cons-threshold 100000000) -(setq read-process-output-max (* 1024 1024)) ;; 1mb +;;; Early stuff +(use-package benchmark-init + :ensure t + :demand t + :hook (after-init . benchmark-init/deactivate) + :config + (benchmark-init/activate)) + +;;; GC +(use-package gcmh + :ensure t + :diminish + :init (setq gc-cons-threshold (* 80 1024 1024)) + :hook (emacs-startup . gcmh-mode)) + +;; Trusted connections? +(use-package gnutls + :defer t + :custom + (gnutls-verify-error t)) +(use-package no-littering + :ensure t + :init + (setq no-littering-etc-directory "~/.cache/emacs/etc/" + no-littering-var-directory "~/.cache/emacs/var/") + (when (fboundp 'startup-redirect-eln-cache) + (startup-redirect-eln-cache + (convert-standard-filename + (expand-file-name "eln-cache/" no-littering-var-directory))))) + +;;; use-package keywords +(use-package bind-key + :demand t + :bind + (:prefix-map rab/files-map + :prefix "C-c f") + :bind + (:prefix-map rab/toggles-map + :prefix "C-c t")) -(add-hook 'after-init-hook #'(lambda () - ;; restore after startup - (setq gc-cons-threshold 800000))) +(use-package diminish :ensure t) ;;; Disable menu-bar, tool-bar, and scroll-bar. (if (fboundp 'menu-bar-mode) @@ -22,11 +59,6 @@ (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) -;;; Fix this bug: -;;; https://www.reddit.com/r/emacs/comments/cueoug/the_failed_to_download_gnu_archive_is_a_pretty/ -(when (version< emacs-version "26.3") - (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")) - ;;; Setup package.el (require 'package) (setq package-enable-at-startup nil) @@ -49,66 +81,22 @@ (setq ring-bell-function 'ignore) ; Disable bell sound (fset 'yes-or-no-p 'y-or-n-p) ; y-or-n-p makes answering questions faster (show-paren-mode 1) ; Show closing parens by default -(setq linum-format "%4d ") ; Line number format -(delete-selection-mode 1) ; Selected text will be overwritten when you start typing (global-auto-revert-mode t) ; Auto-update buffer if file has changed on disk -(use-package undo-tree ; Enable undo-tree, sane undo/redo behavior - :init (global-undo-tree-mode) - :config (setq-default undo-tree-auto-save-history nil)) -(add-hook 'before-save-hook - 'delete-trailing-whitespace) ; Delete trailing whitespace on save -(add-hook 'prog-mode-hook ; Show line numbers in programming modes - (if (and (fboundp 'display-line-numbers-mode) (display-graphic-p)) - #'display-line-numbers-mode - #'linum-mode)) +(setopt create-lockfiles nil) -(defun sanemacs/backward-kill-word () - (interactive "*") - (push-mark) - (backward-word) - (delete-region (point) (mark))) +(use-package display-line-numbers + :custom + (display-line-numbers-widen t) + :hook + ((prog-mode conf-mode) . display-line-numbers-mode)) -;;; Keybindings -(global-set-key [mouse-3] 'mouse-popup-menubar-stuff) ; Gives right-click a context menu -(global-set-key (kbd "C->") 'indent-rigidly-right-to-tab-stop) ; Indent selection by one tab length -(global-set-key (kbd "C-<") 'indent-rigidly-left-to-tab-stop) ; De-indent selection by one tab length -(global-set-key (kbd "M-DEL") 'sanemacs/backward-kill-word) ; Kill word without copying it to your clipboard -(global-set-key (kbd "C-DEL") 'sanemacs/backward-kill-word) ; Kill word without copying it to your clipboard - -;;; Offload the custom-set-variables to a separate file -;;; This keeps your init.el neater and you have the option -;;; to gitignore your custom.el if you see fit. -(setq custom-file (expand-file-name "custom.el" user-emacs-directory)) -(unless (file-exists-p custom-file) - (write-region "" nil custom-file)) -;;; Load custom file. Don't hide errors. Hide success message -(load custom-file nil t) - -;;; Put Emacs auto-save and backup files to /tmp/ or C:/Temp/ -(defconst emacs-tmp-dir (expand-file-name (format "emacs%d" (user-uid)) temporary-file-directory)) -(setq - backup-by-copying t ; Avoid symlinks - delete-old-versions t - kept-new-versions 6 - kept-old-versions 2 - version-control t - auto-save-list-file-prefix emacs-tmp-dir - auto-save-file-name-transforms `((".*" ,emacs-tmp-dir t)) ; Change autosave dir to tmp - backup-directory-alist `((".*" . ,emacs-tmp-dir))) - -;;; Lockfiles unfortunately cause more pain than benefit -(setq create-lockfiles nil) +(use-package hl-line + :hook (on-first-buffer . global-hl-line-mode)) ;;; Load wheatgrass as the default theme if one is not loaded already - (if (not custom-enabled-themes) (load-theme 'wheatgrass t)) -(defun reload-config () - (interactive) - (load-file (expand-file-name "init.el" user-emacs-directory))) - - ;; Autopairs (electric-pair-mode 1) @@ -117,6 +105,10 @@ :config (evil-mode 1)) +(use-package envrc + :ensure t + :hook (on-first-file . envrc-global-mode)) + (use-package nix-mode :mode "\\.nix\\'") @@ -130,11 +122,25 @@ (use-package company :init (global-company-mode)) -(use-package projectile +(use-package helm :init + (helm-mode 1) + :config + (setq helm-completion-style 'emacs)) + +(use-package fussy + :config + (push 'fussy completion-styles) + (setq + ;; For example, project-find-file uses 'project-files which uses + ;; substring completion by default. Set to nil to make sure it's using + ;; flx. + completion-category-defaults nil + completion-category-overrides nil)) + +(use-package projectile + :bind-keymap ("C-c p" . projectile-command-map) + :config (projectile-mode +1)) -(use-package helm - :init - (helm-mode 1)) ;;; emacs.el ends here diff --git a/share/home/emacs/emacs.org b/share/home/emacs/emacs.org new file mode 100644 index 0000000..aa5dbae --- /dev/null +++ b/share/home/emacs/emacs.org @@ -0,0 +1,155 @@ +#+TITLE: Miran Bastaja's Emacs Configuration +#+PROPERTY: header-args :tangle init.el +#+TOC: headlines 2 + +* Preface + +** Inspiration + +The current structure of this config was pretty much entirely copied from +[[https://rossabaker.com/configs/emacs/][Ross A. Baker's configuration]]. Many other resources such as stack overflow, +and other peoples configs were used. Here's some of the more notable ones: +- [[https://sanemacs.com/][sanemacs]] +- [https://idiomdrottning.org/bad-emacs-defaults] + +** TODO Licensing + +* Startup + +** Early Init + +From preliterate items. +#+begin_src emacs-lisp :tangle early-init.el + ;; All our packages come from Nix + (setq package-enable-at-startup nil + package-archives nil) + (provide 'early-init) + ;;; early-init.el ends here +#+end_src + +** Packages + +*** Ensuring packages + +Most of this config is broken down into [[https://github.com/jwiegley/use-package][~use-package~]] stanzas. All +dependencies are managed by [[https://nixos.org/][Nix]]. Any package with a true ~:ensure~ +keyword is found by [[https://github.com/nix-community/emacs-overlay#extra-library-functionality][~emacsWithPackagesFromUsePackage~]] to generate +the set of Emacs packages to install with Nix. + +In the brutish non-Nix world, ~:ensure~ triggers Emacs' own package +manager with willy nilly downloads. To prevent this, we tell +~use-package~ to assume the package is there and merely look for its +autoloads. + +#+begin_src emacs-lisp +(defun ross/use-package-ensure-already-installed + (name _ensure state &optional _context) + "Value for `use-package-ensure-function` that assumes the package + is already installed. This is true in our Nix environment." + (let ((autoloads-file-name (format "%s-autoloads" name))) + (with-demoted-errors "Error loading autoloads: %s" + (load autoloads-file-name t t)))) + +(setq use-package-ensure-function #'ross/use-package-ensure-already-installed) +#+end_src + +*** Hook naming + +~use-package~ also by default appends ~"-hook"~ to all its hooks. +This impairs ripgreppability. Let's be explicit: + +#+begin_src emacs-lisp +(setq use-package-hook-name-suffix nil) +#+end_src + +*** Load it + +~use-package~ doesn't use itself. (Well, I think it could, but this +is the recommended approach...) + +#+begin_src emacs-lisp +(eval-when-compile + (require 'use-package)) +#+end_src + +** Helpers + +*** General + +[[https://github.com/noctuid/general.el][General]] is known for keybindings, particularly among [[https://github.com/emacs-evil/evil][the evil]]. A +lesser known feature is [[https://github.com/noctuid/general.el#settings][~general-setq~]], which understands the ~:set~ +hooks of custom variables. [[https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21695][#21695]] raged on for a half decade without +a consensus, and I find this solution as tidy as any, + +#+begin_src emacs-lisp +(use-package general :ensure) +#+end_src + +* Personalization + +#+begin_src emacs-lisp +(general-setq user-full-name "Miran Bastaja" + user-mail-address "miran.bastaja04@gmail.com") +#+end_src + +* Display + +** Scrolling + +Emacs' default scrolling behavior feels a bit janky in the 2020s. + +- ~scroll-conservatively~ has a magic number of ~100~. Greater than + this scrolls just enough to get the point back on screen without + recentering. + +- ~scroll-margin~ specifies how many lines of context to keep above + and below the point. + +#+begin_src emacs-lisp +(use-package emacs + :custom + (frame-inhibit-implied-resize t) + (scroll-conservatively 101) + (scroll-margin 2) + (scroll-preserve-screen-position t)) +#+end_src + +* Customization + +** Theme + +I use [[https://github.com/doomemacs/themes][Doom emacs' theme pack]] to source my themes. + +#+begin_src emacs-lisp +(use-package doom-themes + :ensure t + :config + ;; Global settings (defaults) + (setq doom-themes-enable-bold t ; if nil, bold is universally disabled + doom-themes-enable-italic t) ; if nil, italics is universally disabled + (load-theme 'doom-one t) + + ;; Enable flashing mode-line on errors + (doom-themes-visual-bell-config) + ;; Corrects (and improves) org-mode's native fontification. + (doom-themes-org-config)) +#+end_src + +* Languages + +** Emacs Lisp + +I use local variables in this config to keep the code from indenting +two spaces. Without this, we get prompted the first time we read +this file: + +#+begin_src emacs-lisp +(dolist (pair '((org-src-preserve-indentation . t) (org-src-tab-acts-natively . t))) + (add-to-list 'safe-local-variable-values pair)) +#+end_src + +** Org + +#+begin_src emacs-lisp + +#+end_src |
