Compare commits

..

2 Commits

Author SHA1 Message Date
Rob Harbaugh
eca14f3542 Restore emacs alias in zshrc
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-29 14:22:27 -04:00
Rob Harbaugh
03ec094e1f Restore emacs configs for laptop, shared, and work
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-29 14:21:17 -04:00
8 changed files with 456 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 "<escape>") #'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")

View File

@@ -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

View File

@@ -7,6 +7,7 @@
"guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" }, "guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" },
"harpoon": { "branch": "harpoon2", "commit": "87b1a3506211538f460786c23f98ec63ad9af4e5" }, "harpoon": { "branch": "harpoon2", "commit": "87b1a3506211538f460786c23f98ec63ad9af4e5" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"lazygit.nvim": { "branch": "main", "commit": "a04ad0dbc725134edbee3a5eea29290976695357" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "0a3b42c3e503df87aef6d6513e13148381495c3a" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "0a3b42c3e503df87aef6d6513e13148381495c3a" },
"mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" }, "mason-nvim-dap.nvim": { "branch": "main", "commit": "9a10e096703966335bd5c46c8c875d5b0690dade" },
"mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" },

View File

@@ -18,6 +18,7 @@ PROMPT="%F{blue}%m %~%b"$'\n'"%(?.%F{green}%Bλ%b |.%F{red}?) %f"
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$HOME/go/bin:$HOME/.local/bin:$PATH" export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$HOME/go/bin:$HOME/.local/bin:$PATH"
# Aliases # Aliases
alias e="emacsclient -t -a \"\""
alias mailsync="mbsync -a" alias mailsync="mbsync -a"
alias c="clear" alias c="clear"
alias cat="bat --paging=never --style=plain" alias cat="bat --paging=never --style=plain"

View File

@@ -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