1021 lines
31 KiB
Nix
1021 lines
31 KiB
Nix
pkgs:
|
|
''
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Basic settings for quick startup and convenience
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(require 'bind-key)
|
|
|
|
;; Startup speed, annoyance suppression
|
|
(setq gc-cons-threshold 10000000)
|
|
(setq byte-compile-warnings '(not obsolete))
|
|
(setq warning-suppress-log-types '((comp) (bytecomp)))
|
|
(setq native-comp-async-report-warnings-errors 'silent)
|
|
|
|
;; Silence stupid startup message
|
|
(setq inhibit-startup-echo-area-message (user-login-name))
|
|
|
|
;; Default frame configuration: full screen, good-looking title bar on macOS
|
|
(setq frame-resize-pixelwise t)
|
|
(tool-bar-mode -1) ; All these tools are in the menu-bar anyway
|
|
(menu-bar-mode -1) ; All these tools are in the M-x anyway
|
|
(setq default-frame-alist '((fullscreen . maximized)
|
|
|
|
;; You can turn off scroll bars by uncommenting these lines:
|
|
;; (vertical-scroll-bars . nil)
|
|
;; (horizontal-scroll-bars . nil)
|
|
|
|
;; Setting the face in here prevents flashes of
|
|
;; color as the theme gets activated
|
|
(background-color . "#000000")
|
|
(ns-appearance . dark)
|
|
(ns-transparent-titlebar . t)))
|
|
; emacs was destroying my hard links : (
|
|
(setq backup-by-copying-when-linked t)
|
|
|
|
; don't pollute my directories with autosaves
|
|
(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.
|
|
'(auto-save-file-name-transforms '((".*" "~/.emacs.d/autosaves/\\1" t)))
|
|
'(backup-directory-alist '((".*" . "~/.emacs.d/backups/")))
|
|
'(custom-safe-themes
|
|
'("871b064b53235facde040f6bdfa28d03d9f4b966d8ce28fb1725313731a2bcc8" "a5270d86fac30303c5910be7403467662d7601b821af2ff0c4eb181153ebfc0a" "98ef36d4487bf5e816f89b1b1240d45755ec382c7029302f36ca6626faf44bbd" "ba323a013c25b355eb9a0550541573d535831c557674c8d59b9ac6aa720c21d3" "046a2b81d13afddae309930ef85d458c4f5d278a69448e5a5261a5c78598e012" "d445c7b530713eac282ecdeea07a8fa59692c83045bf84dd112dd738c7bcad1d" default))
|
|
'(package-selected-packages
|
|
'(idris-mode evil-leader geiser-racket macrostep-geiser geiser-chez srfi erc-hl-nicks scheme-complete evil-commentary evil-surround evil-goggles evil paredit org-roam evil-org gruvbox-theme lsp-scheme counsel general all-the-icons-ivy frog-jump-buffer chess rainbow-delimiters which-key)))
|
|
|
|
;; create the autosave dir if necessary, since emacs won't.
|
|
(make-directory "~/.emacs.d/autosaves/" t)
|
|
|
|
;;; Minimal init.el
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Basic settings
|
|
;;; - Discovery aids
|
|
;;; - Minibuffer/completion settings
|
|
;;; - Interface enhancements/defaults
|
|
;;; - Tab-bar configuration
|
|
;;; - Theme
|
|
;;; - Optional extras
|
|
;;; - Built-in customization framework
|
|
|
|
|
|
;; set these first so emacs doesn't freak out about theme safety
|
|
|
|
|
|
(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.
|
|
'(evil-goggles-change-face ((t (:inherit diff-removed))))
|
|
'(evil-goggles-delete-face ((t (:inherit diff-removed))))
|
|
'(evil-goggles-paste-face ((t (:inherit diff-added))))
|
|
'(evil-goggles-undo-redo-add-face ((t (:inherit diff-added))))
|
|
'(evil-goggles-undo-redo-change-face ((t (:inherit diff-changed))))
|
|
'(evil-goggles-undo-redo-remove-face ((t (:inherit diff-removed))))
|
|
'(evil-goggles-yank-face ((t (:inherit diff-changed)))))
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; 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
|
|
;;
|
|
(with-eval-after-load 'package
|
|
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
|
|
(package-initialize))
|
|
|
|
|
|
;; If you want to turn off the welcome screen, uncomment this
|
|
(setq inhibit-splash-screen t)
|
|
|
|
(setq initial-major-mode 'fundamental-mode) ; default mode for the *scratch* buffer
|
|
(setq display-time-default-load-average nil) ; this information is useless for most
|
|
|
|
;; Automatically reread from disk if the underlying file changes
|
|
(setq auto-revert-interval 1)
|
|
(setq 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
|
|
(setq 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))
|
|
(setq 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
|
|
|
|
(setq enable-recursive-minibuffers t) ; Use the minibuffer whilst in the minibuffer
|
|
(setq completion-cycle-threshold 1) ; TAB cycles candidates
|
|
(setq completions-detailed t) ; Show annotations
|
|
(setq tab-always-indent 'complete) ; When I hit TAB, try to complete, otherwise, indent
|
|
(setq completion-styles '(basic initials substring)) ; Different styles to match input to candidates
|
|
|
|
(setq completion-auto-help 'always) ; Open completion always; `lazy' another option
|
|
(setq completions-max-height 20) ; This is arbitrary
|
|
(setq completions-detailed t)
|
|
(setq completions-format 'one-column)
|
|
(setq completions-group t)
|
|
(setq completion-auto-select 'second-tab) ; Much more eager
|
|
;(setq 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 or fido-mode. See also
|
|
;; the file extras/base.el
|
|
;(fido-vertical-mode)
|
|
;(setq icomplete-delay-completions-threshold 4000)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Interface enhancements/defaults
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Mode line information
|
|
(setq line-number-mode t) ; Show current line in modeline
|
|
(setq column-number-mode t) ; Show column as well
|
|
|
|
(setq x-underline-at-descent-line nil) ; Prettier underlines
|
|
(setq switch-to-buffer-obey-display-actions t) ; Make switching buffers more consistent
|
|
|
|
(setq-default show-trailing-whitespace nil) ; By default, don't underline trailing spaces
|
|
(setq-default indicate-buffer-boundaries 'left) ; Show buffer top and bottom in the margin
|
|
|
|
;; Enable horizontal scrolling
|
|
(setq mouse-wheel-tilt-scroll t)
|
|
(setq mouse-wheel-flip-direction t)
|
|
|
|
;; We won't set these, but they're good to know about
|
|
;; I will. Thanks!
|
|
(setq-default indent-tabs-mode nil)
|
|
(setq-default 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)
|
|
(setq-default 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
|
|
(setq tab-bar-show 0)
|
|
|
|
;; 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)
|
|
;(setq display-time-format "%a %F %T")
|
|
;(setq display-time-interval 1)
|
|
;(display-time-mode)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Theme
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package emacs
|
|
:config
|
|
(load-theme 'gruvbox-dark-soft))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; 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))
|
|
|
|
; ;; scheme-relevant stuff (includes slime)
|
|
; (load-file (expand-file-name "extras/scheme.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
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(setq w32-recognize-altgr nil)
|
|
(scroll-bar-mode -1)
|
|
|
|
(use-package all-the-icons-ivy
|
|
:ensure t)
|
|
|
|
(use-package counsel
|
|
:ensure t)
|
|
|
|
(use-package gruvbox-theme
|
|
:ensure t)
|
|
|
|
;; (set-fringe-mode 'minimal)
|
|
|
|
(use-package general
|
|
:ensure t)
|
|
|
|
(use-package lsp-mode
|
|
:ensure t)
|
|
;;; Emacs Bedrock
|
|
;;;
|
|
;;; Extra config: Base UI enhancements
|
|
|
|
;;; Usage: Append or require this file from init.el to enable various UI/UX
|
|
;;; enhancements.
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Motion aids
|
|
;;; - Power-ups: Embark and Consult
|
|
;;; - Minibuffer and completion
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Motion aids
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package avy
|
|
:ensure t
|
|
:demand t
|
|
:bind (("C-c j" . avy-goto-line)
|
|
("s-j" . avy-goto-char-timer)))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Power-ups: Embark and Consult
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Consult: Misc. enhanced commands
|
|
(use-package consult
|
|
:ensure t
|
|
;; Other good things to bind: consult-ripgrep, consult-line-multi,
|
|
;; consult-history, consult-outline
|
|
:bind (("C-x b" . consult-buffer) ; orig. switch-to-buffer
|
|
("M-y" . consult-yank-pop) ; orig. yank-pop
|
|
("C-s" . consult-line)) ; orig. isearch
|
|
:config
|
|
;; Narrowing lets you restrict results to certain groups of candidates
|
|
(setq consult-narrow-key "<"))
|
|
|
|
(use-package embark
|
|
:ensure t
|
|
:demand t
|
|
:after avy
|
|
:bind (("C-c a" . embark-act)) ; bind this to an easy key to hit
|
|
:init
|
|
;; Add the option to run embark when using avy
|
|
(defun bedrock/avy-action-embark (pt)
|
|
(unwind-protect
|
|
(save-excursion
|
|
(goto-char pt)
|
|
(embark-act))
|
|
(select-window
|
|
(cdr (ring-ref avy-ring 0))))
|
|
t)
|
|
|
|
;; After invoking avy-goto-char-timer, hit "." to run embark at the next
|
|
;; candidate you select
|
|
(setf (alist-get ?. avy-dispatch-alist) 'bedrock/avy-action-embark))
|
|
|
|
(use-package embark-consult
|
|
:ensure t)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Minibuffer and completion
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Vertico: better vertical completion for minibuffer commands
|
|
(use-package vertico
|
|
:ensure t
|
|
:init
|
|
;; You'll want to make sure that e.g. fido-mode isn't enabled
|
|
(vertico-mode))
|
|
|
|
(use-package vertico-directory
|
|
:after vertico
|
|
:bind (:map vertico-map
|
|
("M-DEL" . vertico-directory-delete-word)))
|
|
|
|
;; Marginalia: annotations for minibuffer
|
|
(use-package marginalia
|
|
:ensure t
|
|
:config
|
|
(marginalia-mode))
|
|
|
|
;; Popup completion-at-point
|
|
(use-package corfu
|
|
:ensure t
|
|
:init
|
|
(global-corfu-mode)
|
|
:bind
|
|
(:map corfu-map
|
|
("SPC" . corfu-insert-separator)
|
|
("C-n" . corfu-next)
|
|
("C-p" . corfu-previous)))
|
|
|
|
;; Part of corfu
|
|
(use-package corfu-popupinfo
|
|
:after corfu
|
|
:hook (corfu-mode . corfu-popupinfo-mode)
|
|
:custom
|
|
(corfu-popupinfo-delay '(0.25 . 0.1))
|
|
(corfu-popupinfo-hide nil)
|
|
:config
|
|
(corfu-popupinfo-mode))
|
|
|
|
;; Make corfu popup come up in terminal overlay
|
|
(use-package corfu-terminal
|
|
:if (not (display-graphic-p))
|
|
:ensure t
|
|
:config
|
|
(corfu-terminal-mode))
|
|
|
|
;; Pretty icons for corfu
|
|
(use-package kind-icon
|
|
:if (display-graphic-p)
|
|
:ensure t
|
|
:after corfu
|
|
:config
|
|
(add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))
|
|
|
|
(use-package eshell
|
|
:bind (("C-r" . consult-history)))
|
|
|
|
;; Orderless: powerful completion style
|
|
(use-package orderless
|
|
:ensure t
|
|
:config
|
|
(setq completion-styles '(orderless)))
|
|
;;; Emacs Bedrock
|
|
;;;
|
|
;;; Extra config: Development tools
|
|
|
|
;;; Usage: Append or require this file from init.el for some software
|
|
;;; development-focused packages.
|
|
;;;
|
|
;;; It is **STRONGLY** recommended that you use the base.el config if you want to
|
|
;;; use Eglot. Lots of completion things will work better.
|
|
;;;
|
|
;;; This will try to use tree-sitter modes for many languages. Please run
|
|
;;;
|
|
;;; M-x treesit-install-language-grammar
|
|
;;;
|
|
;;; Before trying to use a treesit mode.
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Built-in config for developers
|
|
;;; - Version Control
|
|
;;; - Common file types
|
|
;;; - Eglot, the built-in LSP client for Emacs
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Built-in config for developers
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package emacs
|
|
:config
|
|
;; Treesitter config
|
|
|
|
;; Tell Emacs to prefer the treesitter mode
|
|
;; You'll want to run the command `M-x treesit-install-language-grammar' before editing.
|
|
(setq major-mode-remap-alist
|
|
'((yaml-mode . yaml-ts-mode)
|
|
(bash-mode . bash-ts-mode)
|
|
(js2-mode . js-ts-mode)
|
|
(typescript-mode . typescript-ts-mode)
|
|
(json-mode . json-ts-mode)
|
|
(css-mode . css-ts-mode)
|
|
(python-mode . python-ts-mode)))
|
|
:hook
|
|
;; Auto parenthesis matching
|
|
((prog-mode . electric-pair-mode)))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Version Control
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Magit: best Git client to ever exist
|
|
(use-package magit
|
|
:ensure t
|
|
:bind ())
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Common file types
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package markdown-mode
|
|
:hook ((markdown-mode . visual-line-mode)))
|
|
|
|
(use-package yaml-mode
|
|
:ensure t)
|
|
|
|
(use-package json-mode
|
|
:ensure t)
|
|
|
|
;; Emacs ships with a lot of popular programming language modes. If it's not
|
|
;; built in, you're almost certain to find a mode for the language you're
|
|
;; looking for with a quick Internet search.
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Eglot, the built-in LSP client for Emacs
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package eglot
|
|
;; no :ensure t here because it's built-in
|
|
|
|
;; Configure hooks to automatically turn-on eglot for selected modes
|
|
; :hook
|
|
; (((python-mode ruby-mode elixir-mode) . eglot))
|
|
|
|
:custom
|
|
(eglot-send-changes-idle-time 0.1)
|
|
|
|
:config
|
|
(fset #'jsonrpc--log-event #'ignore) ; massive perf boost---don't log every event
|
|
;; Sometimes you need to tell Eglot where to find the language server
|
|
; (add-to-list 'eglot-server-programs
|
|
; '(haskell-mode . ("haskell-language-server-wrapper" "--lsp")))
|
|
)
|
|
|
|
; oorg
|
|
;; ;;;; ;;;;
|
|
;; ;; ;; ;; ;;
|
|
;; ;; ;;;; ;;
|
|
;; ;; ;; ;; ;; ;;
|
|
;; ;; ;; ;;;;
|
|
|
|
;;; Emacs Bedrock
|
|
;;;
|
|
;;; Extra config: Org-mode starter config
|
|
|
|
;;; Usage: Append or require this file from init.el for some software
|
|
;;; development-focused packages.
|
|
;;;
|
|
;;; Org-mode is a fantastically powerful package. It does a lot of things, which
|
|
;;; makes it a little difficult to understand at first.
|
|
;;;
|
|
;;; We will configure Org-mode in phases. Work with each phase as you are
|
|
;;; comfortable.
|
|
;;;
|
|
;;; YOU NEED TO CONFIGURE SOME VARIABLES! The most important variable is the
|
|
;;; `org-directory', which tells org-mode where to look to find your agenda
|
|
;;; files.
|
|
|
|
;;; See "org-intro.txt" for a high-level overview.
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Critical variables
|
|
;;; - Phase 1: editing and exporting files
|
|
;;; - Phase 2: todos, agenda generation, and task tracking
|
|
;;; - Phase 3: extensions (org-roam, etc.)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Critical variables
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;; These variables need to be set for Org-mode's full power to be unlocked!
|
|
;;;
|
|
;;; You can read the documentation for any variable with `C-h v'. If you have
|
|
;;; Consult configured (see the `base.el' file) then it should help you find
|
|
;;; what you're looking for.
|
|
|
|
;;; Phase 1 variables
|
|
|
|
;;; Phase 2 variables
|
|
|
|
;; Agenda variables
|
|
(setq org-directory "~/Documents/org/") ; Non-absolute paths for agenda and
|
|
; capture templates will look here.
|
|
(setq org-agenda-files '("inbox.org" "work.org"))
|
|
|
|
;; Default tags
|
|
(setq org-tag-alist '(
|
|
;; locale
|
|
(:startgroup)
|
|
("home" . ?h)
|
|
("work" . ?w)
|
|
("school" . ?s)
|
|
(:endgroup)
|
|
(:newline)
|
|
;; scale
|
|
(:startgroup)
|
|
("one-shot" . ?o)
|
|
("project" . ?j)
|
|
("tiny" . ?t)
|
|
(:endgroup)
|
|
;; misc
|
|
("meta")
|
|
("review")
|
|
("reading")))
|
|
|
|
;; Org-refile: where should org-refile look?
|
|
(setq org-refile-targets 'FIXME)
|
|
|
|
;;; Phase 3 variables
|
|
|
|
;; Org-roam variables
|
|
(setq org-roam-directory "~/Documents/org-roam/")
|
|
(setq org-roam-index-file "~/Documents/org-roam/index.org")
|
|
|
|
;;; Optional variables
|
|
|
|
;; Advanced: Custom link types
|
|
;; This example is for linking a person's 7-character ID to their page on the
|
|
;; free genealogy website Family Search.
|
|
(setq org-link-abbrev-alist
|
|
'(("family_search" . "https://www.familysearch.org/tree/person/details/%s")))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Phase 1: editing and exporting files
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package org
|
|
:hook ((org-mode . visual-line-mode) ; wrap lines at word breaks
|
|
(org-mode . flyspell-mode)) ; spell checking!
|
|
|
|
:bind (:map global-map
|
|
("C-c l s" . org-store-link) ; Mnemonic: link → store
|
|
("C-c l i" . org-insert-link-global)) ; Mnemonic: link → insert
|
|
:config
|
|
(require 'oc-csl) ; citation support
|
|
(add-to-list 'org-export-backends 'md)
|
|
|
|
;; Make org-open-at-point follow file links in the same window
|
|
(setf (cdr (assoc 'file org-link-frame-setup)) 'find-file)
|
|
|
|
;; Make exporting quotes better
|
|
(setq org-export-with-smart-quotes t)
|
|
)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Phase 2: todos, agenda generation, and task tracking
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Yes, you can have multiple use-package declarations. It's best if their
|
|
;; configs don't overlap. Once you've reached Phase 2, I'd recommend merging the
|
|
;; config from Phase 1. I've broken it up here for the sake of clarity.
|
|
(use-package org
|
|
:config
|
|
;; Instead of just two states (TODO, DONE) we set up a few different states
|
|
;; that a task can be in.
|
|
(setq org-todo-keywords
|
|
'((sequence "TODO(t)" "WAITING(w@/!)" "STARTED(s!)" "|" "DONE(d!)" "OBSOLETE(o@)")))
|
|
|
|
;; Refile configuration
|
|
(setq org-outline-path-complete-in-steps nil)
|
|
(setq org-refile-use-outline-path 'file)
|
|
|
|
(setq org-capture-templates
|
|
'(("c" "Default Capture" entry (file "inbox.org")
|
|
"* TODO %?\n%U\n%i")
|
|
;; Capture and keep an org-link to the thing we're currently working with
|
|
("r" "Capture with Reference" entry (file "inbox.org")
|
|
"* TODO %?\n%U\n%i\n%a")
|
|
;; Define a section
|
|
("w" "Work")
|
|
("wm" "Work meeting" entry (file+headline "work.org" "Meetings")
|
|
"** TODO %?\n%U\n%i\n%a")
|
|
("wr" "Work report" entry (file+headline "work.org" "Reports")
|
|
"** TODO %?\n%U\n%i\n%a")))
|
|
|
|
(setq org-agenda-custom-commands
|
|
'(("n" "Agenda and All Todos"
|
|
((agenda)
|
|
(todo)))
|
|
("w" "Work" agenda ""
|
|
((org-agenda-files '("work.org")))))))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Phase 3: extensions (org-roam, etc.)
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(use-package org-roam
|
|
:ensure t
|
|
:config
|
|
(org-roam-db-autosync-mode)
|
|
;; Dedicated side window for backlinks
|
|
(add-to-list 'display-buffer-alist
|
|
'("\\*org-roam\\*"
|
|
(display-buffer-in-side-window)
|
|
(side . right)
|
|
(window-width . 0.4)
|
|
(window-height . fit-window-to-buffer))))
|
|
|
|
;; Pretty web interface for org-roam
|
|
;(use-package org-roam-ui
|
|
; :ensure t
|
|
; :after org-roam
|
|
; :config
|
|
; (setq org-roam-ui-sync-theme t
|
|
; org-roam-ui-follow t
|
|
; org-roam-ui-update-on-save t
|
|
; org-roam-ui-open-on-start t))
|
|
|
|
|
|
; scm
|
|
;;;;;; ;;;;;; ;; ;; ;;;;;; ;; ;; ;;;;;;
|
|
;; ;; ;; ;; ;; ;;;; ;;;; ;;
|
|
;;;;;; ;; ;;;;;; ;;;; ;; ;; ;; ;;;;
|
|
;; ;; ;; ;; ;; ;; ;; ;;
|
|
;;;;;; ;;;;;; ;; ;; ;;;;;; ;; ;; ;;;;;;
|
|
|
|
(setq scheme-program-name "scheme")
|
|
|
|
(use-package paredit
|
|
:ensure t
|
|
:hook ((emacs-lisp-mode . enable-paredit-mode)
|
|
(eval-expression-minibuffer-setup . enable-paredit-mode)
|
|
(ielm-mode . enable-paredit-mode)
|
|
(lisp-mode . enable-paredit-mode)
|
|
(lisp-interaction-mode . enable-paredit-mode)
|
|
(scheme-mode . enable-paredit-mode)
|
|
;; (inferior-scheme-mode . enable-paredit-mode)
|
|
(slime-repl-mode . enable-paredit-mode)
|
|
(clojure-mode . enable-paredit-mode)
|
|
(clojurescript-mode . enable-paredit-mode)
|
|
(cider-repl-mode . enable-paredit-mode)
|
|
(cider-mode . enable-paredit-mode)
|
|
(clojure-mode . enable-paredit-mode))
|
|
:config
|
|
(show-paren-mode t))
|
|
|
|
(use-package rainbow-delimiters
|
|
:ensure t
|
|
:init
|
|
(add-hook 'emacs-lisp-mode-hook #'rainbow-delimiters-mode)
|
|
(add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)
|
|
(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode)
|
|
)
|
|
|
|
; gsr
|
|
; (use-package geiser-chez
|
|
; :ensure t
|
|
; :config
|
|
(setq geiser-active-implementations '(chez guile))
|
|
;(setq geiser-chez-binary "/usr/bin/chez")
|
|
(setq geiser-repl-query-on-kill-p nil)
|
|
; )
|
|
|
|
(use-package macrostep-geiser
|
|
:ensure t
|
|
)
|
|
|
|
; if necessary
|
|
;; (use-package company
|
|
;; :ensure t)
|
|
|
|
;; (use-package lsp-scheme
|
|
;; :ensure t
|
|
;; :init
|
|
;; (add-hook 'scheme-mode-hook #'lsp-scheme-guile)
|
|
;; :config
|
|
;; )
|
|
|
|
;; (use-package scheme-complete
|
|
;; :ensure t
|
|
;; :config
|
|
;; )
|
|
|
|
(use-package lispyville
|
|
:init
|
|
(general-add-hook '(emacs-lisp-mode-hook lisp-mode-hook scheme-mode-hook) #'lispyville-mode)
|
|
:config)
|
|
|
|
(use-package slime :ensure t
|
|
:init
|
|
(setq slime-contribs '(slime-fancy)
|
|
slime-complete-symbol-function 'slime-fuzzy-complete-symbol
|
|
slime-net-coding-system 'utf-8-unix
|
|
slime-lisp-implementations '((sbcl ("${pkgs.sbcl}/bin/sbcl"))))
|
|
:config
|
|
(setq common-lisp-hyperspec-root "${pkgs.sbclPackages.hyperspec}/docs/"
|
|
;common-lisp-hyperspec-symbol-table (concat common-lisp-hyperspec-root "Data/Map_Sym.txt")
|
|
;common-lisp-hyperspec-issuex-table (concat common-lisp-hyperspec-root "Data/Map_IssX.txt")
|
|
))
|
|
|
|
;;; Emacs Bedrock
|
|
;;;
|
|
;;; Extra config: Vim emulation
|
|
|
|
;;; Usage: Append or require this file from init.el for bindings in Emacs.
|
|
|
|
;;; Contents:
|
|
;;;
|
|
;;; - Core Packages
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;
|
|
;;; Core Packages
|
|
;;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;evl
|
|
;;;;;; ;; ;; ;;;;;; ;;
|
|
;; ;; ;; ;; ;;
|
|
;;;; ;; ;; ;; ;;
|
|
;; ;; ;; ;; ;;
|
|
;;;;;; ;; ;;;;;; ;;;;;;
|
|
|
|
; lisp sucks, scheme rulez
|
|
;; (defun make-file-opener (filename)
|
|
;; (lambda ()
|
|
;; (interactive (concat "sopen " filename " for editing"))
|
|
;; (find-file filename)))
|
|
|
|
(defun open-init.el ()
|
|
(interactive)
|
|
(find-file "/etc/nixos/init.el"))
|
|
;; (defun open-vim-like.el ()
|
|
;; (interactive)
|
|
;; (find-file "~/.emacs.d/extras/vim-like.el"))
|
|
;; (defun open-scheme.el ()
|
|
;; (interactive)
|
|
;; (find-file "~/.emacs.d/extras/scheme.el"))
|
|
; emacs lisp really is a pain, but even this makes me appreciate the POWA
|
|
; pretty unnecessary lel
|
|
; (defun scheme-set-up-two-panels-with-repl-and-editor ()
|
|
; (interactive)
|
|
; (geiser ;needs-arg
|
|
; )
|
|
; (geiser-mode))
|
|
|
|
(defun join-libera.chat ()
|
|
(interactive)
|
|
())
|
|
|
|
(use-package evil
|
|
:ensure t
|
|
|
|
:init
|
|
(setq evil-respect-visual-line-mode t)
|
|
(setq evil-undo-system 'undo-redo)
|
|
|
|
;; Enable this if you want C-u to scroll up, more like pure Vim
|
|
;(setq evil-want-C-u-scroll t)
|
|
|
|
:config
|
|
; >:D
|
|
(evil-mode 1)
|
|
|
|
;; Configuring initial major mode for some modes
|
|
; (evil-set-initial-state 'vterm-mode 'emacs)
|
|
|
|
(evil-global-set-key 'visual " ssr" 'geiser-eval-region)
|
|
)
|
|
|
|
(defun use-new-config ()
|
|
(shell-command "sudo nixos-rebuild switch")
|
|
(restart-emacs))
|
|
|
|
(use-package evil-leader
|
|
:ensure t
|
|
:config
|
|
(global-evil-leader-mode)
|
|
(setq evil-leader/leader "<SPC>")
|
|
(evil-leader/set-key
|
|
; very general
|
|
"w" 'evil-save
|
|
; u => unicode
|
|
"u" 'insert-char
|
|
|
|
"g" 'magit
|
|
|
|
; mgmt of modes i want to toggle more often
|
|
"mp" 'paredit-mode
|
|
"ms" 'text-scale-adjust
|
|
|
|
; buffers
|
|
"be" 'counsel-switch-buffer
|
|
;; gonna try to stick to C-w commands
|
|
;; "bn" 'evil-buffer
|
|
;; "bs" 'evil-split-buffer
|
|
;; "bv" 'evil-window
|
|
|
|
; config mgmt
|
|
"ce" 'open-init.el
|
|
; "cev" 'open-vim-like.el
|
|
; "ces" 'open-scheme.el
|
|
"cr" 'use-new-config
|
|
|
|
; scheme
|
|
; si => scheme inferior (avoids conflicts)
|
|
"sir" 'geiser-chez
|
|
"sil" 'geiser-load-file
|
|
; it's funny how you find the thing you really need eventually
|
|
"sii" 'geiser-repl-switch
|
|
|
|
; ss => scheme send
|
|
"sss" 'geiser-eval-last-sexp
|
|
;; "ssr" 'geiser-eval-region
|
|
"ssd" 'geiser-eval-definition
|
|
; ssa => scheme send all
|
|
"ssa" 'geiser-eval-buffer
|
|
|
|
; scheme/lispy-editing
|
|
"swp" 'paredit-wrap-round
|
|
"swb" 'paredit-wrap-square
|
|
"swc" 'paredit-wrap-curly
|
|
"swa" 'paredit-wrap-angled
|
|
|
|
; gonna just port most of my vscode stuff even though i don't hate the C-<left> stuff
|
|
"sh" 'paredit-backward-slurp-sexp
|
|
"sl" 'paredit-forward-slurp-sexp
|
|
"bh" 'paredit-backward-barf-sexp
|
|
"bl" 'paredit-forward-barf-sexp
|
|
|
|
"st" 'transpose-sexps
|
|
"s?" 'paredit-convolute-sexps
|
|
|
|
"sH" 'backward-sexp
|
|
"sL" 'forward-sexp
|
|
|
|
; sort of out-of-place feeling
|
|
"sb" 'geiser-squarify
|
|
|
|
"sd" 'geiser-doc-symbol-at-point
|
|
|
|
; killing is common enough to be worth its own prefix
|
|
; non-lisp killing is more than covered by normal vim stuff lol
|
|
"kh" 'backward-kill-sexp
|
|
"kl" 'kill-sexp
|
|
|
|
; irc
|
|
"il" 'erc-tls
|
|
"ij" 'erc-join-channel
|
|
"ic" 'erc-switch-to-buffer
|
|
"is" 'erc-server-select
|
|
"ia" 'erc-track-switch-buffer
|
|
))
|
|
|
|
(use-package evil-goggles
|
|
:ensure t
|
|
|
|
:init
|
|
(setq evil-goggles-pulse t)
|
|
; i don't like how deleted stuff says so long
|
|
(setq evil-goggles-blocking-duration 0.1)
|
|
|
|
:config
|
|
(evil-goggles-mode)
|
|
(evil-goggles-use-diff-faces))
|
|
|
|
(use-package evil-surround
|
|
:ensure t
|
|
:config
|
|
(global-evil-surround-mode 1))
|
|
|
|
(use-package evil-commentary
|
|
:ensure t
|
|
:config
|
|
(evil-commentary-mode))
|
|
|
|
(use-package evil-org
|
|
:ensure t
|
|
:config
|
|
(evil-commentary-mode))
|
|
|
|
; hi nix
|
|
; hi .emacs.d
|
|
|
|
; erc
|
|
(use-package erc-hl-nicks
|
|
:ensure t)
|
|
|
|
(erc-log-mode)
|
|
(setq erc-nick-uniquifier "`"
|
|
erc-nick "mehbark"
|
|
erc-autojoin-channels-alist '(("Libera.Chat" "#scheme" "#chez" "#lisp" "#commonlisp" "#racket" "#clojure" "#chicken" "#emacs" "#s-expressions"))
|
|
erc-interpret-mirc-color t
|
|
erc-sasl-mechanism "plain"
|
|
erc-sasl-user "mehbark"
|
|
erc-save-buffer-on-part t
|
|
erc-save-queries-on-quit nil
|
|
erc-log-write-after-send t
|
|
erc-log-write-after-insert t
|
|
erc-kill-buffer-on-part t
|
|
erc-kill-server-buffer-on-quit t
|
|
erc-hide-list '("JOIN" "PART" "QUIT"))
|
|
|
|
; critical functionality
|
|
(require 'zone)
|
|
;(setq zone-timer (run-with-idle-timer 120 t 'zone))
|
|
''
|