init.el (32177B)
1 ;;; package --- Summary Ryan Jeffrey's init.el. 2 3 ;;; Copyright (C) Ryan Jeffrey 2019-2022 4 5 ;;; Author: Ryan Jeffrey <pwishie@gmail.com> 6 ;;; Created: 2019-05-12 7 ;;; Version: 69.420 8 ;;; URL: https://github.com/Ma11ock/dotfiles 9 10 ;;; License: 11 12 ;; This file is part of Ryan's configuration. 13 ;; 14 ;; Ryan's configuration is free software: you can redistribute it and/or modify 15 ;; it under the terms of the GNU General Public License as published by 16 ;; the Free Software Foundation, either version 3 of the License, or 17 ;; (at your option) any later version. 18 ;; 19 ;; Ryan's configuration is distributed in the hope that it will be useful, 20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 ;; GNU General Public License for more details. 23 ;; 24 ;; You should have received a copy of the GNU General Public License 25 ;; along with Ryan's configuration. If not, see <http://www.gnu.org/licenses/>. 26 27 ;;; Commentary: 28 29 ;;; Code: 30 (prefer-coding-system 'utf-8-unix) 31 32 (if (eq system-type 'windows-nt) 33 ;; Windows 34 (setq user-emacs-directory (concat (getenv "HOME") "/.emacs.d/")) 35 ;; Unix. 36 (setq user-emacs-directory (concat (getenv "HOME") "/.config/emacs/"))) 37 38 ;; Move where emacs puts its cache variables (by default it's in init.el). 39 (let* ((my-emacs-custom-file (concat user-emacs-directory "custom-vars.el"))) 40 ;; Create custom variable file if it does not exist. 41 (when (not (file-exists-p my-emacs-custom-file)) 42 (with-temp-buffer (write-file my-emacs-custom-file))) 43 (setq custom-file my-emacs-custom-file) 44 (load "custom-vars.el" 'noerror)) 45 46 47 ;; Set up package management. 48 (require 'package) 49 50 (package-initialize) 51 52 (add-to-list 'package-archives 53 '("melpa" . "https://melpa.org/packages/") t) 54 55 ;; Real package managers. 56 ;; Set up quelpa. 57 (unless (package-installed-p 'quelpa) 58 (with-temp-buffer 59 (url-insert-file-contents "https://github.com/quelpa/quelpa/raw/master/quelpa.el") 60 (eval-buffer) 61 (quelpa-self-upgrade))) 62 63 (unless (package-installed-p 'quelpa-use-package) 64 (package-refresh-contents) 65 (package-install 'quelpa-use-package)) 66 67 (quelpa 68 '(quelpa-use-package 69 :fetcher git 70 :url "https://github.com/quelpa/quelpa-use-package.git")) 71 72 ; QoL 73 (defalias 'yes-or-no-p 'y-or-n-p) 74 75 (require 'quelpa-use-package) 76 77 (eval-when-compile 78 (require 'use-package)) 79 80 (quelpa 81 '(ox-thtml 82 :fetcher git 83 :url "https://github.com/juanjosegarciaripoll/org-thtml")) 84 85 86 (add-to-list 'load-path (concat user-emacs-directory "lisp/")) 87 88 (setq x-gtk-use-system-tooltips nil) 89 90 ;; Font. 91 (if (eq system-type 'windows-nt) 92 ;; Inconsolata doesn't work so well in windows. 93 (add-to-list 'default-frame-alist 94 '(font . "Monaco:weight=normal:size=14")) 95 ;; If Southpark (high DPI monitor) up the size. 96 (if (string= system-name "Southpark") 97 (add-to-list 'default-frame-alist 98 '(font . "Inconsolata Nerd Font Mono:weight=normal:size=18")) 99 (add-to-list 'default-frame-alist 100 '(font . "Inconsolata Nerd Font Mono:weight=normal:size=16")))) 101 102 ;; Pretty symbols. Does not work for some reason. 103 (use-package prettify-symbols-mode 104 :init 105 (defconst lisp--prettify-symbols-alist 106 '(("lambda" . ?λ))) 107 :hook 108 (lisp-mode)) 109 110 ;; Custom themes not in ELPA. 111 (add-to-list 'load-path (concat user-emacs-directory "/themes/")) 112 (setq custom-safe-themes t) ; Treat all themes as safe 113 (quelpa 114 '(replace-colorthemes 115 :fetcher git 116 :url "https://github.com/emacs-jp/replace-colorthemes")) 117 118 ;; Theme 119 (use-package modus-themes 120 :ensure t 121 :init 122 (setq modus-themes-bold-constructs t 123 modus-themes-mode-line '(3d) 124 modus-themes-italic-constructs t 125 modus-themes-mixed-fonts nil 126 modus-themes-subtle-line-numbers nil 127 modus-themes-intense-markup t) 128 129 (modus-themes-load-themes) 130 (modus-themes-load-vivendi)) 131 132 ;; Custom modeline. 133 (display-time-mode 1) 134 (display-battery-mode 1) 135 (defvar mode-line-modes 136 `(:propertize ("" mode-name) 137 help-echo "Major mode\n\ 138 mouse-1: Display major mode menu\n\ 139 mouse-2: Show help for major mode\n\ 140 mouse-3: Toggle minor modes" 141 mouse-face mode-line-highlight 142 local-map ,mode-line-major-mode-keymap)) 143 ;; Themes I like: 144 ;; manoj dark 145 ;; modus vivendi 146 ;; Clarity 147 ;; Hober 148 ;; Comidia 149 ;; Dark laptop 150 ;; euphoria 151 ;; late-night 152 ;; ld-dark 153 ;; simple-1 154 ;; subdued 155 ;; arjen 156 ;; dark laptop 157 ;; euphoria 158 ;; simple-1 159 ;; TODO make joe theme 160 161 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 162 ;; Misc ;; 163 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 164 (make-variable-buffer-local 'make-backup-files) 165 166 ;; Makes controls easier. 167 (use-package rainbow-delimiters 168 :ensure t 169 :hook (prog-mode . rainbow-delimiters-mode)) 170 171 ;; Show ugly whitespaces. 172 (add-hook 'prog-mode-hook #'(lambda () 173 (setq show-trailing-whitespace t))) 174 (save-place-mode 1) ; Save place between sessions. 175 (setq tty-menu-open-use-tmm t) 176 (global-set-key [f10] 'tmm-menubar) ; Use neat terminal menubar. 177 (put 'upcase-region 'disabled nil) 178 (electric-pair-mode t) ; Autoclose () {} [] "" etc. 179 (show-paren-mode 1) 180 (setq-default indent-tabs-mode nil) ; Use spaces. 181 (setq-default tab-width 4) ; Tabs should show up as 4 spaces. 182 (setq column-number-mode t) 183 (tool-bar-mode -1) ; Hide toolbar. 184 (menu-bar-mode -1) ; Hide menubar. 185 ;; Disable scrollbar. 186 (when (boundp 'scroll-bar-mode) 187 (scroll-bar-mode -1)) 188 (setq ring-bell-function 'ignore) ; Shut up. 189 (blink-cursor-mode 0) ; Stable cursor. 190 (set-language-environment "UTF-8") ; UTF-8 by default. 191 (setq redisplay-dont-pause t) ; Speed. 192 (setq vc-follow-symlinks t) ; Otherwise emacs asks 193 (setq tramp-terminal-type "tramp") ; See zshrc 194 (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) ; If script, do chmod +x automagically. 195 (setq-default truncate-lines t) ; Don't split lines visually. 196 ;; scroll one line at a time (less "jumpy" than defaults) 197 (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ; one line at a time 198 (setq mouse-wheel-progressive-speed nil) ; don't accelerate scrolling 199 (setq mouse-wheel-follow-mouse 't) ; scroll window under mouse 200 (use-package good-scroll 201 :ensure t 202 :init 203 (good-scroll-mode 1)) 204 (use-package smooth-scrolling 205 :ensure t 206 :init 207 (setq smooth-scroll-margin 1) 208 (smooth-scrolling-mode 1)) 209 ;; Do not jump scroll 210 (setq auto-window-vscroll nil) 211 (setq scroll-conservatively 10) 212 (setq scroll-margin 1) 213 214 ;; Column 80 fill line. 215 (setq display-fill-column-indicator-column 80) 216 (add-hook 'prog-mode-hook #'display-fill-column-indicator-mode) 217 (add-hook 'org-mode-hook #'display-fill-column-indicator-mode) 218 219 (setenv "MANWIDTH" "100") ; For man mode 220 221 ;; Man-mode auto-kill frame on exit. Should only be called from shell. 222 (defun man-mode-shell (man-page) 223 (add-hook 'man-end-hook '(lambda () 224 (setq man-end-hook nil) 225 (delete-frame) 226 (message "Heck"))) 227 (man man-page) 228 (delete-window)) 229 230 ;; Luke Smith style snippets. 231 (global-set-key (kbd "M-SPC") #'(lambda () 232 (interactive) 233 (search-forward "<++>") 234 (delete-backward-char 4))) 235 236 237 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 238 ;; Modes ;; 239 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 240 241 (use-package tree-sitter 242 :ensure t 243 :init (global-tree-sitter-mode)) 244 245 (use-package tree-sitter-langs 246 :ensure t) 247 248 (use-package editorconfig 249 :ensure t 250 :config 251 (editorconfig-mode 1)) 252 253 (use-package eglot 254 :ensure t) 255 256 (use-package command-log-mode 257 :ensure t) 258 259 (use-package csharp-mode 260 :ensure t 261 :config 262 (format-all-mode t)) 263 264 (use-package conf-mode 265 :init 266 (add-to-list 'auto-mode-alist '("/sxhkdrc\\'" . conf-unix-mode)) 267 (add-to-list 'auto-mode-alist '("/zshrc\\'" . shell-script-mode)) 268 (add-to-list 'auto-mode-alist '("\\config\\'" . conf-mode)) 269 (add-to-list 'auto-mode-alist '("\\.Xdefaults'" . conf-xdefaults-mode)) 270 (add-to-list 'auto-mode-alist '("\\.Xresources'" conf-xdefaults-mode)) 271 (add-to-list 'auto-mode-alist '("\\.Xdefaults'" . conf-xdefaults-mode))) 272 273 274 (use-package systemd 275 :ensure t 276 :mode (("\\.service\\'" . systemd-mode))) 277 278 (use-package fish-mode 279 :ensure t 280 :mode (("\\.fish\\'" . fish-mode))) 281 (use-package editorconfig 282 :ensure t 283 :config 284 (editorconfig-mode 1)) 285 (use-package rustic 286 :ensure t 287 :mode (("\\.rs\\'" . rustic-mode)) 288 :config 289 (setq lsp-rust-server 'rust-analyzer) 290 (setq rustic-format-on-save t) 291 :bind (:map rustic-mode-map 292 ([f12] . rustic-compile))) 293 294 (use-package toml-mode 295 :ensure t) 296 297 (use-package undo-tree 298 :ensure t) 299 (use-package highlight 300 :ensure t) 301 302 (use-package evil 303 :ensure t 304 :init 305 (setq evil-want-keybinding nil) 306 (global-undo-tree-mode) 307 (setq evil-undo-system 'undo-tree) 308 (evil-mode 1) 309 (evil-define-command evil-write-and-kill-buffer (path) 310 "Save and kill buffer." 311 :repeat nil 312 :move-point nil 313 (interactive "<f>") 314 (if (zerop (length path)) 315 (save-buffer) 316 (write-file path)) 317 (kill-buffer (current-buffer))) 318 319 (evil-ex-define-cmd "wbd[elete]" 'evil-write-and-kill-buffer) 320 321 (use-package evil-collection 322 :ensure t 323 :init 324 (evil-collection-init)) 325 326 (setq-default evil-cross-lines t) 327 328 ;; Code snippet for color 329 ;;evil-emacs-state-tag (propertize " EMACS " 'face '((:background "turquoise" :foreground "black"))) 330 (setq evil-normal-state-tag (propertize "-COMMAND-" 'face '((:foreground "turquoise"))) 331 evil-emacs-state-tag (propertize "--EMACS--" 'face '((:foreground "blue"))) 332 evil-insert-state-tag (propertize "--INSRT--" 'face '((:foreground "gold"))) 333 evil-replace-state-tag (propertize "-REPLACE-" 'face '((:foreground "cyan"))) 334 evil-motion-state-tag (propertize "--MOTION-" 'face '((:foreground "grey"))) 335 evil-visual-state-tag (propertize "--VISUAL-" 'face '((:foreground "magenta"))) 336 evil-operator-state-tag (propertize " OPERATE-" 'face '((:foreground "grey")))) 337 (setq evil-insert-state-cursor '(bar "green") 338 evil-normal-state-cursor '(box "magenta")) 339 340 (use-package evil-terminal-cursor-changer 341 :ensure t 342 :init 343 (evil-terminal-cursor-changer-activate)) 344 345 ;; Leader (space). 346 (global-unset-key (kbd "C-SPC")) 347 (define-key evil-normal-state-map (kbd "SPC") nil) 348 (define-key evil-visual-state-map (kbd "SPC") nil) 349 (define-key evil-motion-state-map (kbd "SPC") nil) 350 351 (evil-define-key nil 'global (kbd "<leader>er") #'eval-region) 352 (evil-define-key nil 'global (kbd "<leader>ez") #'suspend-frame) 353 (evil-define-key nil 'global (kbd "<leader>ss") #'split-window-horizontally) 354 (evil-define-key nil 'global (kbd "<leader>so") #'split-window-vertically) 355 (evil-define-key nil 'global (kbd "<leader>x") #'execute-extended-command) 356 (evil-define-key 'normal 'global (kbd "gr") #'revert-buffer) 357 ;; This keybind must be bound to normal map for some reason. 358 (evil-define-key 'normal org-mode-map (kbd "TAB") #'org-cycle) 359 ;; set leader key in all states 360 (evil-set-leader 'insert (kbd "C-SPC")) 361 (evil-set-leader 'normal (kbd "SPC")) 362 (evil-set-leader 'visual (kbd "SPC")) 363 364 (define-key evil-visual-state-map (kbd "TAB") #'indent-region)) 365 366 ;; global move window keys so non joestar buffers can still have these bindings 367 (global-set-key (kbd "M-<left>") #'(lambda () 368 (interactive) 369 (other-window -1))) 370 371 (global-set-key (kbd "M-<right>") #'(lambda () 372 (interactive) 373 (other-window 1))) 374 375 (use-package markdown-mode 376 :ensure t 377 :mode (("README\\.md\\'" . gfm-mode) 378 ("\\.md\\'" . markdown-mode) 379 ("\\.markdown\\'" . markdown-mode)) 380 :init (setq markdown-command "multimarkdown")) 381 382 (use-package org 383 :init 384 (setq org-src-preserve-indentation nil 385 org-edit-src-content-indentation 0) 386 (require 'org-tempo) 387 388 ;; Configure org mode to use lualatex for TeX export. 389 ;; lualatex preview 390 (setq org-latex-pdf-process 391 '("lualatex -shell-escape -interaction nonstopmode %f" 392 "lualatex -shell-escape -interaction nonstopmode %f")) 393 394 (setq luamagick '(luamagick :programs ("lualatex" "convert") 395 :description "pdf > png" 396 :message "you need to install lualatex and imagemagick." 397 :use-xcolor t 398 :image-input-type "pdf" 399 :image-output-type "png" 400 :image-size-adjust (1.0 . 1.0) 401 :latex-compiler ("lualatex -interaction nonstopmode -output-directory %o %f") 402 :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))) 403 404 (add-to-list 'org-preview-latex-process-alist luamagick) 405 406 (setq org-preview-latex-default-process 'luamagick) 407 408 (setq org-src-tab-acts-natively t) 409 :bind (:map org-mode-map 410 ("M-S-<up>" . 'text-scale-increase) 411 ("M-S-<down>" . 'text-scale-decrease))) 412 (use-package org-ref 413 :ensure t 414 :init 415 (use-package helm-bibtex 416 :ensure t) 417 :config 418 (require 'bibtex) 419 (setq bibtex-completion-bibliography `(,(concat user-emacs-directory "/bibliography/references.bib") 420 ,(concat user-emacs-directory "/bibliography/dei.bib") 421 ,(concat user-emacs-directory "/bibliography/master.bib") 422 ,(concat user-emacs-directory "/bibliography/archive.bib")) 423 bibtex-completion-library-path `(,(concat user-emacs-directory "/bibliography/bibtex-pdfs/")) 424 bibtex-completion-additional-search-fields '(keywords) 425 bibtex-completion-notes-path (concat user-emacs-directory "/bibliography/notes/")) 426 (setq bibtex-autokey-year-length 4 427 bibtex-autokey-name-year-separator "-" 428 bibtex-autokey-year-title-separator "-" 429 bibtex-autokey-titleword-separator "-" 430 bibtex-autokey-titlewords 2 431 bibtex-autokey-titlewords-stretch 1 432 bibtex-autokey-titleword-length 5) 433 (define-key bibtex-mode-map (kbd "H-b") 'org-ref-bibtex-hydra/body) 434 (define-key org-mode-map (kbd "C-c ]") 'org-ref-insert-link) 435 (define-key org-mode-map (kbd "s-[") 'org-ref-insert-link-hydra/body) 436 (require 'helm-bibtex) 437 (require 'org-ref-helm) 438 (require 'org-ref-arxiv) 439 (require 'org-ref-scopus) 440 (require 'org-ref-wos)) 441 442 (use-package org-indent-mode 443 :config 444 (org-indent-mode t) 445 :hook org-mode) 446 447 (quelpa 448 '(ox-thtml 449 :fetcher git 450 :url "https://github.com/Ma11ock/org-thtml")) 451 452 (use-package org-bullets 453 :ensure t) 454 455 (use-package wc-mode 456 :ensure t 457 :hook org-mode) 458 459 460 (use-package display-line-numbers-mode 461 :hook (prog-mode org-mode LaTex-mode) 462 :init 463 (setq display-line-numbers-type 'relative)) 464 465 466 ;; Configuring LaTeX must be done like this because of legacy. 467 (use-package tex-mode 468 :ensure auctex 469 :config 470 (auctex-latexmk-setup) 471 :init 472 (use-package company-auctex 473 :ensure t) 474 475 (use-package auctex-latexmk 476 :ensure t) 477 478 :config 479 (setq TeX-auto-save t) 480 (setq TeX-parse-self t) 481 (add-hook 'LaTeX-mode-hook #'flyspell-mode) 482 (add-hook 'LaTeX-mode-hook #'wc-mode) 483 (add-hook 'LaTeX-mode-hook #'company-auctex-init) 484 (add-hook 'LaTeX-mode-hook #'company-mode) 485 (add-hook 'LaTeX-mode-hook #'TeX-source-correlate-mode) 486 (add-hook 'LaTeX-mode-hook #'TeX-interactive-mode)) 487 488 (when (and module-file-suffix (not (eq system-type 'windows-nt))) 489 (use-package vterm 490 :ensure t 491 :hook ((vterm-mode) . meliache/evil-normal-in-vterm-copy-mode) 492 :config 493 (defun meliache/evil-normal-in-vterm-copy-mode () 494 (if (bound-and-true-p vterm-copy-mode) 495 (evil-normal-state) 496 (evil-emacs-state))) 497 (evil-set-initial-state 'vterm-mode 'emacs) 498 :init 499 (setq vterm-always-compile-module t) 500 :bind (:map vterm-mode-map 501 ("M-c" . 'vterm-copy-mode) 502 ("M-i" . 'ido-switch-buffer)))) 503 504 (use-package fzf 505 :ensure t 506 :config 507 (setq fzf/args "-x --color bw --print-query --margin=1,0 --no-hscroll" 508 fzf/executable "fzf" 509 fzf/git-grep-args "-i --line-number %s" 510 ;; command used for `fzf-grep-*` functions 511 ;; example usage for ripgrep: 512 ;; fzf/grep-command "rg --no-heading -nH" 513 fzf/grep-command "grep -nrH" 514 ;; If nil, the fzf buffer will appear at the top of the window 515 fzf/position-bottom t 516 fzf/window-height 15)) 517 518 ;; Emacs IDE bloat features. 519 (use-package treemacs 520 :ensure t 521 :bind (:map global-map 522 ([f8] . #'treemacs))) 523 524 (use-package all-the-icons 525 :ensure t 526 :if (display-graphic-p)) 527 528 (use-package clippy 529 :ensure t) 530 531 (use-package minimap 532 :ensure t 533 :if (display-graphic-p)) 534 535 (use-package beacon 536 :ensure t 537 :init (beacon-mode 1)) 538 539 (use-package helm 540 :ensure t 541 :init 542 (helm-mode 1) 543 544 (use-package helm-ag 545 :ensure t) 546 547 (use-package helm-unicode 548 :ensure t) 549 550 (use-package helm-xref 551 :ensure t) 552 (define-key global-map [remap find-file] #'helm-find-files) 553 (define-key global-map [remap execute-extended-command] #'helm-M-x) 554 (define-key global-map [remap switch-to-buffer] #'helm-mini) 555 (define-key global-map (kbd "M-i") #'switch-to-buffer) 556 557 (evil-define-key 'normal 'global (kbd "<leader>ff") #'fzf) 558 (evil-define-key 'normal 'global (kbd "<leader>fg") #'fzf-git) 559 (evil-define-key 'normal 'global (kbd "<leader>cdf") #'clippy-describe-function) 560 (evil-define-key 'normal 'global (kbd "<leader>cds") #'clippy-describe-variable) 561 (evil-define-key 'normal 'global (kbd "<leader>df") #'describe-function) 562 (evil-define-key 'normal 'global (kbd "<leader>dv") #'describe-variable) 563 (evil-define-key 'normal 'global (kbd "<leader>ds") #'describe-symbol) 564 ;; Evil helm. 565 (evil-define-key 'normal 'global (kbd "<leader>haa") #'helm-ag) 566 (evil-define-key 'normal 'global (kbd "<leader>haf") #'helm-ag-this-file) 567 (evil-define-key 'normal 'global (kbd "<leader>hu") #'helm-unicode) 568 (evil-define-key 'normal 'global (kbd "<leader>SPC") #'helm-M-x) 569 ;; Use vim window commands for emacs mode. 570 (evil-define-key 'emacs 'global (kbd "C-w C-w") #'evil-window-next) 571 (evil-define-key 'emacs 'global (kbd "C-w C-k") #'evil-window-up) 572 (evil-define-key 'emacs 'global (kbd "C-w C-p") #'evil-window-mru) 573 (evil-define-key 'emacs 'global (kbd "C-w C-p") #'evil-window-mru) 574 (evil-define-key 'emacs 'global (kbd "C-w C-l") #'evil-window-right) 575 (evil-define-key 'emacs 'global (kbd "C-w C-h") #'evil-window-left) 576 (evil-define-key 'emacs 'global (kbd "C-w W") #'evil-window-prev) 577 (evil-define-key 'emacs 'global (kbd "C-w |") #'evil-window-set-width) 578 (evil-define-key 'emacs 'global (kbd "C-w C-_") #'evil-window-set-height) 579 (evil-define-key 'emacs 'global (kbd "C-w n") #'evil-window-new) 580 (evil-define-key 'emacs 'global (kbd "C-w C-s") #'evil-window-split) 581 (evil-define-key 'emacs 'global (kbd "C-w C-v") #'evil-window-vsplit) 582 (evil-define-key 'emacs 'global (kbd "C-w C-x") #'evil-window-exchange) 583 (evil-define-key 'emacs 'global (kbd "C-w >") #'evil-window-increase-width) 584 (evil-define-key 'emacs 'global (kbd "C-w <") #'evil-window-decrease-width) 585 (evil-define-key 'emacs 'global (kbd "C-w +") #'evil-window-increase-height) 586 (evil-define-key 'emacs 'global (kbd "C-w -") #'evil-window-decrease-height) 587 (evil-define-key 'emacs 'global (kbd "C-w C-r") #'evil-window-rotate-downwards) 588 (evil-define-key 'emacs 'global (kbd "C-w R") #'evil-window-rotate-upwards)) 589 590 (use-package format-all 591 :ensure t) 592 593 (use-package haskell-mode 594 :ensure t) 595 596 (use-package haskell-snippets 597 :ensure t) 598 599 (use-package haskell-tab-indent 600 :ensure t) 601 602 (use-package lsp-mode 603 :ensure t 604 :custom 605 (lsp-eldoc-render-all t) 606 (lsp-idle-delay 0.6) 607 ;; enable / disable the hints as you prefer: 608 (lsp-rust-analyzer-server-display-inlay-hints t) 609 (lsp-rust-analyzer-display-lifetime-elision-hints-enable "skip_trivial") 610 (lsp-rust-analyzer-display-chaining-hints t) 611 (lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names nil) 612 (lsp-rust-analyzer-display-closure-return-type-hints t) 613 (lsp-rust-analyzer-display-parameter-hints nil) 614 (lsp-rust-analyzer-display-reborrow-hints nil) 615 :init 616 ;; Evil mode keymaps 617 (evil-define-key nil 'global (kbd "<leader>l.") #'lsp-find-definition) 618 (evil-define-key nil 'global (kbd "<leader>l==") #'lsp-format-buffer) 619 (evil-define-key nil 'global (kbd "<leader>lr") #'lsp-find-references) 620 (evil-define-key nil 'global (kbd "<leader>lG") #'lsp-ui-peek-find-implementation) 621 (evil-define-key nil 'global (kbd "<leader>lg") #'lsp-find-implementation) 622 (evil-define-key nil 'global (kbd "<leader>lh") #'lsp-describe-thing-at-point) 623 (evil-define-key nil 'global (kbd "<leader>lr") #'lsp-rename) 624 625 (setq lsp-before-save-edits t) 626 627 ;(lsp-install-server 'omnisharp) TODO get this to install automagically. 628 629 630 (setq gc-cons-threshold (* 100 1024 1024) 631 read-process-output-max (* 1024 1024) 632 treemacs-space-between-root-nodes nil 633 company-idle-delay 0.0 634 company-minimum-prefix-length 1 635 lsp-idle-delay 0.1) ;; clangd is fast 636 637 (with-eval-after-load 'lsp-mode 638 (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) 639 (require 'dap-cpptools)) 640 641 (use-package helm-lsp 642 :ensure t 643 :init (define-key lsp-mode-map [remap xref-find-apropos] #'helm-lsp-workspace-symbol)) 644 645 ;; optional if you want which-key integration 646 (use-package which-key 647 :ensure t 648 :config 649 (which-key-mode)) 650 ;; optionally 651 (use-package lsp-ui 652 :ensure t 653 :commands lsp-ui-mode 654 :custom 655 (lsp-ui-peek-always-show t) 656 (lsp-ui-sideline-show-hover t) 657 (lsp-ui-doc-enable nil)) 658 659 ;; optionally if you want to use debugger 660 (use-package dap-mode 661 :ensure t 662 :config 663 (dap-ui-mode) 664 (dap-ui-controls-mode 1) 665 666 (require 'dap-lldb) 667 (require 'dap-gdb-lldb) 668 ;; installs .extension/vscode 669 (dap-gdb-lldb-setup) 670 (dap-register-debug-template 671 "Rust::LLDB Run Configuration" 672 (list :type "lldb" 673 :request "launch" 674 :name "LLDB::Run" 675 :gdbpath "rust-lldb" 676 :target nil 677 :cwd nil))) 678 679 (use-package lsp-treemacs 680 :ensure t) 681 ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") 682 (setq lsp-keymap-prefix "C-c l") 683 :hook ((c-mode c++-mode go-mode) . lsp) 684 :commands lsp) 685 686 687 ;; (use-package dap-LANGUAGE) to load the dap adapter for your language 688 689 (use-package yaml-mode 690 :ensure t 691 :mode (("\\.clang-format\\'" . yaml-mode))) 692 693 (use-package cider 694 :ensure t 695 :bind (:map cider-mode-map 696 ("M-e" . cider-eval-last-sexp) 697 ("M-r" . cider-eval-region)) 698 :init 699 (eval-after-load "cider-mode" 700 '(define-key cider-mode-map (kbd "C-x") 'joe-nextword))) 701 702 (use-package clojure-mode 703 :ensure t) 704 705 (use-package company 706 :ensure t 707 :init (add-hook 'prog-mode-hook 'company-mode) 708 :bind (:map company-active-map 709 ("C-n" . company-select-next) 710 ("C-p" . company-select-previous)) 711 :config 712 (setq company-idle-delay 0.3) 713 (setq company-tooltip-align-annotations t) ; aligns annotation to the right hand side 714 (setq company-minimum-prefix-length 1) 715 (setq company-clang-arguments '("-std=c++17")) 716 (use-package company-c-headers 717 :ensure t 718 :init 719 (add-to-list 'company-backends 'company-c-headers))) 720 721 (use-package flycheck 722 :ensure t) 723 724 (use-package with-editor 725 :ensure t) 726 727 (use-package magit 728 :ensure t 729 :init 730 (add-hook 'diff-mode-hook #'whitespace-mode) 731 (add-hook 'git-commit-setup-hook #'git-commit-turn-on-flyspell)) 732 733 (defun insert-current-date () 734 (interactive) 735 (insert (shell-command-to-string "echo -n $(date +%Y-%m-%d)"))) 736 737 (use-package git-modes 738 :ensure t 739 :init 740 (add-to-list 'auto-mode-alist '("\\.gitignore\\'" . gitignore-mode)) ) 741 742 (use-package rainbow-mode 743 :ensure t 744 :hook (web-mode emacs-lisp-mode)) 745 746 (use-package crontab-mode 747 :ensure t) 748 749 (add-hook 'prog-mode-hook #'flyspell-prog-mode) ; Flyspell on comments and strings. 750 751 (use-package cmake-mode 752 :ensure t 753 :hook (cmake-mode . lsp-deferred)) 754 755 (use-package cmake-font-lock 756 :ensure t 757 :after cmake-mode 758 :config (cmake-font-lock-activate)) 759 760 (use-package etc-sudoers-mode 761 :ensure t) 762 763 (use-package web-mode 764 :ensure t 765 :config 766 (add-to-list 'auto-mode-alist '("\\.api\\'" . web-mode)) 767 (add-to-list 'auto-mode-alist '("/some/react/path/.*\\.js[x]?\\'" . web-mode)) 768 769 (setq web-mode-markup-indent-offset 2) 770 (setq web-mode-css-indent-offset 2) 771 (setq web-mode-code-indent-offset 2) 772 (setq web-mode-engines-alist 773 '(("php" . "\\.phtml\\'") 774 ("blade" . "\\.blade\\.") 775 ("handlebars" . "\\.handlebars\\'"))) 776 777 (setq web-mode-content-types-alist 778 '(("json" . "/some/path/.*\\.api\\'") 779 ("xml" . "/other/path/.*\\.api\\'") 780 ("jsx" . "/some/react/path/.*\\.js[x]?\\'"))) 781 (setq web-mode-markup-indent-offset 2) 782 (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode)) 783 (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode)) 784 (add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode)) 785 (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode)) 786 (add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode)) 787 (add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode)) 788 (add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode)) 789 (add-to-list 'auto-mode-alist '("\\.css\\'" . web-mode)) 790 (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) 791 (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode)) 792 (define-key web-mode-map (kbd "C-n") 'web-mode-tag-match) 793 (setq web-mode-enable-current-column-highlight t) 794 (setq web-mode-enable-current-element-highlight t) 795 (setq web-mode-enable-auto-closing t)) 796 797 (use-package impatient-mode 798 :ensure t 799 :hook web-mode) 800 801 (use-package emmet-mode 802 :ensure t 803 :config 804 (define-key web-mode-map (kbd "C-j") 'emmet-expand-line) 805 (emmet-mode) 806 ; (emmet-preview-mode) 807 :hook web-mode) 808 809 (use-package cc-mode 810 :config 811 (setq c-default-style "java" 812 c-basic-offset 4) 813 (c-set-offset 'inline-open '0)) 814 815 (setq js-indent-level 2) 816 (use-package json-mode 817 :ensure t) 818 ;; Typescript 819 (use-package typescript-mode 820 :ensure t) 821 822 (use-package php-mode 823 :ensure t 824 :init 825 (use-package php-language-server 826 :ensure t)) 827 828 829 (use-package elpy 830 :ensure t 831 :init 832 (add-hook 'python-mode-hook #'(lambda () 833 (elpy-enable) 834 (when (require 'flycheck nil t) 835 (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) 836 (add-hook 'elpy-mode-hook 'flycheck-mode))))) 837 838 (use-package blacken 839 :ensure t) 840 841 (use-package py-autopep8 842 :ensure t 843 :init 844 (add-hook 'elpy-mode-hook #'py-autopep8-enable-on-save)) 845 846 (use-package robe 847 :ensure t 848 :init (eval-after-load 'company 849 '(push 'company-robe company-backends)) 850 :hook (robe-mode . ruby-mode)) 851 852 (use-package rubocop 853 :ensure t) 854 855 (use-package go-mode 856 :ensure t 857 :init 858 (add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode)) 859 (add-hook 'go-mode-hook 'lsp-deferred) 860 (add-hook 'before-save-hook 'gofmt-before-save)) 861 862 (use-package gdscript-mode 863 :ensure t 864 :init 865 (defun lsp--gdscript-ignore-errors (original-function &rest args) 866 "Ignore the error message resulting from Godot not replying to the `JSONRPC' request." 867 (if (string-equal major-mode "gdscript-mode") 868 (let ((json-data (nth 0 args))) 869 (if (and (string= (gethash "jsonrpc" json-data "") "2.0") 870 (not (gethash "id" json-data nil)) 871 (not (gethash "method" json-data nil))) 872 nil ; (message "Method not found") 873 (apply original-function args))) 874 (apply original-function args))) 875 ;; Runs the function `lsp--gdscript-ignore-errors` around `lsp--get-message-type` to suppress unknown notification errors. 876 (advice-add #'lsp--get-message-type :around #'lsp--gdscript-ignore-errors) 877 (setq gdscript-godot-executable "/usr/bin/godot") 878 (setq gdscript-use-tab-indents nil) 879 (setq gdscript-indent-offset 4) 880 (setq gdscript-docs-local-path "/home/ryan/Documents/godot-docs/_build/html/") 881 :config 882 (auto-revert-mode)) 883 884 (use-package glsl-mode 885 :ensure t) 886 887 (use-package gradle-mode 888 :ensure t) 889 890 (use-package groovy-mode 891 :ensure t) 892 893 (use-package lua-mode 894 :ensure t) 895 896 (setq ispell-program-name (executable-find "hunspell")) 897 (setq ispell-local-dictionary "en_US") 898 (setq ispell-local-dictionary-alist 899 '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil nil nil utf-8))) 900 901 (add-hook 'org-mode-hook 'flyspell-mode) 902 903 ;; For asynchronous. 904 (use-package async 905 :ensure t) 906 907 (use-package emojify 908 :ensure t) 909 910 (use-package yasnippet 911 :ensure t 912 :init 913 ;; Must be configured this way or we get errors :/ 914 (require 'yasnippet) 915 (yas-reload-all) 916 (add-hook 'prog-mode-hook #'yas-minor-mode)) 917 918 (use-package yasnippet-snippets 919 :ensure t) 920 921 (add-to-list 'load-path "/usr/share/emacs/site-lisp/emacs-llvm-mode/") 922 (when (require 'llvm-mode) 923 (add-to-list 'auto-mode-alist '("\\.ll\\'" . llvm-mode))) 924 925 926 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 927 ;; Utilities ;; 928 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 929 930 931 (defun apply-hook-to-modes (modes-list hook-fun &optional depth local) 932 "Apply a hook `HOOK-FUN' to a list of modes `MODES-LIST' at depth `DEPTH'. 933 If `LOCAL' is non-nil, then the hook is applied to the buffer local hook 934 variable rather than the global one." 935 (when (not (null modes-list)) 936 (add-hook (car modes-list) hook-fun depth local) 937 (apply-hook-to-modes (cdr modes-list) hook-fun depth local))) 938 939 (defun indent-buffer () 940 (interactive) 941 (save-excursion 942 (indent-region (point-min) (point-max) nil))) 943 944 ;; Format these modes on save. 945 (apply-hook-to-modes '(c-mode-hook c++-mode-hook objc-mode-hook emacs-lisp-mode) #'(lambda () 946 (add-hook 'before-save-hook #'indent-buffer nil t))) 947 948 (apply-hook-to-modes '(emacs-lisp-mode) #'flycheck-mode) 949 950 ;;; Edit files with doas and sudo. 951 (defun er-doas-edit (&optional arg) 952 "Edit currently visited file as root With a prefix ARG prompt for a file to visit. 953 Will also prompt for a file to visit if current buffer is not visiting a file." 954 (interactive "P") 955 (if (or arg (not buffer-file-name)) 956 (find-file (concat "/doas:root@localhost:" 957 (ido-read-file-name "Find file(as root): "))) 958 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name)))) 959 960 (defun er-sudo-edit (&optional arg) 961 "Edit currently visited file as root With a prefix ARG prompt for a file to visit. 962 Will also prompt for a file to visit if current buffer is not visiting a file." 963 (interactive "P") 964 (if (or arg (not buffer-file-name)) 965 (find-file (concat "/sudo:root@localhost:" 966 (ido-read-file-name "Find file(as root): "))) 967 (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name)))) 968 969 ;; tell emacs not to use the clipboard 970 ;(setq x-select-enable-clipboard nil) 971 ;; Left-to-right by default for slight performance increase. 972 (setq-default bidi-paragraph-direction 'left-to-right) 973 (setq bidi-inhibit-bpa t) 974 ;; For slight performance increase with long lines. 975 (global-so-long-mode 1) 976 977 (when 978 (or (string= system-name "arlen") (string= system-name "Springfield")) 979 (require 'ryan-os)) 980 981 (put 'narrow-to-region 'disabled nil) 982 983 (provide '.emacs) 984 ;;; .emacs ends here