From 03ec094e1f4026ddc1ec3af2bf4090b60b149594 Mon Sep 17 00:00:00 2001 From: Rob Harbaugh Date: Wed, 29 Apr 2026 14:21:17 -0400 Subject: [PATCH] Restore emacs configs for laptop, shared, and work Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- laptop/.config/emacs/dev-settings.el | 87 +++++++++++ laptop/.config/emacs/latex-settings.el | 34 +++++ shared/.config/emacs/common-dev-settings.el | 77 ++++++++++ shared/.config/emacs/init.el | 159 ++++++++++++++++++++ shared/.config/emacs/org-bindings.el | 35 +++++ work/.config/emacs/dev-settings.el | 62 ++++++++ 6 files changed, 454 insertions(+) create mode 100644 laptop/.config/emacs/dev-settings.el create mode 100644 laptop/.config/emacs/latex-settings.el create mode 100644 shared/.config/emacs/common-dev-settings.el create mode 100644 shared/.config/emacs/init.el create mode 100644 shared/.config/emacs/org-bindings.el create mode 100644 work/.config/emacs/dev-settings.el diff --git a/laptop/.config/emacs/dev-settings.el b/laptop/.config/emacs/dev-settings.el new file mode 100644 index 0000000..dc5540f --- /dev/null +++ b/laptop/.config/emacs/dev-settings.el @@ -0,0 +1,87 @@ +;;; dev-settings.el --- Laptop development environment + +;;; DAP Mode + +(use-package dap-mode + :defer t + :commands (dap-mode dap-debug) + :config + (require 'dap-gdb-lldb) + (require 'dap-cpptools)) + +;;; C / C++ + +(use-package c-ts-mode + :ensure nil + :mode (("\\.c\\'" . c-ts-mode) + ("\\.h\\'" . c-ts-mode) + ("\\.cpp\\'" . c++-ts-mode) + ("\\.hpp\\'" . c++-ts-mode) + ("\\.cc\\'" . c++-ts-mode) + ("\\.cxx\\'" . c++-ts-mode)) + :hook ((c-ts-mode . eglot-ensure) + (c++-ts-mode . eglot-ensure)) + :config + (setq c-ts-mode-indent-offset 4)) + +;;; Go + +(use-package go-ts-mode + :ensure nil + :mode "\\.go\\'" + :hook (go-ts-mode . eglot-ensure) + :config + (setq go-ts-mode-indent-offset 4)) + +(with-eval-after-load 'dap-mode + (require 'dap-dlv-go)) + +;;; Rust + +(use-package rust-ts-mode + :ensure nil + :mode "\\.rs\\'" + :hook (rust-ts-mode . eglot-ensure) + :config + (setq rust-ts-mode-indent-offset 4)) + +;; rust-analyzer is installed via: rustup component add rust-analyzer +(with-eval-after-load 'eglot + (add-to-list 'eglot-server-programs + '(rust-ts-mode . ("rust-analyzer")))) + +;;; Common Lisp + +(use-package slime + :defer t + :commands slime + :config + (setq inferior-lisp-program "sbcl") + (setq slime-contribs '(slime-fancy slime-company)) + (setq slime-lisp-implementations + '((sbcl ("sbcl") :coding-system utf-8-unix) + (ccl ("ccl") :coding-system utf-8-unix)))) + +(use-package slime-company + :defer t + :after (slime company) + :config + (setq slime-company-completion 'fuzzy)) + +;;; DAP Keybindings + +(with-eval-after-load 'dap-mode + (keymap-set dap-mode-map "C-c d d" #'dap-debug) + (keymap-set dap-mode-map "C-c d b" #'dap-breakpoint-toggle) + (keymap-set dap-mode-map "C-c d c" #'dap-continue) + (keymap-set dap-mode-map "C-c d n" #'dap-next) + (keymap-set dap-mode-map "C-c d i" #'dap-step-in) + (keymap-set dap-mode-map "C-c d o" #'dap-step-out) + (keymap-set dap-mode-map "C-c d r" #'dap-restart-frame) + (keymap-set dap-mode-map "C-c d q" #'dap-disconnect) + (keymap-set dap-mode-map "C-c d e" #'dap-eval) + (keymap-set dap-mode-map "C-c d l" #'dap-ui-locals) + (keymap-set dap-mode-map "C-c d s" #'dap-ui-sessions)) + +(provide 'dev-settings) +;;; dev-settings.el ends here diff --git a/laptop/.config/emacs/latex-settings.el b/laptop/.config/emacs/latex-settings.el new file mode 100644 index 0000000..e962c50 --- /dev/null +++ b/laptop/.config/emacs/latex-settings.el @@ -0,0 +1,34 @@ +;;; latex-settings.el --- AUCTeX / LaTeX configuration + +(use-package auctex + :defer t + :init + (setq TeX-auto-save t ; cache style info in auto/ for faster opens + TeX-parse-self t ; parse document on open for completions + TeX-PDF-mode t ; compile to PDF by default + TeX-source-correlate-mode t ; SyncTeX: link editor positions to PDF + TeX-source-correlate-start-server t) + :hook + ((LaTeX-mode . LaTeX-math-mode) + (LaTeX-mode . flyspell-mode) + (LaTeX-mode . reftex-mode)) + :config + (setq reftex-plug-into-AUCTeX t) + ;; Use zathura as the PDF viewer (SyncTeX: click in PDF jumps to source line) + (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura")) + ;; LatexMk handles multiple pdflatex passes, bibliography, index automatically + (add-to-list 'TeX-command-list + '("LatexMk" "latexmk -pdf -interaction=nonstopmode %s" + TeX-run-TeX nil t :help "Run latexmk")) + (setq TeX-command-default "LatexMk") + + (defun rh/latex-build-pdf () + "Compile the current LaTeX buffer to PDF using latexmk." + (interactive) + (TeX-command "LatexMk" #'TeX-master-file)) + + (with-eval-after-load 'latex + (define-key LaTeX-mode-map (kbd "C-c C-b") #'rh/latex-build-pdf))) + +(provide 'latex-settings) +;;; latex-settings.el ends here diff --git a/shared/.config/emacs/common-dev-settings.el b/shared/.config/emacs/common-dev-settings.el new file mode 100644 index 0000000..6d7b90a --- /dev/null +++ b/shared/.config/emacs/common-dev-settings.el @@ -0,0 +1,77 @@ +;;; common-dev-settings.el --- Dev tooling shared across all hosts + +;;; Completion + +(use-package company + :defer 1 + :config + (global-company-mode) + (setq company-idle-delay 0.2 + company-minimum-prefix-length 2 + company-show-numbers t + company-tooltip-align-annotations t)) + +;;; LSP + +(use-package eglot + :ensure nil + :defer t + :commands (eglot eglot-ensure) + :config + (setq eglot-autoshutdown t + eglot-send-changes-idle-time 0.5) + (setq eldoc-echo-area-use-multiline-p nil) + (add-to-list 'eglot-stay-out-of 'eldoc)) + +;;; Tree-sitter mode management +;; Grammar sources and installation are host-specific; see dev-settings.el. + +(use-package treesit-auto + :custom + (treesit-auto-install 'prompt) + :config + (treesit-auto-add-to-auto-mode-alist 'all) + (global-treesit-auto-mode)) + +;;; Utilities + +(use-package helpful + :defer t + :commands (helpful-callable helpful-variable helpful-key)) + +(use-package smartparens + :defer 1 + :hook (prog-mode . smartparens-mode) + :config + (require 'smartparens-config)) + +(use-package yasnippet + :defer 2 + :config + (yas-global-mode 1)) + +(use-package yasnippet-snippets + :defer t + :after yasnippet) + +;;; Emacs Lisp + +(add-hook 'emacs-lisp-mode-hook #'eldoc-mode) +(add-hook 'emacs-lisp-mode-hook #'company-mode) + +;;; LSP Keybindings + +(with-eval-after-load 'eglot + (keymap-set eglot-mode-map "C-c l d" #'xref-find-definitions) + (keymap-set eglot-mode-map "C-c l r" #'xref-find-references) + (keymap-set eglot-mode-map "C-c l i" #'eglot-find-implementation) + (keymap-set eglot-mode-map "C-c l t" #'eglot-find-typeDefinition) + (keymap-set eglot-mode-map "C-c l h" #'eldoc-doc-buffer) + (keymap-set eglot-mode-map "C-c l s" #'eldoc) + (keymap-set eglot-mode-map "C-c l a" #'eglot-code-actions) + (keymap-set eglot-mode-map "C-c l n" #'eglot-rename) + (keymap-set eglot-mode-map "C-c l e" #'flymake-show-buffer-diagnostics) + (keymap-set eglot-mode-map "C-c l f" #'eglot-format-buffer)) + +(provide 'common-dev-settings) +;;; common-dev-settings.el ends here diff --git a/shared/.config/emacs/init.el b/shared/.config/emacs/init.el new file mode 100644 index 0000000..5f1a112 --- /dev/null +++ b/shared/.config/emacs/init.el @@ -0,0 +1,159 @@ +;; init.el + +(defun rh/load-user-file (file) + "Load FILE from `user-emacs-directory' when it exists." + (let ((path (expand-file-name file user-emacs-directory))) + (when (file-exists-p path) + (load path nil 'nomessage)))) + +;;; Startup/UI --------------------------------------------------------------- + +(setq inhibit-startup-message t + visible-bell t) + +(scroll-bar-mode -1) +(tool-bar-mode -1) +(tooltip-mode -1) +(menu-bar-mode -1) + +;;; Editing Defaults --------------------------------------------------------- + +(global-display-line-numbers-mode 1) +(setq display-line-numbers-type 'relative) + +(setq make-backup-files nil + auto-save-default nil + create-lockfiles nil) + +(setq vc-follow-symlinks t + find-file-visit-truename t) + +;;; Package Manager ---------------------------------------------------------- + +(require 'package) + +(setq package-archives '(("melpa" . "https://melpa.org/packages/") + ("elpa" . "https://elpa.gnu.org/packages/"))) + +(package-initialize) +(unless package-archive-contents + (package-refresh-contents)) + +(unless (package-installed-p 'use-package) + (package-install 'use-package)) + +(require 'use-package) +(setq use-package-always-ensure t) + +(setq custom-file (expand-file-name "custom.el" user-emacs-directory)) + +;;; Style/Theme -------------------------------------------------------------- + +(use-package catppuccin-theme + :init + (setq catppuccin-flavor 'mocha) + :config + (load-theme 'catppuccin t)) + +;; Icons are only useful in GUI Emacs. +(use-package all-the-icons + :if (display-graphic-p)) + +;; Color nested delimiters in programming buffers. +(use-package rainbow-delimiters + :hook (prog-mode . rainbow-delimiters-mode)) + +(use-package doom-modeline + :init + (doom-modeline-mode 1) + :config + (setq doom-modeline-height 15)) + +;;; Completion/Search/Navigation --------------------------------------------- + +(use-package vertico + :init + (vertico-mode)) + +(use-package consult + :bind (("C-x b" . consult-buffer) + ("C-s" . consult-line) + ("M-y" . consult-yank-pop))) + +(use-package orderless + :config + (setq completion-styles '(orderless basic) + completion-category-defaults nil)) + +(use-package marginalia + :init + (marginalia-mode)) + +(use-package embark + :bind (("C-." . embark-act) + ("M-." . embark-dwim))) + +(use-package embark-consult + :after (embark consult)) + +(use-package which-key + :init + (which-key-mode) + :config + (setq which-key-idle-delay 1)) + +;;; Key Bindings ------------------------------------------------------------- + +;; Make ESC quit prompts. +(global-set-key (kbd "") #'keyboard-escape-quit) + +;; windmove: S-Arrow to move between windows (built-in since Emacs 27). +(windmove-default-keybindings) + +;;; Projects ----------------------------------------------------------------- + +(use-package projectile + :init + (when (file-directory-p "~/src") + (setq projectile-project-search-path '("~/src"))) + (setq projectile-switch-project-action #'projectile-dired) + :config + (projectile-mode 1) + :bind-keymap + ("C-c p" . projectile-command-map)) + +(use-package consult-projectile + :bind (("C-c h" . consult-projectile))) + +;;; Git ---------------------------------------------------------------------- + +(use-package magit + :commands (magit-status magit-get-current-branch) + :bind (("C-x g" . magit-status) + ("C-x M-g" . magit-dispatch) + ("C-c M-g" . magit-file-dispatch)) + :custom + (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1) + (magit-diff-refine-hunk t) + (magit-auto-revert-mode nil) + (magit-process-find-password-functions '(magit-process-password-auth-source))) + +;;; Org ---------------------------------------------------------------------- + +(defun rh/org-mode-setup () + (org-indent-mode) + (visual-line-mode 1)) + +(use-package org + :hook (org-mode . rh/org-mode-setup) + :config + (setq org-agenda-files + (if (file-directory-p "~/org") + (directory-files-recursively "~/org" "\\.org$") + nil))) + +(rh/load-user-file "org-bindings.el") +(rh/load-user-file "common-dev-settings.el") +(rh/load-user-file "dev-settings.el") +(rh/load-user-file "latex-settings.el") +(rh/load-user-file "custom.el") diff --git a/shared/.config/emacs/org-bindings.el b/shared/.config/emacs/org-bindings.el new file mode 100644 index 0000000..b82ac4f --- /dev/null +++ b/shared/.config/emacs/org-bindings.el @@ -0,0 +1,35 @@ +;;; org-bindings.el --- Standard Emacs keybindings for Org mode + +(with-eval-after-load 'org + ;; Org agenda and capture + (global-set-key (kbd "C-c o a") 'org-agenda) + (global-set-key (kbd "C-c o c") 'org-capture) + + ;; Link commands + (define-key org-mode-map (kbd "C-c o l") 'org-store-link) + (define-key org-mode-map (kbd "C-c o i") 'org-insert-link) + + ;; TODO and scheduling + (define-key org-mode-map (kbd "C-c o t") 'org-todo) + (define-key org-mode-map (kbd "C-c o s") 'org-schedule) + (define-key org-mode-map (kbd "C-c o d") 'org-deadline) + (define-key org-mode-map (kbd "C-c o T") 'org-time-stamp) + (define-key org-mode-map (kbd "C-c o p") 'org-priority) + + ;; Checkboxes and lists + (define-key org-mode-map (kbd "C-c o x") 'org-toggle-checkbox) + (define-key org-mode-map (kbd "C-c o -") 'org-ctrl-c-minus) + + ;; Refile + (define-key org-mode-map (kbd "C-c o r") 'org-refile)) + +;; Theme selection +(global-set-key (kbd "C-c t t") 'consult-theme) + +;; Text scaling with standard Emacs bindings +(global-set-key (kbd "C-x C-=") 'text-scale-increase) +(global-set-key (kbd "C-x C--") 'text-scale-decrease) +(global-set-key (kbd "C-x C-0") 'text-scale-adjust) + +(provide 'org-bindings) +;;; org-bindings.el ends here diff --git a/work/.config/emacs/dev-settings.el b/work/.config/emacs/dev-settings.el new file mode 100644 index 0000000..254043c --- /dev/null +++ b/work/.config/emacs/dev-settings.el @@ -0,0 +1,62 @@ +;;; dev-settings.el --- Work development environment (C#, TypeScript, JavaScript, CSS, HTML) + +;;; C# +;; LSP server: dotnet tool install -g csharp-ls + +(use-package csharp-ts-mode + :ensure nil + :mode "\\.cs\\'" + :hook (csharp-ts-mode . eglot-ensure)) + +;;; TypeScript / TSX + +(use-package typescript-ts-mode + :ensure nil + :mode (("\\.ts\\'" . typescript-ts-mode) + ("\\.tsx\\'" . tsx-ts-mode)) + :hook ((typescript-ts-mode . eglot-ensure) + (tsx-ts-mode . eglot-ensure))) + +;;; JavaScript / JSX +;; typescript-language-server handles JS too; install via: npm i -g typescript-language-server typescript + +(use-package js-ts-mode + :ensure nil + :mode (("\\.js\\'" . js-ts-mode) + ("\\.mjs\\'" . js-ts-mode) + ("\\.cjs\\'" . js-ts-mode) + ("\\.jsx\\'" . js-ts-mode)) + :hook (js-ts-mode . eglot-ensure) + :config + (setq js-indent-level 2)) + +;;; CSS +;; LSP server: npm i -g vscode-langservers-extracted + +(use-package css-ts-mode + :ensure nil + :mode "\\.css\\'" + :hook (css-ts-mode . eglot-ensure) + :config + (setq css-indent-offset 2)) + +;;; HTML +;; LSP server: npm i -g vscode-langservers-extracted + +(use-package html-ts-mode + :ensure nil + :mode (("\\.html\\'" . html-ts-mode) + ("\\.htm\\'" . html-ts-mode)) + :hook (html-ts-mode . eglot-ensure)) + +;;; Prettier (formatting for JS/TS/CSS/HTML) + +(use-package prettier + :hook ((typescript-ts-mode . prettier-mode) + (tsx-ts-mode . prettier-mode) + (js-ts-mode . prettier-mode) + (css-ts-mode . prettier-mode) + (html-ts-mode . prettier-mode))) + +(provide 'dev-settings) +;;; dev-settings.el ends here