Last active
November 28, 2025 00:01
-
-
Save chase-lambert/3caf62fccf1c3d9913267a083664e1e7 to your computer and use it in GitHub Desktop.
some dotfiles while I explore a more robust solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;;; init.el --- Personal Emacs config -*- lexical-binding: t; -*- | |
| ;;; Commentary: | |
| ;; a personal take on a Doom style setup | |
| ;;; Code: | |
| (setq gc-cons-threshold most-positive-fixnum) | |
| (add-hook 'emacs-startup-hook | |
| (lambda () (setq gc-cons-threshold (* 16 1024 1024)))) | |
| (when (featurep 'native-compile) | |
| (setq native-comp-async-report-warnings-errors 'silent)) | |
| (setq warning-minimum-level :error) | |
| (require 'package) | |
| (setq package-archives | |
| '(("gnu" . "https://elpa.gnu.org/packages/") | |
| ("nongnu" . "https://elpa.nongnu.org/nongnu/") | |
| ("melpa" . "https://melpa.org/packages/"))) | |
| (package-initialize) | |
| ; bootstrap use-package on fresh installs | |
| (unless (package-installed-p 'use-package) | |
| (package-refresh-contents) | |
| (package-install 'use-package)) | |
| (require 'use-package) | |
| (setq use-package-always-ensure t) | |
| (use-package emacs | |
| :ensure nil | |
| :init | |
| (menu-bar-mode -1) | |
| (tool-bar-mode -1) | |
| (scroll-bar-mode -1) | |
| (tooltip-mode -1) | |
| (blink-cursor-mode -1) | |
| (setq inhibit-startup-screen t) | |
| (setq initial-scratch-message ";; Happy Hacking!\n\n") | |
| (setq initial-major-mode 'emacs-lisp-mode) | |
| (setq-default indent-tabs-mode nil) | |
| (setq-default tab-width 2) | |
| (setq ring-bell-function 'ignore) | |
| (setq use-short-answers t) | |
| (setq confirm-kill-emacs 'y-or-n-p) | |
| (setq require-final-newline t) | |
| (setq sentence-end-double-space nil) | |
| (setq scroll-margin 3) | |
| (setq scroll-conservatively 101) | |
| (setq scroll-preserve-screen-position t) | |
| (setq auto-save-default nil) | |
| (setq make-backup-files nil) | |
| (setq create-lockfiles nil) | |
| (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) | |
| (when (file-exists-p custom-file) (load custom-file 'noerror)) | |
| (global-display-line-numbers-mode 1) | |
| (dolist (mode '(term-mode-hook eshell-mode-hook eat-mode-hook dired-mode-hook)) | |
| (add-hook mode (lambda () (display-line-numbers-mode 0)))) | |
| (setq-default truncate-lines t) | |
| (setq-default fill-column 80) | |
| (global-hl-line-mode 1) | |
| (show-paren-mode 1) | |
| (recentf-mode 1) | |
| (savehist-mode 1) | |
| (save-place-mode 1) | |
| (global-auto-revert-mode 1) | |
| (setq global-auto-revert-non-file-buffers t) | |
| (global-set-key (kbd "C-S-c") 'kill-ring-save) | |
| (global-set-key (kbd "C-S-v") 'yank) | |
| (global-set-key (kbd "C-S-p") 'yank) | |
| ; electric-pair for auto-closing brackets in non-lisp modes | |
| (electric-pair-mode 1) | |
| (set-default-coding-systems 'utf-8) | |
| (prefer-coding-system 'utf-8) | |
| (set-face-attribute 'default nil :font "DejaVu Sans Mono" :height 110)) | |
| (use-package ef-themes | |
| :config | |
| (setq ef-themes-to-toggle '(ef-day ef-night)) | |
| (mapc #'disable-theme custom-enabled-themes) | |
| (load-theme 'ef-day t)) | |
| (defun my/set-theme-toggle-pair () | |
| (interactive) | |
| (let* ((themes (mapcar #'symbol-name (custom-available-themes))) | |
| (ef-only (seq-filter (lambda (s) (string-prefix-p "ef-" s)) themes)) | |
| (light (intern (completing-read "Light theme: " ef-only nil t))) | |
| (dark (intern (completing-read "Dark theme: " ef-only nil t)))) | |
| (setq ef-themes-to-toggle (list light dark)) | |
| (message "Toggle pair set: %s / %s" light dark))) | |
| (use-package doom-modeline | |
| :hook (after-init . doom-modeline-mode) | |
| :config | |
| (setq doom-modeline-height 28) | |
| (setq doom-modeline-buffer-file-name-style 'relative-from-project) | |
| (setq doom-modeline-icon t)) | |
| (use-package nerd-icons) | |
| (use-package evil | |
| :init | |
| (setq evil-want-integration t) | |
| (setq evil-want-keybinding nil) | |
| (setq evil-want-C-u-scroll t) | |
| (setq evil-want-C-i-jump t) | |
| (setq evil-want-Y-yank-to-eol t) | |
| (setq evil-undo-system 'undo-redo) | |
| (setq evil-search-module 'evil-search) | |
| (setq evil-split-window-below t) | |
| (setq evil-vsplit-window-right t) | |
| (setq evil-respect-visual-line-mode t) | |
| :config | |
| (evil-mode 1) | |
| (global-set-key (kbd "<escape>") 'keyboard-escape-quit) | |
| (define-key evil-insert-state-map (kbd "j") | |
| (lambda () (interactive) | |
| (let ((next-key (read-event nil nil 0.2))) | |
| (if (eq next-key ?k) | |
| (evil-normal-state) | |
| (insert "j") | |
| (when next-key (push next-key unread-command-events))))))) | |
| (use-package evil-collection | |
| :after evil | |
| :config | |
| (evil-collection-init)) | |
| (use-package evil-surround | |
| :after evil | |
| :config | |
| (global-evil-surround-mode 1)) | |
| (use-package evil-commentary | |
| :after evil | |
| :config | |
| (evil-commentary-mode)) | |
| (use-package evil-lion | |
| :after evil | |
| :config | |
| (evil-lion-mode)) | |
| (use-package evil-goggles | |
| :after evil | |
| :config | |
| (setq evil-goggles-duration 0.1) | |
| (evil-goggles-mode)) | |
| (use-package evil-matchit | |
| :after evil | |
| :config | |
| (global-evil-matchit-mode 1)) | |
| (use-package vertico | |
| :init (vertico-mode) | |
| :config | |
| (setq vertico-cycle t) | |
| (setq vertico-count 15) | |
| (define-key vertico-map (kbd "TAB") #'vertico-insert) | |
| (define-key vertico-map (kbd "<tab>") #'vertico-insert) | |
| (define-key vertico-map (kbd "C-j") #'vertico-next) | |
| (define-key vertico-map (kbd "C-k") #'vertico-previous)) | |
| (with-eval-after-load 'vertico | |
| (require 'vertico-directory) | |
| (define-key vertico-map (kbd "RET") #'vertico-directory-enter) | |
| (define-key vertico-map (kbd "DEL") #'vertico-directory-delete-char) | |
| (define-key vertico-map (kbd "M-DEL") #'vertico-directory-delete-word) | |
| (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy)) | |
| (use-package orderless | |
| :config | |
| (setq completion-styles '(orderless basic)) | |
| (setq completion-category-defaults nil) | |
| (setq completion-category-overrides '((file (styles partial-completion))))) | |
| (use-package marginalia | |
| :init (marginalia-mode)) | |
| (use-package consult | |
| :config | |
| (setq consult-narrow-key "<") | |
| (setq consult-preview-key '(:debounce 0.2 any))) | |
| (use-package embark | |
| :bind (("C-." . embark-act) ("C-;" . embark-dwim)) | |
| :config | |
| (setq prefix-help-command #'embark-prefix-help-command)) | |
| (use-package embark-consult | |
| :after (embark consult) | |
| :demand t | |
| :hook (embark-collect-mode . consult-preview-at-point-mode)) | |
| (use-package corfu | |
| :custom | |
| (corfu-auto t) | |
| (corfu-auto-delay 0.1) | |
| (corfu-auto-prefix 2) | |
| (corfu-cycle t) | |
| (corfu-quit-no-match 'separator) | |
| :init (global-corfu-mode) | |
| :config | |
| (define-key corfu-map (kbd "TAB") #'corfu-next) | |
| (define-key corfu-map (kbd "<tab>") #'corfu-next) | |
| (define-key corfu-map (kbd "S-TAB") #'corfu-previous) | |
| (define-key corfu-map (kbd "<backtab>") #'corfu-previous) | |
| (define-key corfu-map (kbd "RET") #'corfu-insert)) | |
| (use-package cape | |
| :init | |
| (add-to-list 'completion-at-point-functions #'cape-file) | |
| (add-to-list 'completion-at-point-functions #'cape-dabbrev)) | |
| (use-package which-key | |
| :config | |
| (setq which-key-idle-delay 0.5) | |
| (setq which-key-separator " → ") | |
| (setq which-key-prefix-prefix "+") | |
| (which-key-mode)) | |
| (use-package dired-sidebar | |
| :commands (dired-sidebar-toggle-sidebar) | |
| :config | |
| (setq dired-sidebar-theme 'nerd) | |
| (setq dired-sidebar-width 35) | |
| (setq dired-sidebar-use-custom-font t) | |
| (evil-define-key 'normal dired-sidebar-mode-map | |
| (kbd "RET") 'dired-sidebar-find-file | |
| (kbd "o") 'dired-sidebar-find-file-alt | |
| (kbd "ma") 'dired-create-empty-file | |
| (kbd "md") 'dired-create-directory | |
| (kbd "mc") 'dired-do-copy | |
| (kbd "mm") 'dired-do-rename | |
| (kbd "mD") 'dired-do-delete | |
| (kbd "q") 'dired-sidebar-toggle-sidebar)) | |
| (defun my/show-line-diagnostics () | |
| (interactive) | |
| (if (bound-and-true-p flymake-mode) | |
| (let ((diags (flymake-diagnostics (line-beginning-position) (line-end-position)))) | |
| (if diags | |
| (message "%s" (mapconcat | |
| (lambda (d) (flymake-diagnostic-text d)) | |
| diags "\n")) | |
| (message "No diagnostics on this line"))) | |
| (message "Flymake not active"))) | |
| (use-package general | |
| :after evil | |
| :config | |
| (general-evil-setup) | |
| (general-create-definer leader-keys | |
| :states '(normal insert visual emacs) | |
| :keymaps 'override | |
| :prefix "SPC" | |
| :global-prefix "C-SPC") | |
| (leader-keys | |
| "SPC" '(execute-extended-command :wk "M-x") | |
| "TAB" '(evil-switch-to-windows-last-buffer :wk "last buffer") | |
| "RET" '(evil-ex-nohighlight :wk "clear search") | |
| "u" '(universal-argument :wk "universal arg") | |
| "n" '((lambda () (interactive) (evil-open-below 1) (evil-normal-state)) :wk "blank line below") | |
| "e" '(my/show-line-diagnostics :wk "show diagnostic") | |
| "v" '((lambda () (interactive) (find-file "~/.emacs.d/init.el")) :wk "init.el") | |
| "f" '(:ignore t :wk "file") | |
| "ff" '(project-find-file :wk "find in project") | |
| "fF" '(find-file :wk "find file") | |
| "fr" '(consult-recent-file :wk "recent files") | |
| "fw" '(save-buffer :wk "save") | |
| "fa" '((lambda () (interactive) (save-some-buffers t)) :wk "save all") | |
| "fW" '(write-file :wk "save as") | |
| "fR" '(rename-visited-file :wk "rename") | |
| "fD" '((lambda () (interactive) | |
| (when (y-or-n-p (format "Delete %s?" (buffer-file-name))) | |
| (delete-file (buffer-file-name)) | |
| (kill-buffer))) :wk "delete") | |
| "fy" '((lambda () (interactive) | |
| (when buffer-file-name | |
| (kill-new buffer-file-name) | |
| (message "Copied: %s" buffer-file-name))) :wk "yank path") | |
| "fe" '(eval-buffer :wk "eval buffer") | |
| "b" '(:ignore t :wk "buffer") | |
| "bb" '(consult-buffer :wk "switch buffer") | |
| "bd" '(kill-current-buffer :wk "kill buffer") | |
| "bD" '(kill-buffer-and-window :wk "kill buffer & window") | |
| "br" '(revert-buffer :wk "revert buffer") | |
| "bs" '(scratch-buffer :wk "scratch buffer") | |
| "by" '((lambda () (interactive) | |
| (mark-whole-buffer) | |
| (call-interactively 'evil-yank) | |
| (message "Yanked entire buffer")) :wk "yank buffer") | |
| "w" '(:ignore t :wk "window") | |
| "wv" '(evil-window-vsplit :wk "vsplit") | |
| "ws" '(evil-window-split :wk "hsplit") | |
| "wd" '(evil-window-delete :wk "close") | |
| "wo" '(delete-other-windows :wk "only") | |
| "wh" '(evil-window-left :wk "left") | |
| "wj" '(evil-window-down :wk "down") | |
| "wk" '(evil-window-up :wk "up") | |
| "wl" '(evil-window-right :wk "right") | |
| "w=" '(balance-windows :wk "balance") | |
| "s" '(:ignore t :wk "search") | |
| "ss" '(consult-line :wk "search buffer") | |
| "sS" '(consult-line-multi :wk "search all buffers") | |
| "sp" '(consult-ripgrep :wk "ripgrep") | |
| "sf" '(consult-find :wk "find file") | |
| "si" '(consult-imenu :wk "imenu") | |
| "sr" '(consult-register :wk "registers") | |
| "sm" '(consult-mark :wk "marks") | |
| "so" '(consult-outline :wk "outline") | |
| "p" '(:ignore t :wk "project") | |
| "pp" '(project-switch-project :wk "switch project") | |
| "pf" '(project-find-file :wk "find file") | |
| "pb" '(project-switch-to-buffer :wk "buffers") | |
| "ps" '(consult-ripgrep :wk "search") | |
| "pk" '(project-kill-buffers :wk "kill buffers") | |
| "pd" '(project-find-dir :wk "find dir") | |
| "g" '(:ignore t :wk "git") | |
| "gg" '(magit-status :wk "status") | |
| "gb" '(magit-blame :wk "blame") | |
| "gl" '(magit-log-current :wk "log") | |
| "gd" '(magit-diff-dwim :wk "diff") | |
| "gf" '(magit-file-dispatch :wk "file") | |
| "c" '(:ignore t :wk "code") | |
| "ca" '(eglot-code-actions :wk "actions") | |
| "cr" '(eglot-rename :wk "rename") | |
| "cf" '(eglot-format :wk "format") | |
| "cF" '(eglot-format-buffer :wk "format buffer") | |
| "cd" '(xref-find-definitions :wk "definition") | |
| "cD" '(xref-find-references :wk "references") | |
| "ci" '(eglot-find-implementation :wk "implementation") | |
| "ce" '(consult-flymake :wk "errors list") | |
| "t" '(:ignore t :wk "toggle") | |
| "ta" '(dired-sidebar-toggle-sidebar :wk "file tree") | |
| "tt" '(my/toggle-terminal :wk "terminal") | |
| "tT" '(ef-themes-toggle :wk "light/dark toggle") | |
| "ts" '(ef-themes-select :wk "select theme") | |
| "tp" '(my/set-theme-toggle-pair :wk "set toggle pair") | |
| "tl" '(display-line-numbers-mode :wk "line numbers") | |
| "tw" '(whitespace-mode :wk "whitespace") | |
| "tz" '(writeroom-mode :wk "zen mode") | |
| "ti" '(eglot-inlay-hints-mode :wk "inlay hints") | |
| "o" '(:ignore t :wk "open") | |
| "oa" '(org-agenda :wk "agenda") | |
| "oc" '(org-capture :wk "capture") | |
| "od" '(dired-jump :wk "dired here") | |
| "oD" '(dired :wk "dired") | |
| "q" '(:ignore t :wk "quit") | |
| "qq" '(save-buffers-kill-terminal :wk "quit") | |
| "qQ" '(kill-emacs :wk "quit no save") | |
| "qr" '(restart-emacs :wk "restart") | |
| "h" '(:ignore t :wk "help") | |
| "hf" '(helpful-callable :wk "function") | |
| "hv" '(helpful-variable :wk "variable") | |
| "hk" '(helpful-key :wk "key") | |
| "ho" '(helpful-symbol :wk "symbol") | |
| "hm" '(describe-mode :wk "mode") | |
| "hi" '(info :wk "info")) | |
| (general-nmap | |
| "K" 'eldoc-box-help-at-point | |
| "gd" 'xref-find-definitions | |
| "gD" 'xref-find-definitions-other-window | |
| "gr" 'xref-find-references | |
| "gi" 'eglot-find-implementation | |
| "gy" 'eglot-find-typeDefinition | |
| "gn" 'eglot-rename | |
| "ga" 'eglot-code-actions | |
| "[d" 'flymake-goto-prev-error | |
| "]d" 'flymake-goto-next-error | |
| "gl" 'flymake-show-buffer-diagnostics)) | |
| (use-package avy | |
| :config | |
| (setq avy-all-windows t) | |
| (setq avy-background t) | |
| :general | |
| (:states '(normal visual) | |
| "s" 'avy-goto-char-2 | |
| "S" 'avy-goto-line)) | |
| (use-package eat | |
| :commands (eat eat-project) | |
| :config | |
| (setq eat-kill-buffer-on-exit t) | |
| (add-hook 'eat-mode-hook (lambda () (display-line-numbers-mode 0)))) | |
| (defun my/toggle-terminal () | |
| (interactive) | |
| (if-let ((buf (get-buffer "*eat*"))) | |
| (if-let ((win (get-buffer-window buf))) | |
| (delete-window win) | |
| (display-buffer buf '(display-buffer-at-bottom (window-height . 0.3)))) | |
| (let ((default-directory (or (when-let ((proj (project-current))) (project-root proj)) default-directory))) | |
| (eat) | |
| (display-buffer (current-buffer) '(display-buffer-at-bottom (window-height . 0.3)))))) | |
| (with-eval-after-load 'eat | |
| (evil-define-key 'insert eat-mode-map (kbd "jk") 'evil-normal-state) | |
| (evil-define-key 'emacs eat-mode-map (kbd "jk") 'evil-normal-state) | |
| (evil-set-initial-state 'eat-mode 'insert)) | |
| (use-package magit | |
| :commands magit-status | |
| :config | |
| (setq magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) | |
| (use-package diff-hl | |
| :hook ((prog-mode . diff-hl-mode) | |
| (magit-post-refresh . diff-hl-magit-post-refresh)) | |
| :config | |
| (diff-hl-flydiff-mode)) | |
| (use-package eglot | |
| :ensure nil | |
| :hook ((clojure-mode . eglot-ensure) | |
| (clojurescript-mode . eglot-ensure) | |
| (clojurec-mode . eglot-ensure) | |
| (rust-mode . eglot-ensure) | |
| (rust-ts-mode . eglot-ensure) | |
| (js-mode . eglot-ensure) | |
| (typescript-mode . eglot-ensure) | |
| (typescript-ts-mode . eglot-ensure) | |
| (zig-mode . eglot-ensure)) | |
| :config | |
| (setq eglot-autoshutdown t) | |
| (setq eglot-events-buffer-size 0) | |
| (setq eglot-sync-connect nil) | |
| (add-to-list 'eglot-server-programs | |
| '((clojure-mode clojurescript-mode clojurec-mode) . ("clojure-lsp")))) | |
| (use-package eldoc-box | |
| :config | |
| (setq eldoc-box-max-pixel-width 600) | |
| (setq eldoc-box-max-pixel-height 400)) | |
| (use-package flymake | |
| :ensure nil | |
| :hook (prog-mode . flymake-mode) | |
| :config | |
| (setq flymake-no-changes-timeout 0.5) | |
| (setq flymake-show-diagnostics-at-end-of-line nil)) | |
| (use-package treesit | |
| :ensure nil | |
| :config | |
| (setq treesit-language-source-alist | |
| '((bash "https://github.com/tree-sitter/tree-sitter-bash") | |
| (css "https://github.com/tree-sitter/tree-sitter-css") | |
| (html "https://github.com/tree-sitter/tree-sitter-html") | |
| (javascript "https://github.com/tree-sitter/tree-sitter-javascript") | |
| (json "https://github.com/tree-sitter/tree-sitter-json") | |
| (rust "https://github.com/tree-sitter/tree-sitter-rust") | |
| (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") | |
| (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src"))) | |
| (setq major-mode-remap-alist | |
| '((bash-mode . bash-ts-mode) | |
| (css-mode . css-ts-mode) | |
| (js-mode . js-ts-mode) | |
| (javascript-mode . js-ts-mode) | |
| (json-mode . json-ts-mode) | |
| (typescript-mode . typescript-ts-mode)))) | |
| (use-package clojure-mode | |
| :mode (("\\.clj\\'" . clojure-mode) | |
| ("\\.edn\\'" . clojure-mode) | |
| ("\\.cljs\\'" . clojurescript-mode) | |
| ("\\.cljc\\'" . clojurec-mode)) | |
| :config | |
| (setq clojure-indent-style 'align-arguments) | |
| (setq clojure-align-forms-automatically t)) | |
| (use-package cider | |
| :after clojure-mode | |
| :hook ((clojure-mode . cider-mode) | |
| (clojurescript-mode . cider-mode) | |
| (clojurec-mode . cider-mode)) | |
| :config | |
| (setq cider-repl-display-help-banner nil) | |
| (setq cider-repl-pop-to-buffer-on-connect 'display-only) | |
| (setq cider-show-error-buffer 'only-in-repl) | |
| (setq cider-auto-select-error-buffer nil) | |
| (setq cider-repl-history-file (expand-file-name "cider-history" user-emacs-directory)) | |
| (setq cider-repl-wrap-history t) | |
| (setq cider-save-file-on-load t) | |
| (setq cider-auto-select-test-report-buffer nil) | |
| (setq cider-test-show-report-on-success nil) | |
| (setq cider-font-lock-dynamically '(macro core function var)) | |
| (setq cider-print-fn 'puget) | |
| (setq cider-print-options '(("length" 100) ("right-margin" 80))) | |
| (setq cider-debug-prompt 'overlay) | |
| (setq cider-clojure-cli-aliases ":test:dev:repl")) | |
| (defun my/cider-jack-in-with-aliases () | |
| (interactive) | |
| (let ((cider-clojure-cli-aliases | |
| (read-string "Aliases (e.g. :test:dev:repl): " cider-clojure-cli-aliases))) | |
| (cider-jack-in-clj nil))) | |
| (with-eval-after-load 'clojure-mode | |
| (add-hook 'clojure-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (add-hook 'clojurescript-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (add-hook 'clojurec-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (general-define-key | |
| :states '(normal visual) | |
| :keymaps '(clojure-mode-map clojurescript-mode-map clojurec-mode-map) | |
| :prefix "," | |
| "" '(nil :wk "clojure") | |
| "'" '(cider-jack-in-clj :wk "jack-in") | |
| "c" '(:ignore t :wk "connect") | |
| "cc" '(cider-connect-clj :wk "connect") | |
| "cs" '(cider-connect-cljs :wk "connect cljs") | |
| "cj" '(cider-jack-in-clj :wk "jack-in") | |
| "cJ" '(my/cider-jack-in-with-aliases :wk "jack-in (prompt)") | |
| "cq" '(cider-quit :wk "quit") | |
| "cr" '(cider-restart :wk "restart") | |
| "e" '(:ignore t :wk "eval") | |
| "eb" '(cider-eval-buffer :wk "buffer") | |
| "ed" '(cider-eval-defun-at-point :wk "defun") | |
| "eD" '(cider-eval-defun-to-comment :wk "defun to comment") | |
| "ee" '(cider-eval-sexp-at-point :wk "sexp at point") | |
| "eE" '(cider-eval-last-sexp-to-repl :wk "last sexp to repl") | |
| "ef" '(cider-eval-defun-at-point :wk "defun") | |
| "ei" '(cider-interrupt :wk "interrupt") | |
| "el" '(cider-eval-last-sexp :wk "last sexp") | |
| "em" '(cider-macroexpand-1 :wk "macroexpand-1") | |
| "eM" '(cider-macroexpand-all :wk "macroexpand-all") | |
| "en" '(cider-eval-ns-form :wk "ns form") | |
| "ep" '(cider-pprint-eval-last-sexp :wk "pprint last sexp") | |
| "eP" '(cider-pprint-eval-defun-at-point :wk "pprint defun") | |
| "er" '(cider-eval-region :wk "region") | |
| "es" '(cider-eval-sexp-at-point :wk "sexp at point") | |
| "eu" '(cider-eval-sexp-up-to-point :wk "sexp up to point") | |
| "ew" '(cider-eval-sexp-at-point :wk "word/sexp at point") | |
| "e;" '(cider-eval-print-last-sexp :wk "eval print last sexp") | |
| "f" '(cider-format-buffer :wk "format buffer") | |
| "F" '(cider-format-defun :wk "format defun") | |
| "d" '(:ignore t :wk "debug") | |
| "db" '(cider-debug-defun-at-point :wk "debug defun") | |
| "de" '(cider-enlighten-mode :wk "enlighten mode") | |
| "di" '(cider-inspect-last-result :wk "inspect last") | |
| "dI" '(cider-inspect :wk "inspect") | |
| "dr" '(cider-inspect-last-result :wk "inspect result") | |
| "dt" '(cider-toggle-trace-var :wk "trace var") | |
| "dT" '(cider-toggle-trace-ns :wk "trace ns") | |
| "dv" '(cider-inspect-defun-at-point :wk "inspect defun") | |
| "t" '(:ignore t :wk "test") | |
| "ta" '(cider-test-run-loaded-tests :wk "all loaded") | |
| "tc" '(cider-test-run-test :wk "at cursor") | |
| "tf" '(cider-test-rerun-failed-tests :wk "rerun failed") | |
| "tl" '(cider-test-run-loaded-tests :wk "loaded tests") | |
| "tn" '(cider-test-run-ns-tests :wk "ns tests") | |
| "tN" '(cider-test-run-ns-tests-with-filters :wk "ns *-test") | |
| "tp" '(cider-test-run-project-tests :wk "project") | |
| "tr" '(cider-test-rerun-tests :wk "rerun") | |
| "ts" '(cider-test-show-report :wk "show report") | |
| "r" '(:ignore t :wk "repl") | |
| "rb" '(cider-load-buffer :wk "load buffer") | |
| "rc" '(cider-repl-clear-buffer :wk "clear") | |
| "rn" '(cider-repl-set-ns :wk "set ns") | |
| "rq" '(cider-quit :wk "quit") | |
| "rr" '(cider-switch-to-repl-buffer :wk "switch to repl") | |
| "rR" '(cider-ns-refresh :wk "refresh") | |
| "rx" '(cider-refresh :wk "refresh all") | |
| "h" '(:ignore t :wk "help") | |
| "ha" '(cider-apropos :wk "apropos") | |
| "hA" '(cider-apropos-documentation :wk "apropos doc") | |
| "hc" '(cider-clojuredocs :wk "clojuredocs") | |
| "hd" '(cider-doc :wk "doc") | |
| "hj" '(cider-javadoc :wk "javadoc") | |
| "hn" '(cider-find-ns :wk "find ns") | |
| "hs" '(cider-browse-spec :wk "browse spec") | |
| "n" '(:ignore t :wk "navigate") | |
| "nb" '(cider-pop-back :wk "pop back") | |
| "nn" '(cider-browse-ns :wk "browse ns") | |
| "nN" '(cider-browse-ns-all :wk "all ns") | |
| "ns" '(cider-browse-spec :wk "browse spec") | |
| "nS" '(cider-browse-spec-all :wk "all specs"))) | |
| (use-package parinfer-rust-mode | |
| :hook ((clojure-mode clojurescript-mode clojurec-mode emacs-lisp-mode lisp-mode scheme-mode) . parinfer-rust-mode) | |
| :init | |
| (setq parinfer-rust-auto-download t) | |
| (setq parinfer-rust-troublesome-modes nil)) | |
| ; (use-package paredit | |
| ; :hook ((clojure-mode . paredit-mode) | |
| ; (clojurescript-mode . paredit-mode) | |
| ; (clojurec-mode . paredit-mode) | |
| ; (emacs-lisp-mode . paredit-mode) | |
| ; (lisp-mode . paredit-mode) | |
| ; (scheme-mode . paredit-mode) | |
| ; (cider-repl-mode . paredit-mode))) | |
| (add-hook 'emacs-lisp-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (add-hook 'lisp-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (add-hook 'scheme-mode-hook (lambda () (electric-pair-local-mode -1))) | |
| (defun my/setup-elisp-keys () | |
| (general-define-key | |
| :states '(normal visual) | |
| :keymaps 'local | |
| :prefix "," | |
| "" '(nil :wk "elisp") | |
| "e" '(:ignore t :wk "eval") | |
| "eb" '(eval-buffer :wk "buffer") | |
| "ed" '(eval-defun :wk "defun") | |
| "ee" '(eval-last-sexp :wk "last sexp") | |
| "er" '(eval-region :wk "region") | |
| "h" '(:ignore t :wk "help") | |
| "hf" '(helpful-callable :wk "function") | |
| "hv" '(helpful-variable :wk "variable"))) | |
| (add-hook 'emacs-lisp-mode-hook #'my/setup-elisp-keys) | |
| (use-package org | |
| :ensure nil | |
| :mode ("\\.org\\'" . org-mode) | |
| :config | |
| (setq org-directory "~/org") | |
| (setq org-default-notes-file (concat org-directory "/notes.org")) | |
| (setq org-agenda-files (list org-directory)) | |
| (setq org-startup-indented t) | |
| (setq org-startup-folded 'content) | |
| (setq org-hide-leading-stars t) | |
| (setq org-hide-emphasis-markers t) | |
| (setq org-pretty-entities t) | |
| (setq org-ellipsis " ▾") | |
| (setq org-return-follows-link t) | |
| (setq org-mouse-1-follows-link t) | |
| (setq org-todo-keywords | |
| '((sequence "TODO(t)" "IN-PROGRESS(i)" "WAITING(w)" "|" "DONE(d)" "CANCELLED(c)"))) | |
| (setq org-capture-templates | |
| '(("t" "Todo" entry (file+headline "~/org/todos.org" "Inbox") | |
| "* TODO %?\n%U\n") | |
| ("n" "Note" entry (file+headline "~/org/notes.org" "Notes") | |
| "* %?\n%U\n") | |
| ("j" "Journal" entry (file+datetree "~/org/journal.org") | |
| "* %?\nEntered on %U\n"))) | |
| (setq org-log-done 'time) | |
| (setq org-log-into-drawer t) | |
| (setq org-src-fontify-natively t) | |
| (setq org-src-tab-acts-natively t) | |
| (setq org-edit-src-content-indentation 0) | |
| (setq org-confirm-babel-evaluate nil) | |
| (org-babel-do-load-languages | |
| 'org-babel-load-languages | |
| '((emacs-lisp . t) | |
| (shell . t) | |
| (clojure . t)))) | |
| (use-package org-modern | |
| :hook (org-mode . org-modern-mode) | |
| :config | |
| (setq org-modern-star '("◉" "○" "●" "○" "●" "○" "●")) | |
| (setq org-modern-table nil)) | |
| (defun my/setup-org-keys () | |
| (general-define-key | |
| :states '(normal visual) | |
| :keymaps 'local | |
| :prefix "," | |
| "" '(nil :wk "org") | |
| "'" '(org-edit-special :wk "edit src block") | |
| "RET" '(org-open-at-point :wk "open link") | |
| "a" '(org-archive-subtree :wk "archive") | |
| "b" '(:ignore t :wk "babel") | |
| "be" '(org-babel-execute-src-block :wk "execute block") | |
| "bE" '(org-babel-execute-buffer :wk "execute buffer") | |
| "bt" '(org-babel-tangle :wk "tangle") | |
| "c" '(:ignore t :wk "clock") | |
| "ci" '(org-clock-in :wk "clock in") | |
| "co" '(org-clock-out :wk "clock out") | |
| "cc" '(org-clock-cancel :wk "cancel") | |
| "cg" '(org-clock-goto :wk "goto") | |
| "d" '(:ignore t :wk "date") | |
| "dd" '(org-deadline :wk "deadline") | |
| "ds" '(org-schedule :wk "schedule") | |
| "dt" '(org-time-stamp :wk "timestamp") | |
| "e" '(org-export-dispatch :wk "export") | |
| "h" '(:ignore t :wk "heading") | |
| "hi" '(org-insert-heading-after-current :wk "insert after") | |
| "hI" '(org-insert-heading :wk "insert") | |
| "hs" '(org-insert-subheading :wk "subheading") | |
| "i" '(:ignore t :wk "insert") | |
| "il" '(org-insert-link :wk "link") | |
| "it" '(org-insert-todo-heading :wk "todo") | |
| "ip" '(org-set-property :wk "property") | |
| "l" '(:ignore t :wk "link") | |
| "ll" '(org-insert-link :wk "insert") | |
| "ls" '(org-store-link :wk "store") | |
| "lp" '(org-cliplink :wk "paste from clipboard") | |
| "n" '(org-narrow-to-subtree :wk "narrow") | |
| "N" '(widen :wk "widen") | |
| "p" '(org-priority :wk "priority") | |
| "s" '(:ignore t :wk "subtree") | |
| "sr" '(org-refile :wk "refile") | |
| "sn" '(org-narrow-to-subtree :wk "narrow") | |
| "ss" '(org-sort :wk "sort") | |
| "t" '(org-todo :wk "cycle todo") | |
| "T" '(org-set-tags-command :wk "set tags") | |
| "x" '(org-toggle-checkbox :wk "toggle checkbox"))) | |
| (add-hook 'org-mode-hook #'my/setup-org-keys) | |
| (use-package org-cliplink | |
| :commands org-cliplink) | |
| (use-package rainbow-delimiters | |
| :hook (prog-mode . rainbow-delimiters-mode)) | |
| (use-package rust-mode | |
| :mode "\\.rs\\'") | |
| (defun my/setup-rust-keys () | |
| (general-define-key | |
| :states '(normal visual) | |
| :keymaps 'local | |
| :prefix "," | |
| "" '(nil :wk "rust") | |
| "b" '((lambda () (interactive) (compile "cargo build")) :wk "build") | |
| "c" '((lambda () (interactive) (compile "cargo check")) :wk "check") | |
| "r" '((lambda () (interactive) (compile "cargo run")) :wk "run") | |
| "R" '((lambda () (interactive) (compile "cargo run --release")) :wk "run release") | |
| "t" '((lambda () (interactive) (compile "cargo test")) :wk "test") | |
| "C" '((lambda () (interactive) (compile "cargo clippy")) :wk "clippy") | |
| "f" '(rust-format-buffer :wk "format") | |
| "h" '(eglot-inlay-hints-mode :wk "toggle inlay hints"))) | |
| (add-hook 'rust-mode-hook #'my/setup-rust-keys) | |
| (add-hook 'rust-ts-mode-hook #'my/setup-rust-keys) | |
| (setq rust-format-on-save t) | |
| (use-package zig-mode | |
| :mode "\\.zig\\'" | |
| :config | |
| (setq zig-format-on-save t)) | |
| (defun my/setup-zig-keys () | |
| (general-define-key | |
| :states '(normal visual) | |
| :keymaps 'local | |
| :prefix "," | |
| "" '(nil :wk "zig") | |
| "b" '((lambda () (interactive) (compile "zig build")) :wk "build") | |
| "r" '((lambda () (interactive) (compile "zig build run")) :wk "run") | |
| "t" '((lambda () (interactive) (compile "zig build test")) :wk "test") | |
| "h" '(eglot-inlay-hints-mode :wk "toggle inlay hints"))) | |
| (add-hook 'zig-mode-hook #'my/setup-zig-keys) | |
| (use-package web-mode | |
| :mode (("\\.html\\'" . web-mode) | |
| ("\\.css\\'" . web-mode) | |
| ("\\.tsx\\'" . web-mode) | |
| ("\\.jsx\\'" . web-mode)) | |
| :config | |
| (setq web-mode-markup-indent-offset 2) | |
| (setq web-mode-css-indent-offset 2) | |
| (setq web-mode-code-indent-offset 2)) | |
| (use-package emmet-mode | |
| :hook ((web-mode . emmet-mode) | |
| (css-mode . emmet-mode))) | |
| (use-package helpful | |
| :commands (helpful-callable helpful-variable helpful-key helpful-symbol)) | |
| (use-package writeroom-mode | |
| :commands writeroom-mode | |
| :config | |
| (setq writeroom-width 100) | |
| (setq writeroom-mode-line t)) | |
| (use-package restart-emacs | |
| :commands restart-emacs) | |
| (use-package dired | |
| :ensure nil | |
| :commands dired | |
| :config | |
| (setq dired-listing-switches "-alh --group-directories-first") | |
| (setq dired-dwim-target t) | |
| (setq dired-kill-when-opening-new-dired-buffer t)) | |
| (setq-default bidi-display-reordering nil) | |
| (setq-default bidi-paragraph-direction 'left-to-right) | |
| (setq bidi-inhibit-bpa t) | |
| (setq inhibit-compacting-font-caches t) | |
| (setq read-process-output-max (* 1024 1024)) | |
| (require 'server) | |
| (unless (server-running-p) (server-start)) | |
| (provide 'init) | |
| ;;; init.el ends here |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ---@diagnostic disable: undefined-global | |
| local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" | |
| if not vim.uv.fs_stat(lazypath) then | |
| vim.fn.system({ | |
| "git", | |
| "clone", | |
| "--filter=blob:none", | |
| "https://github.com/folke/lazy.nvim.git", | |
| "--branch=stable", | |
| lazypath, | |
| }) | |
| end | |
| vim.opt.rtp:prepend(lazypath) | |
| vim.g.mapleader = " " | |
| vim.g.maplocalleader = "," | |
| local plugins = { | |
| { "neovim/nvim-lspconfig", tag = "v2.5.0" }, | |
| { | |
| "nvim-tree/nvim-web-devicons", | |
| lazy = false, | |
| priority = 1000, | |
| opts = {}, | |
| }, | |
| { | |
| "folke/which-key.nvim", | |
| event = "VeryLazy", | |
| opts = {}, | |
| }, | |
| { | |
| "nvim-telescope/telescope.nvim", | |
| dependencies = { "nvim-lua/plenary.nvim" }, | |
| opts = { | |
| defaults = { | |
| sorting_strategy = "ascending", | |
| layout_config = { | |
| horizontal = { | |
| prompt_position = "top" | |
| }, | |
| }, | |
| }, | |
| }, | |
| }, | |
| { | |
| "folke/flash.nvim", | |
| event = "VeryLazy", | |
| opts = {}, | |
| keys = { | |
| { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" }, | |
| { "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" }, | |
| { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" }, | |
| { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" }, | |
| { "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, | |
| }, | |
| }, | |
| { | |
| "akinsho/toggleterm.nvim", | |
| version = "*", | |
| config = function() | |
| require("toggleterm").setup { | |
| open_mapping = [[<leader>t]], | |
| direction = "float", | |
| -- on_open = function() vim.cmd('startinsert!') end, | |
| insert_mappings = false, | |
| start_in_insert = false, | |
| terminal_mappings = false, | |
| } | |
| end | |
| }, | |
| -- { | |
| -- "kdheepak/lazygit.nvim", | |
| -- lazy = true, | |
| -- cmd = { | |
| -- "LazyGit", | |
| -- "LazyGitConfig", | |
| -- "LazyGitCurrentFile", | |
| -- "LazyGitFilter", | |
| -- "LazyGitFilterCurrentFile", | |
| -- }, | |
| -- dependencies = { | |
| -- "nvim-lua/plenary.nvim", | |
| -- }, | |
| -- keys = { | |
| -- { "<leader>lg", "<cmd>LazyGit<cr>", desc = "LazyGit" } | |
| -- } | |
| -- }, | |
| { | |
| "NeogitOrg/neogit", | |
| dependencies = { | |
| "nvim-lua/plenary.nvim", -- required | |
| "sindrets/diffview.nvim", -- optional - Diff integration | |
| -- Only one of these is needed. | |
| "nvim-telescope/telescope.nvim", -- optional | |
| "ibhagwan/fzf-lua", -- optional | |
| "echasnovski/mini.pick", -- optional | |
| }, | |
| config = true | |
| }, | |
| { | |
| "NMAC427/guess-indent.nvim", | |
| config = function() | |
| require("guess-indent").setup {} | |
| end, | |
| }, | |
| { "junegunn/fzf", build = "./install --all" }, | |
| "junegunn/fzf.vim", | |
| "junegunn/goyo.vim", | |
| { | |
| "HiPhish/rainbow-delimiters.nvim", | |
| enabled = true, | |
| submodules = false, | |
| }, | |
| { | |
| "j-hui/fidget.nvim", | |
| opts = {}, | |
| }, | |
| "mbbill/undotree", | |
| "preservim/nerdtree", | |
| "tpope/vim-commentary", | |
| "tpope/vim-fugitive", | |
| "tpope/vim-repeat", | |
| "tpope/vim-surround", | |
| { | |
| "hrsh7th/nvim-cmp", | |
| dependencies = { | |
| "hrsh7th/cmp-nvim-lsp", | |
| "hrsh7th/cmp-buffer", | |
| "hrsh7th/cmp-path", | |
| "L3MON4D3/LuaSnip", | |
| "saadparwaiz1/cmp_luasnip", | |
| "onsails/lspkind-nvim", | |
| }, | |
| }, | |
| { | |
| "nvim-treesitter/nvim-treesitter", | |
| build = ":TSUpdate", | |
| config = function() | |
| require("nvim-treesitter.configs").setup({ | |
| ensure_installed = { | |
| "lua", "vim", "vimdoc", "javascript", "typescript", | |
| "rust", "java", "clojure", "css", "html", "csv", "regex" | |
| }, | |
| auto_install = true, | |
| highlight = { enable = true }, | |
| indent = { enable = true }, | |
| }) | |
| end, | |
| }, | |
| { | |
| "windwp/nvim-autopairs", | |
| event = "InsertEnter", | |
| config = function() | |
| local npairs = require("nvim-autopairs") | |
| npairs.setup({}) | |
| npairs.get_rules("'")[1].not_filetypes = { "clojure" } | |
| end, | |
| }, | |
| { "clojure-vim/clojure.vim", ft = "clojure" }, | |
| { "Olical/conjure", | |
| branch = "develop", | |
| ft = { "clojure", "scheme" }, | |
| config = function() | |
| vim.g["conjure#client#clojure#nrepl#eval#print_function"] = "cider.nrepl.pprint/pprint" | |
| vim.g["conjure#client#clojure#nrepl#eval#print_options"] = { | |
| length = 500, | |
| level = 50, | |
| ["right-margin"] = 80 | |
| } | |
| vim.g["conjure#log#wrap"] = true | |
| vim.g["conjure#log#fold#enabled"] = true | |
| end | |
| }, | |
| { | |
| "eraserhd/parinfer-rust", | |
| build = "cargo build --release", | |
| config = function() | |
| vim.g.parinfer_rust_path = vim.fn.stdpath("data") | |
| .. "/lazy/parinfer-rust/target/release/libparinfer_rust.so" | |
| end | |
| }, | |
| "guns/vim-sexp", | |
| "tpope/vim-sexp-mappings-for-regular-people", | |
| { "chrisbra/csv.vim" }, | |
| { "mattn/webapi-vim", ft = "rust" }, | |
| { "rust-lang/rust.vim", ft = "rust" }, | |
| { | |
| 'mrcjkb/rustaceanvim', | |
| version = '^6', -- Recommended | |
| lazy = false, -- This plugin is already lazy | |
| }, | |
| "mattn/emmet-vim", | |
| "maxmellon/vim-jsx-pretty", | |
| "prisma/vim-prisma", | |
| -- { | |
| -- "luckasRanarison/tailwind-tools.nvim", | |
| -- name = "tailwind-tools", | |
| -- build = ":UpdateRemotePlugins", | |
| -- dependencies = { | |
| -- "nvim-treesitter/nvim-treesitter", | |
| -- "nvim-telescope/telescope.nvim", | |
| -- "neovim/nvim-lspconfig", | |
| -- }, | |
| -- opts = { | |
| -- server = { | |
| -- override = true, | |
| -- settings = { | |
| -- emmetCompletions = true, | |
| -- includeLanguages = { clojurescript = "html", rust = "html" }, | |
| -- experimental = { | |
| -- classRegex = { | |
| -- { "\\[:[^.\\s]*((?:\\.[^.\\s\\]]*)+)[\\s\\]]", "\\.([^.]*)" }, | |
| -- { "\\:(\\.[^\\s#]+(?:\\.[^\\s#]+)*)", "\\.([^\\.\\s#]+)" }, | |
| -- { "\\:class\\s+(\\:[^\\s\\}]*)[\\s\\}]", "[\\:.]([^.]*)" }, | |
| -- { "\\:class\\s+(\"[^\\}\"]*)\"", "[\"\\s]([^\\s\"]*)" }, | |
| -- { "\\:class\\s+\\[([\\s\\S]*)\\]", "[\"\\:]([^\\s\"]*)[\"]?" }, | |
| -- { "\\:class\\s+'\\[([\\s\\S]*)\\]", "([^\\s]*)?" }, | |
| -- { "class\\s*:\\s*\"([^\"]*)" }, | |
| -- }, | |
| -- }, | |
| -- }, | |
| -- }, | |
| -- }, | |
| -- }, | |
| "arcticicestudio/nord-vim", | |
| "ayu-theme/ayu-vim", | |
| "chriskempson/vim-tomorrow-theme", | |
| "folke/tokyonight.nvim", | |
| "gruvbox-community/gruvbox", | |
| { "https://gitlab.com/yorickpeterse/vim-paper.git" }, | |
| "iagorrr/noctishc.nvim", | |
| "iCyMind/NeoSolarized", | |
| "ishan9299/modus-theme-vim", | |
| "marko-cerovac/material.nvim", | |
| "Mofiqul/dracula.nvim", | |
| "nanotech/jellybeans.vim", | |
| "NLKNguyen/papercolor-theme", | |
| "plan9-for-vimspace/acme-colors", | |
| "projekt0n/github-nvim-theme", | |
| "rakr/vim-one", | |
| "yassinebridi/vim-purpura", | |
| } | |
| require("lazy").setup(plugins) | |
| local opt = vim.opt | |
| opt.backupcopy = "yes" | |
| opt.clipboard = { "unnamedplus" } | |
| opt.cmdheight = 2 | |
| opt.completeopt = "menuone" | |
| opt.cursorline = true | |
| opt.expandtab = true | |
| opt.hidden = true | |
| opt.ignorecase = true | |
| opt.inccommand = "nosplit" | |
| opt.laststatus = 3 | |
| opt.mat = 2 | |
| opt.mouse = "" | |
| opt.number = true | |
| opt.shiftwidth = 2 | |
| opt.shortmess:append("c") | |
| opt.showmatch = true | |
| opt.signcolumn = "yes" | |
| opt.smartcase = true | |
| opt.smartindent = true | |
| opt.softtabstop = 2 | |
| opt.splitbelow = true | |
| opt.splitright = true | |
| opt.swapfile = false | |
| opt.tabstop = 2 | |
| opt.undodir = vim.fn.expand("~/.vim/undo-dir") | |
| opt.undofile = true | |
| opt.wildoptions = "pum" | |
| vim.cmd('filetype plugin on') | |
| vim.g.open_in_insert_mode = 0 | |
| vim.g.python3_host_prog = "/usr/bin/python3" | |
| local function map(mode, lhs, rhs, opts) | |
| local options = { noremap = true, silent = true } | |
| if opts then options = vim.tbl_extend('force', options, opts) end | |
| vim.keymap.set(mode, lhs, rhs, options) | |
| end | |
| map('i', 'jk', '<ESC>') | |
| map('t', 'jk', [[<C-\><C-n>]]) | |
| map('t', '<C-[>', [[<C-\><C-n>]]) | |
| map('n', '<leader>g', 'gg"+yG') | |
| map('n', '<leader><CR>', ':noh<CR>') | |
| map('n', '<C-g>', ':Goyo<CR>') | |
| map('n', '<leader><tab>', '<C-^>') | |
| map('n', '<leader><leader>', 'o<Esc>k') | |
| map('n', '<leader>b', ':Buffers<CR>') | |
| map('n', '<leader>cd', ':set background=dark<CR>') | |
| map('n', '<leader>cl', ':set background=light<CR>') | |
| map('n', '<leader>cs', ':colorscheme<Space>') | |
| map('n', '<leader>a', ':NERDTreeToggle<CR>') | |
| map('n', '<leader>f', ':Files<CR>') | |
| map('n', '<leader>o', ':only<CR>') | |
| map('n', '<leader>q', ':x<CR>') | |
| map('n', '<leader>s', ':split<CR>:res -8<CR><leader>t') | |
| map('n', '<leader>v', ':e $MYVIMRC<CR>') | |
| map('n', '<leader>w', ':w<CR>') | |
| map('n', '<leader>y', ':set nonumber<CR>:set signcolumn=no<CR>') | |
| vim.keymap.set('n', 'zT', function() | |
| local wh = vim.api.nvim_win_get_height(0) | |
| local offset = math.floor(wh / 4) | |
| return offset .. 'kzt' .. offset .. 'j' | |
| end, { expr = true, silent = true }) | |
| map({ 'n', 'v' }, 'c', '"_c') | |
| map({ 'n', 'v' }, 'C', '"_C') | |
| local capabilities = require("cmp_nvim_lsp").default_capabilities() | |
| local lspconfig = require("lspconfig") | |
| local util = require("lspconfig.util") | |
| local servers = { | |
| "clojure_lsp", "cssls", "html", "ts_ls", | |
| "jdtls", "lua_ls", "zls", "clangd", "ols" | |
| } | |
| for _, lsp in ipairs(servers) do | |
| local opts = { capabilities = capabilities } | |
| if lsp == "clojure_lsp" then | |
| opts.root_dir = util.root_pattern(".git") | |
| opts.settings = { | |
| ["clojure-lsp"] = { | |
| format = { enabled = true }, | |
| ["cljfmt-config-path"] = ".cljfmt.edn" | |
| } | |
| } | |
| elseif lsp == "ols" then | |
| opts.settings = { | |
| ols = { | |
| format = { | |
| enable = true, | |
| indentationStyle = "tab", | |
| indentWidth = 4 | |
| } | |
| } | |
| } | |
| elseif lsp == "zls" then | |
| opts.settings = { | |
| zls = { | |
| semantic_tokens = "partial", | |
| enable_build_on_save = true, | |
| } | |
| } | |
| end | |
| lspconfig[lsp].setup(opts) | |
| end | |
| vim.api.nvim_create_autocmd("LspAttach", { | |
| callback = function(args) | |
| local bufnr = args.buf | |
| vim.lsp.inlay_hint.enable(false, { bufnr = bufnr }) | |
| end, | |
| }) | |
| vim.api.nvim_create_autocmd('BufWritePre', { | |
| pattern = { "*.ts", "*.tsx", "*.js", "*.jsx" }, | |
| callback = function() | |
| vim.lsp.buf.format({ async = false }) | |
| end, | |
| }) | |
| vim.api.nvim_create_autocmd('BufWritePre', { | |
| pattern = {"*.zig", "*.zon"}, | |
| callback = function() | |
| vim.lsp.buf.format({ async = false}) | |
| end | |
| }) | |
| vim.keymap.set("n", "<localleader>h", function() | |
| local bufnr = vim.api.nvim_get_current_buf() | |
| vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = bufnr }), { bufnr = bufnr }) | |
| end, { desc = "Toggle LSP inlay hints" }) | |
| vim.diagnostic.config({ | |
| virtual_text = false, | |
| signs = true, | |
| underline = true, | |
| severity_sort = true, | |
| }) | |
| vim.keymap.set("n", "<leader>e", function() | |
| vim.diagnostic.open_float(nil, { scope = "line" }) | |
| end, { silent = true }) | |
| local cmp = require("cmp") | |
| local luasnip = require("luasnip") | |
| local check_backspace = function() | |
| local col = vim.fn.col('.') - 1 | |
| return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') | |
| end | |
| vim.g.goyo_active = false | |
| cmp.setup({ | |
| enabled = function() return not vim.g.goyo_active end, | |
| formatting = { | |
| format = require("lspkind").cmp_format({ | |
| -- before = require("tailwind-tools.cmp").lspkind_format | |
| }), | |
| }, | |
| snippet = { | |
| expand = function(args) luasnip.lsp_expand(args.body) end, | |
| }, | |
| mapping = { | |
| ["<Tab>"] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.select_next_item() | |
| elseif check_backspace() then | |
| fallback() | |
| else | |
| cmp.complete() | |
| end | |
| end, { "i", "s" }), | |
| ["<S-Tab>"] = cmp.mapping(function(fallback) | |
| if cmp.visible() then cmp.select_prev_item() else fallback() end | |
| end, { "i", "s" }), | |
| ["<CR>"] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.confirm({ select = true, behavior = cmp.ConfirmBehavior.Replace }) | |
| else | |
| fallback() | |
| end | |
| end, { "i", "s" }), | |
| ["<C-u>"] = cmp.mapping.scroll_docs(4), | |
| ["<C-d>"] = cmp.mapping.scroll_docs(-4), | |
| ["<C-n>"] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.select_next_item() | |
| else | |
| fallback() | |
| end | |
| end, { "i", "s" }), | |
| ["<C-p>"] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.select_prev_item() | |
| else | |
| fallback() | |
| end | |
| end, { "i", "s" }), | |
| }, | |
| sources = { | |
| { name = "buffer" }, | |
| { name = "conjure" }, | |
| { name = "luasnip" }, | |
| { name = "nvim_lsp" }, | |
| { name = "path" }, | |
| }, | |
| }) | |
| vim.api.nvim_create_autocmd("User", { | |
| pattern = "GoyoEnter", | |
| callback = function() | |
| vim.g.goyo_active = true | |
| pcall(function() require("cmp").abort() end) | |
| vim.opt_local.wrap = true | |
| vim.opt_local.linebreak = true | |
| end, | |
| }) | |
| vim.api.nvim_create_autocmd("User", { | |
| pattern = "GoyoLeave", | |
| callback = function() | |
| vim.g.goyo_active = false | |
| vim.opt_local.linebreak = false | |
| vim.opt_local.wrap = false | |
| end, | |
| }) | |
| vim.keymap.set('n', 'K', vim.lsp.buf.hover, { noremap = true, silent = true }) | |
| vim.keymap.set('n', '<leader>k', vim.lsp.buf.hover, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gy', vim.lsp.buf.type_definition, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gr', vim.lsp.buf.references, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gn', vim.lsp.buf.rename, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'ga', vim.lsp.buf.code_action, { noremap = true, silent = true }) | |
| vim.keymap.set('n', '[g', vim.diagnostic.goto_prev, { noremap = true, silent = true }) | |
| vim.keymap.set('n', ']g', vim.diagnostic.goto_next, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gl', vim.diagnostic.open_float, { noremap = true, silent = true }) | |
| vim.keymap.set('n', 'gD', vim.diagnostic.setloclist, { noremap = true, silent = true }) | |
| vim.keymap.set('n', '<leader>p', '<cmd>Telescope commands<CR>', { noremap = true, silent = true }) | |
| vim.g['conjure#log#hud#width'] = 1 | |
| vim.g['conjure#client#clojure#nrepl#connection#auto_repl#enabled'] = false | |
| vim.g['conjure#eval#comment_prefix'] = ';; ' | |
| vim.g.NERDTreeWinSize = 40 | |
| vim.g.rustfmt_autosave = 1 | |
| vim.g.zig_fmt_autosave = 1 | |
| vim.api.nvim_create_autocmd('FileType', { | |
| pattern = '*', | |
| callback = function() | |
| vim.opt_local.formatoptions:remove { 'r', 'o' } | |
| end | |
| }) | |
| vim.api.nvim_create_autocmd('FileType', { | |
| pattern = '*', | |
| callback = function() | |
| vim.opt_local.modifiable = true | |
| end | |
| }) | |
| local scratch_dir = vim.fn.expand('~/.nvim/scratch') | |
| vim.fn.mkdir(scratch_dir, 'p') | |
| vim.api.nvim_create_user_command('Scratch', function() | |
| local filename = scratch_dir .. '/scratch-' .. os.time() | |
| vim.cmd('new ' .. filename) | |
| vim.bo.buftype = 'nofile' | |
| vim.bo.bufhidden = 'hide' | |
| vim.bo.swapfile = false | |
| vim.wo.number = true | |
| end, {}) | |
| local function term_exec(cmd) | |
| require('toggleterm').exec(cmd) | |
| end | |
| local ft_settings = { | |
| c = { | |
| settings = function() | |
| vim.opt_local.shiftwidth = 4 | |
| vim.opt_local.tabstop = 4 | |
| vim.opt_local.softtabstop= 4 | |
| end, | |
| mappings = { | |
| { 'n', '<localleader>c', ':!cc ' }, | |
| { 'n', '<localleader>l', ':!cc -Wall -Wextra ' }, | |
| { 'n', '<localleader>r', function() | |
| local file = vim.fn.expand('%') | |
| local output = 'a.out' | |
| local cmd = string.format('zig cc %s -Wall -Wextra -o %s && ./%s', file, output, output) | |
| term_exec(cmd) | |
| end | |
| } | |
| } | |
| }, | |
| clojure = { | |
| settings = function() | |
| vim.cmd('stopinsert') | |
| vim.opt_local.shiftwidth = 2 | |
| vim.opt_local.tabstop = 2 | |
| vim.opt_local.commentstring = ';; %s' | |
| end, | |
| mappings = { | |
| { 'n', '<localleader>cc', ':ConjureConnect<Space>' }, | |
| { 'n', '<localleader>cs', ':ConjureShadowSelect<Space>' }, | |
| { 'n', '<localleader>f', function() vim.lsp.buf.format({ async = false }) end }, -- Format buffer with cljfmt | |
| { 'v', '<localleader>f', function() vim.lsp.buf.format({ async = false }) end }, -- Format selection | |
| { 'n', '<localleader>hd', ':let g:conjure#log#hud#enabled = v:false<CR>' }, | |
| { 'n', '<localleader>he', ':let g:conjure#log#hud#enabled = v:true<CR>' }, | |
| { 'n', '<localleader>jT', '<Cmd>TapForm<CR>' }, | |
| { 'n', '<localleader>jt', '<Cmd>TapWord<CR>' }, | |
| { 'v', '<localleader>jt', ':TapV<CR>' }, | |
| { 'n', '<localleader>jte', '<Cmd>TapExc<CR>' } | |
| } | |
| }, | |
| go = { | |
| mappings = { | |
| { 'n', '<localleader>b', ':!go build<CR>' }, | |
| { 'n', '<localleader>r', ':!go run .<CR>' } | |
| } | |
| }, | |
| java = { | |
| mappings = { | |
| { 'n', '<localleader>r', ':!java src/Main.java<CR>' }, | |
| { 'n', '<localleader>,', ':!java ' } | |
| } | |
| }, | |
| odin = { | |
| settings = function() | |
| vim.opt_local.shiftwidth = 4 | |
| vim.opt_local.tabstop = 4 | |
| end, | |
| mappings = { | |
| { 'n', '<localleader>b', function() term_exec('odin build .') end }, | |
| { 'n', '<localleader>r', function() term_exec('odin run .') end }, | |
| { 'n', '<localleader>t', function() term_exec('odin test .') end }, | |
| } | |
| }, | |
| rust = { | |
| mappings = { | |
| { 'n', '<localleader>a', function() vim.ui.input({prompt='Package: '}, function(input) | |
| if input then term_exec('cargo add ' .. input) end | |
| end) | |
| end }, | |
| { 'n', '<localleader>b', function() term_exec('cargo build') end }, | |
| { 'n', '<localleader>c', function() term_exec('cargo check') end }, | |
| { 'n', '<localleader>C', function() term_exec('cargo clippy --all-targets --all-features -- -D warnings -W clippy::pedantic -W clippy::nursery') end }, | |
| { 'n', '<localleader>p', 'o<CR>println!("{:?}", );<Esc>hi' }, | |
| { 'n', '<localleader>r', function() term_exec('cargo run') end }, | |
| { 'n', '<localleader>R', function() term_exec('cargo run --release') end }, | |
| { 'n', '<localleader>t', function() term_exec('cargo test') end }, | |
| { 'n', '<localleader>,', ':Rust' }, | |
| } | |
| }, | |
| zig = { | |
| settings = function() | |
| vim.opt_local.shiftwidth = 4 | |
| vim.opt_local.tabstop = 4 | |
| end, | |
| mappings = { | |
| { 'n', '<localleader>b', function() term_exec('zig build') end }, | |
| { 'n', '<localleader>r', function() term_exec('zig build run ') end }, | |
| { 'n', '<localleader>R', function() | |
| vim.ui.input({prompt='Args: '}, function(input) | |
| if input then term_exec('zig run ' .. vim.fn.expand('%') .. ' -- ' .. input) end | |
| end) | |
| end }, | |
| { 'n', '<localleader>t', function() term_exec('zig build test') end }, | |
| { 'n', '<localleader>z', function() | |
| vim.ui.input({prompt='Zig command: '}, function(input) | |
| if input then term_exec('zig ' .. input) end | |
| end) | |
| end } | |
| } | |
| } | |
| } | |
| for ft, config in pairs(ft_settings) do | |
| vim.api.nvim_create_autocmd('FileType', { | |
| pattern = ft, | |
| callback = function() | |
| if config.settings then config.settings() end | |
| if config.mappings then | |
| for _, mapping in ipairs(config.mappings) do | |
| map(mapping[1], mapping[2], mapping[3], { buffer = true }) | |
| end | |
| end | |
| end | |
| }) | |
| end | |
| vim.opt.termguicolors = true | |
| vim.cmd([[colorscheme NeoSolarized]]) | |
| vim.opt.background = 'light' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment