aboutsummaryrefslogtreecommitdiff
path: root/share/home
diff options
context:
space:
mode:
Diffstat (limited to 'share/home')
-rw-r--r--share/home/emacs/default.nix2
-rw-r--r--share/home/emacs/emacs.el144
-rw-r--r--share/home/emacs/emacs.org155
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