aboutsummaryrefslogtreecommitdiff
path: root/.config/emacs/init.el
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2026-07-05 01:19:30 -0400
committerJack Jamison <jackqjamison@gmail.com>2026-07-05 01:19:30 -0400
commitbdf9a71ab7baa2b1de9abcfd5df1a9107a55d141 (patch)
treec4524e6c41aa5107211103401dabfaefc81aa882 /.config/emacs/init.el
parentfe3984f541bd32bdfa418afb305b614176b55ca0 (diff)
add a bunch of emacs packages HELP
Diffstat (limited to '.config/emacs/init.el')
-rw-r--r--.config/emacs/init.el636
1 files changed, 34 insertions, 602 deletions
diff --git a/.config/emacs/init.el b/.config/emacs/init.el
index bb94a95..34c7295 100644
--- a/.config/emacs/init.el
+++ b/.config/emacs/init.el
@@ -1,29 +1,6 @@
-;; initialize package.el
(require 'package)
-(setq package-archives
- '(("org" . "https://orgmode.org/elpa/")
- ("gnu" . "https://elpa.gnu.org/packages/")
- ("melpa" . "https://melpa.org/packages/")
- ("nongnu" . "https://elpa.nongnu.org/nongnu/")))
-(setq package-archive-priorities
- '(("gnu" . 10)))
-(package-initialize)
-(unless package-archive-contents
- (package-refresh-contents))
-
-;; ensure by default, use ensure nil when built in
-(setq use-package-always-ensure t)
-
-;; == custom lisp
-(add-to-list 'load-path (concat (getenv "HOME") "/.config/emacs/lisp"))
-
-;; == greener emacs
-(use-package no-littering
- :ensure nil ;; it's in lisp folder
- :demand t)
-
-;; garbage collection improvement
+;; improve garbage collection
(defun my-minibuffer-setup-hook ()
(setq gc-cons-threshold most-positive-fixnum))
(defun my-minibuffer-exit-hook ()
@@ -35,17 +12,20 @@
(run-with-idle-timer 1.2 t 'garbage-collect))
(gc-idle-timer)
-;; diminish
-(use-package diminish
- :diminish auto-revert-mode
+;; add my lisp directory and its subdirectories to the load path
+(defvar my-lisp-dir (concat (getenv "XDG_CONFIG_HOME") "/emacs/lisp"))
+(add-to-list 'load-path my-lisp-dir)
+(let ((default-directory my-lisp-dir))
+ (normal-top-level-add-subdirs-to-load-path))
+
+;; greener emacs
+(use-package no-littering
+ :ensure nil
:demand t)
-;; disable custom file, allow themes to be loaded without marking them safe
+;; no custom and lockfiles
(setq custom-file null-device)
-(setq custom-safe-themes t)
-
-;; no lockfiles
-(setq create-lockfiles nil)
+(setq create-lockfiles nil)
;; backups in one folder
(setq backup-directory-alist
@@ -53,582 +33,34 @@
(setq auto-save-file-name-transforms
`((".*" ,temporary-file-directory t)))
-;; == better meta behaviour
+;; better meta behaviour
(setq inhibit-startup-message t
- vc-follow-symlinks t
- use-short-answers t)
+ vc-follow-symlinks t
+ use-short-answers t
+ enable-recursive-minibuffers t)
+
+;; saveplace mode
(use-package saveplace
:ensure nil
:config
(save-place-mode))
-;; improved C-g dwim
-(defun my-keyboard-quit ()
- "Smart C-g: exits evil mode, closes minibuffer, or behaves normally."
- (interactive)
- (if (and (bound-and-true-p evil-local-mode) (not (evil-normal-state-p)))
- (evil-force-normal-state)
- (if (active-minibuffer-window)
- (if (minibufferp)
- (minibuffer-keyboard-quit)
- (abort-recursive-edit))
- (keyboard-quit))))
-(global-set-key (kbd "C-g") #'my-keyboard-quit)
-
-;; == ui
-
-;; disable bs
-(scroll-bar-mode -1)
-(tool-bar-mode -1)
-(tooltip-mode -1)
-(menu-bar-mode -1)
-
-;; columns and truncation
-(column-number-mode +1)
-(setq-default fill-column 80)
-(setq-default truncate-lines t)
-
-;; line numbers in prog mode
-(defun my/prog-mode-hook ()
- (display-line-numbers-mode t)
- (setq display-line-numbers-width-start t
- display-line-numbers-type t))
-(add-hook 'prog-mode-hook 'my/prog-mode-hook)
-
-;; rainbow delimiters
-(use-package rainbow-delimiters
- :diminish
- :hook (prog-mode . rainbow-delimiters-mode))
-
-;; ansi color in compilation
-(use-package ansi-color
- :hook (compilation-filter . ansi-color-compilation-filter))
-
-;; == text editing and navigation
-
-;; tabs
-(setq-default tab-width 4)
-(setq backward-delete-char-untabify-method "hungry")
-
-;; scrolling
-(setq scroll-up-aggressively nil
- scroll-down-aggressively nil
- scroll-conservatively 101)
-(setq scroll-step 1)
-(setq scroll-margin 8)
-
-;; electric pairs
-;; (electric-pair-mode +1)
-
-;; some binds
-(global-set-key (kbd "C-c f") 'ff-find-other-file)
-(global-set-key (kbd "C-c c") 'recompile)
-(global-set-key (kbd "C-<return>") 'browse-url-xdg-open)
-
-;; better commenting
-(use-package evil-nerd-commenter
- :bind ("M-;" . evilnc-comment-or-uncomment-lines))
-
-;; == dired
-(use-package dired
- :ensure nil
- :commands (dired)
- :hook
- ((dired-mode . dired-hide-details-mode)
- (dired-mode . hl-line-mode))
- :config
- (setq dired-recursive-copies 'always)
- (setq dired-recursive-deletes 'always)
- (setq dired-dwim-target t)
- (setq dired-kill-when-opening-new-dired-buffer t)
- (setq dired-listing-switches "-alh --group-directories-first"))
-
-(use-package dired-subtree
- :after dired
- :bind
- ( :map dired-mode-map
- ("<tab>" . dired-subtree-toggle)
- ("TAB" . dired-subtree-toggle)
- ("<backtab>" . dired-subtree-remove)
- ("S-TAB" . dired-subtree-remove))
- :config
- (setq dired-subtree-use-backgrounds nil))
-
-;; == evil
-(use-package evil
- :demand t
- :init
- (setq evil-want-keybinding nil)
- :config
- (evil-mode)
- :custom
- (evil-want-C-u-scroll t)
- (evil-undo-system 'undo-redo)
- (evil-move-beyond-eol nil)
- :bind
- ( :map evil-insert-state-map
- ("C-d" . evil-delete-char))
- ( :map evil-motion-state-map
- ("C-e" . nil)))
-
-(use-package evil-collection
- :after evil
- :diminish evil-collection-unimpaired-mode
- :config
- (evil-collection-init))
-
-(use-package evil-paste-indent
- :diminish
- :vc (:url "https://github.com/Schievel1/evil-paste-indent"
- :rev :newest)
- :config (global-evil-paste-indent-mode t))
-
-;; == style
-;; theme
-(use-package doom-themes
- :demand t
- :config
- (load-theme 'doom-one))
-
-;; font
-(add-to-list 'default-frame-alist '(font . "Fantasque Sans Mono-12"))
-
-;; (use-package dracula-theme
-;; :demand t
-;; :config
-;; (load-theme 'dracula)
-;; (set-face-attribute 'show-paren-match nil :background "dark violet" :foreground "black"))
-;; (use-package ef-themes
-;; :demand t
-;; :config
-;; (load-theme 'ef-bio))
-;; (use-package catppuccin-theme
-;; :demand t
-;; :config
-;; (setq catppuccin-flavor 'mocha)
-;; (load-theme 'catppuccin t))
-
-;; (load-theme `modus-vivendi)
-
-;; (use-package spacious-padding
-;; :config
-;; (setq spacious-padding-widths (plist-put spacious-padding-widths :internal-border-width 10))
-;; (setq spacious-padding-widths (plist-put spacious-padding-widths :right-divider-width 10))
-;; (spacious-padding-mode))
-
-;; (set-face-attribute 'mode-line nil
-;; :box nil
-;; :foreground "#9fefff"
-;; :background "black")
-;; (set-face-attribute 'mode-line-inactive nil
-;; :box nil
-;; :foreground "#5e8891"
-;; :background "black")
-
-;; (use-package doom-modeline
-;; :config
-;; (setq doom-modeline-modal nil
-;; doom-modeline-height 0)
-;; (doom-modeline-mode))
-
-;; rainbow mode
-(use-package rainbow-mode
- :diminish rainbow-mode
- :hook (after-change-major-mode . rainbow-mode))
-
-;; == minibuffer completion
-(use-package vertico
- :custom
- (vertico-count 15)
- :bind (:map vertico-map
- ("C-n" . vertico-next)
- ("C-p" . vertico-previous))
- :init
- (vertico-mode t))
-
-(use-package vertico-directory
- :ensure nil
- :after vertico
- ;; More convenient directory navigation commands
- :bind (:map vertico-map
- ("RET" . vertico-directory-enter)
- ("DEL" . vertico-directory-delete-char)
- ("M-DEL" . vertico-directory-delete-word)))
-
-(use-package marginalia
- :bind (:map minibuffer-local-map
- ("M-A" . marginalia-cycle))
-
- :init
- (marginalia-mode))
-
-(use-package orderless
- :init
- (setq completion-styles '(orderless partial-completion basic)
- completion-category-defaults nil
- completion-category-overrides '((file (styles . (partial-completion))))))
-
+;; savehist mode
(use-package savehist
:ensure nil
- :hook (after-init . savehist-mode))
-
-(use-package stillness-mode
- :init
- (stillness-mode))
-
-;; == effecient navigation
-
-;; consult
-(use-package consult
- :custom
- (consult-preview-key nil)
- :bind (("M-l" . 'consult-git-grep) ;; Search inside a project
- ("M-y" . 'consult-yank-pop) ;; Paste by selecting the kill-ring
- ("M-s" . 'consult-line) ;; Search current buffer, like swiper
- ("C-c i" . 'consult-imenu) ;; Search the imenu
- ))
-
-;; projectile
-(use-package rg)
-(use-package projectile
- :after rg
- :bind
- (("C-c g" . projectile-ripgrep)
- ("C-c v" . projectile-find-file)))
-
-;; == magit
-(use-package transient)
-(use-package magit
- :after transient
- :bind (("C-x g" . magit-status))
- :custom
- (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
-
-;; == helpful
-(use-package helpful
- :bind
- ([remap describe-command] . helpful-command)
- ([remap describe-function] . helpful-callable)
- ([remap describe-variable] . helpful-variable)
- ([remap describe-key] . helpful-key))
-
-;; == flycheck
-;; (use-package flycheck)
-
-;; == editorconfig
-(editorconfig-mode 1)
-(add-hook 'prog-mode 'editorconfig-apply)
-
-;; == lsp
-;; (use-package lsp-mode
-;; :custom
-;; (lsp-keymap-prefix "C-c l")
-;; (lsp-headerline-breadcrumb-enable nil)
-;; (lsp-completion-enable-additional-text-edit nil)
-;; (lsp-enable-on-type-formatting nil)
-;; (lsp-enable-symbol-highlighting nil)
-;; (lsp-completion-provider :none)
-;; (lsp-idle-delay 0.1)
-;; (lsp-enable-indentation nil)
-;; :hook ((c++-mode . lsp-deferred)
-;; (c-mode . lsp-deferred)
-;; (typst-ts-mode . lsp-deferred)
-;; (java-mode . lsp-deferred))
-;; :commands lsp
-;; :bind
-;; (("C-c s" . lsp-signature-activate)))
-
-;; (use-package lsp-ui
-;; :after lsp-mode
-;; :commands lsp-ui-mode
-;; :hook (lsp-mode . lsp-ui-mode)
-;; :bind
-;; (("C-c r" . lsp-ui-peek-find-references)
-;; ("C-c d" . lsp-ui-peek-find-definitions)))
-
-;; lsp booster
-;; (setq read-process-output-max (* 1024 1024)) ;; 1mb
-;; (defun lsp-booster--advice-json-parse (old-fn &rest args)
-;; "Try to parse bytecode instead of json."
-;; (or
-;; (when (equal (following-char) ?#)
-;; (let ((bytecode (read (current-buffer))))
-;; (when (byte-code-function-p bytecode)
-;; (funcall bytecode))))
-;; (apply old-fn args)))
-;; (advice-add (if (progn (require 'json)
-;; (fboundp 'json-parse-buffer))
-;; 'json-parse-buffer
-;; 'json-read)
-;; :around
-;; #'lsp-booster--advice-json-parse)
-
-;; (defun lsp-booster--advice-final-command (old-fn cmd &optional test?)
-;; "Prepend emacs-lsp-booster command to lsp CMD."
-;; (let ((orig-result (funcall old-fn cmd test?)))
-;; (if (and (not test?) ;; for check lsp-server-present?
-;; (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper
-;; lsp-use-plists
-;; (not (functionp 'json-rpc-connection)) ;; native json-rpc
-;; (executable-find "emacs-lsp-booster"))
-;; (progn
-;; (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH)
-;; (setcar orig-result command-from-exec-path))
-;; (message "Using emacs-lsp-booster for %s!" orig-result)
-;; (cons "emacs-lsp-booster" orig-result))
-;; orig-result)))
-;; (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)
-
-;; == eglot
-(use-package eglot
- :ensure nil
- :bind
- (("C-c l a" . eglot-code-actions))
- (("C-c l r" . eglot-rename))
- :hook
- (eglot-managed-mode . (lambda () (setq-local eldoc-documentation-function 'eldoc-documentation-enthusiast)))
- (eglot-mode-hook . flymake-mode)
- :config
- (add-to-list 'eglot-ignored-server-capabilities ':inlayHintProvider)
- (add-to-list 'eglot-ignored-server-capabilities ':documentOnTypeFormattingProvider)
- (add-to-list 'eglot-ignored-server-capabilities ':documentHighlightProvider)
- (add-to-list 'eglot-server-programs
- '((c-ts-mode c++-ts-mode c-mode c++-mode)
- . ("clangd"
- "-j=8"
- "--log=error"
- "--malloc-trim"
- "--background-index"
- "--completion-style=detailed"
- "--pch-storage=memory"
- "--header-insertion=never"
- "--header-insertion-decorators=0")))
- :custom
- (eglot-send-changes-idle-time 0.1))
-
-(use-package eldoc
- :ensure nil
- :config
- (setq-default eldoc-documentation-strategy 'eldoc-documentation-enthusiast)
- (setq-default eldoc-minor-mode-string ""))
-
-(use-package sideline-flymake)
-(use-package sideline
- :diminish
- :hook
- ((flymake-mode . sideline-mode))
- :init
- (setq sideline-backends-right '(sideline-flymake)
- sideline-backends-right-skip-current-line nil
- sideline-order-right 'up
- sideline-priority 100))
-
-;; == dumb jump
-(use-package dumb-jump
- :init
- (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
- (setq xref-show-definitions-function #'xref-show-definitions-completing-read))
-
-;; == text completion
-(use-package corfu
- :bind
- (:map corfu-map
- ("C-g" . corfu-quit))
- :init
- (add-hook 'corfu-mode-hook
- (lambda ()
- ;; disable orderless
- (setq-local completion-styles '(basic)
- completion-category-overrides nil
- completion-category-defaults nil)))
- (global-corfu-mode)
- (corfu-history-mode))
-
-(use-package cape
:init
- (add-hook 'completion-at-point-functions #'cape-dabbrev)
- (add-hook 'completion-at-point-functions #'cape-file)
- :config
- (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster))
- ;; (defun my/lsp-capf-busted ()
- ;; "Return an uncached LSP completion function."
- ;; (cape-capf-buster #'lsp-completion-at-point))
- ;; (add-hook 'lsp-completion-mode-hook
- ;; (lambda ()
- ;; (setq-local completion-at-point-functions
- ;; (list (my/lsp-capf-busted))))))
-
-(use-package completion-preview
- :ensure nil
- :diminish
- :config
- (global-completion-preview-mode)
- (global-set-key (kbd "M-n") 'completion-preview-next-candidate)
- (global-set-key (kbd "M-p") 'completion-preview-prev-candidate))
-
-;; == snippets
-(use-package yasnippet
- :diminish yas-minor-mode yas-global-mode
- :config
- (yas-reload-all)
- :hook
- (prog-mode . yas-minor-mode)
- :bind
- (:map yas-keymap
- ("M-n" . yas-next-field)
- ("M-p" . yas-prev-field)
- ([(tab)] . nil)
- ("TAB" . nil)
- ("M-I" . nil))
- (:map yas-minor-mode-map
- ("C-'". yas-expand)
- ([(tab)] . nil)
- ("TAB" . nil)
- ("M-I" . nil)))
-
-;; (use-package yasnippet
-;; :bind
-;; (:map yas-minor-mode-map
-;; ("C-'". yas-expand)
-;; ([(tab)] . nil)
-;; ("TAB" . nil))
-;; :config
-;; (yas-reload-all)
-;; (yas-global-mode t))
-
-(use-package yasnippet-snippets
- :after yasnippet)
-
-;; == development environment
-(defun my/replace-master-vterm ()
- (interactive)
- (let* ((master-name "Master Terminal")
- (banished-base "Banished Terminal ")
- (master-buf (get-buffer master-name))
- (visible-win (and master-buf (get-buffer-window master-buf t))))
- (when master-buf
- (with-current-buffer master-buf
- (let ((n 1)
- new-name)
- (while (get-buffer (setq new-name (format "%s%d" banished-base n)))
- (setq n (1+ n)))
- (rename-buffer new-name))))
- (let ((buf (if visible-win
- (with-selected-window visible-win
- (vterm))
- (vterm-other-window))))
- (with-current-buffer buf
- (rename-buffer master-name t)))))
-
-(defun my/switch-to-master-vterm-other-window ()
- (interactive)
- (let* ((master-name "Master Terminal")
- (master-buf (get-buffer master-name))
- (visible-win (and master-buf (get-buffer-window master-buf t))))
- (cond
- (visible-win
- (select-window visible-win))
- (master-buf
- (switch-to-buffer-other-window master-buf))
- (t
- (let ((buf (vterm-other-window)))
- (with-current-buffer buf
- (rename-buffer master-name t)))))))
-
-(defun my/switch-to-master-vterm ()
- (interactive)
- (let* ((master-name "Master Terminal")
- (master-buf (get-buffer master-name))
- (visible-win (and master-buf (get-buffer-window master-buf t))))
- (cond
- (visible-win
- (select-window visible-win))
- (master-buf
- (switch-to-buffer master-buf))
- (t
- (let ((buf (vterm)))
- (with-current-buffer buf
- (rename-buffer master-name t)))))))
-
-(use-package vterm
- :bind ( ("C-c a" . my/switch-to-master-vterm-other-window)
- ("C-c C-a" . my/replace-master-vterm)
- :map vterm-mode-map
- ("C-c c" . vterm-copy-mode)
- ("C-l" . my-vterm-clear)
- :map vterm-copy-mode-map
- ("C-c c" . vterm-copy-mode))
- :config
- (defun my-vterm-clear ()
- (interactive)
- (vterm-send-key "l" nil nil t)
- (vterm-clear-scrollback))
- (defun my-vterm-copy-mode-evil-setup ()
- "Enable evil only in vterm-copy-mode."
- (if vterm-copy-mode
- ;; on enter
- (progn
- (evil-local-mode 1)
- (evil-force-normal-state))
- ;; on exit
- (evil-local-mode -1)))
- (defun my-vterm-setup ()
- (when (bound-and-true-p evil-local-mode)
- (evil-local-mode -1))
- (setq-local truncate-lines nil))
- ;; disable evil
- (with-eval-after-load 'evil
- (evil-set-initial-state 'vterm-mode 'emacs))
- (add-hook 'vterm-mode-hook #'my-vterm-setup)
- (add-hook 'vterm-copy-mode-hook #'my-vterm-copy-mode-evil-setup))
-
-;; == languages
-;; (setq treesit-font-lock-level 4)
-;; (setq treesit-language-source-alist
-;; '((cpp "https://github.com/tree-sitter/tree-sitter-cpp")
-;; (c "https://github.com/tree-sitter/tree-sitter-c")
-;; (python "https://github.com/tree-sitter/tree-sitter-python")))
-;; (dolist (lang treesit-language-source-alist)
-;; (unless (treesit-language-available-p (car lang))
-;; (treesit-install-language-grammar (car lang))))
-;; (setq treesit-load-name-override-list
-;; '((c++ "libtree-sitter-cpp")))
-;; (setq major-mode-remap-alist '((c-mode . c-ts-mode)
-;; (c++-mode . c++-ts-mode)
-;; (python-mode . python-ts-mode)))
-
-;; === c mode
-(defun my-c-mode-common-hook ()
- ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode
- (setq c-default-style "k&r"
- c-basic-offset 4
- indent-tabs-mode t)
- (c-set-offset 'arglist-intro '+)
- (c-set-offset 'case-label '+)
- (add-to-list 'c-offsets-alist '(arglist-close . c-lineup-close-paren)))
-(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
-
-;; === odin mode
-(use-package odin-mode
- :vc (:url "https://github.com/mattt-b/odin-mode"
- :rev :newest))
-
-;; === markdown
-(add-hook 'markdown-mode-hook #'auto-fill-mode)
-
-;; == proj
-(require 'proj)
-(setq
- proj-locations '(("~/development/" . 1) ("~/opt/" . 1) ("~/classes/" . 2) ("~/dotfiles/" . 0) ("~/dotfiles/.config/emacs/lisp/" . 1))
- proj-grep-function 'consult-ripgrep)
-
-(global-set-key (kbd "C-x b") `proj-switch-to-buffer)
-(global-set-key (kbd "C-c b") `switch-to-buffer)
-
-(global-set-key (kbd "C-x k") `proj-kill-buffer)
-(global-set-key (kbd "C-c k") `kill-buffer)
-
-
-;; == toggle-window
-(require 'toggle-window)
-(global-set-key (kbd "C-c w") 'toggle-window)
+ (savehist-mode))
+
+;; load my config files
+(defun loadc (file) (load (expand-file-name file user-emacs-directory)))
+(loadc "ui.el")
+(loadc "text-editing.el")
+(loadc "misc.el")
+(loadc "style.el")
+(loadc "file-management.el") (context-menu-mode t)
+(loadc "ide.el")
+(loadc "evil.el")
+(loadc "lang.el")
+
+;; skipped: diminish, improved C-g, evil nerd commenter, ansi color and rainbow
+;; delimiters, evil, rainbow,