dotfiles

My dotfiles.
git clone git://git.ryanmj.xyz/dotfiles.git
Log | Files | Refs | LICENSE

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