diff options
| author | Jack Jamison <jackqjamison@gmail.com> | 2026-07-05 01:19:30 -0400 |
|---|---|---|
| committer | Jack Jamison <jackqjamison@gmail.com> | 2026-07-05 01:19:30 -0400 |
| commit | bdf9a71ab7baa2b1de9abcfd5df1a9107a55d141 (patch) | |
| tree | c4524e6c41aa5107211103401dabfaefc81aa882 /.config/emacs/init.el | |
| parent | fe3984f541bd32bdfa418afb305b614176b55ca0 (diff) | |
add a bunch of emacs packages HELP
Diffstat (limited to '.config/emacs/init.el')
| -rw-r--r-- | .config/emacs/init.el | 636 |
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, |
