dotfiles

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

config.org (25305B)


      1 #+TITLE: Ryan Jeffrey's Emacs config
      2 #+AUTHOR: Ryan Jeffrey
      3 #+EMAIL: ryan@ryanmj.xyz
      4 #+OPTIONS: num:nil
      5 * Emacs
      6 ** init
      7 #+BEGIN_SRC emacs-lisp
      8 (eval-when-compile
      9   (require 'use-package))
     10 
     11 (defalias 'yes-or-no-p 'y-or-n-p)
     12 
     13 #+END_SRC
     14 ** quelpa packages
     15 #+begin_src emacs-lisp
     16 
     17 (quelpa
     18  '(ox-thtml
     19    :fetcher git
     20    :url "https://github.com/juanjosegarciaripoll/org-thtml"))
     21 
     22 #+end_src
     23 ** font and theme
     24 #+BEGIN_SRC emacs-lisp
     25 
     26 (add-to-list 'load-path (concat user-emacs-directory "lisp/"))
     27 
     28 (setq x-gtk-use-system-tooltips nil)
     29 
     30 ;; font
     31 (when (not (eq system-type 'windows-nt))
     32   (if (string= system-name "Southpark")
     33       (add-to-list 'default-frame-alist
     34 		           '(font . "Inconsolata Nerd Font Mono:size=16"))
     35     (add-to-list 'default-frame-alist
     36 		         '(font . "Inconsolata Nerd Font Mono:size=16"))))
     37 
     38 (use-package prettify-symbols-mode
     39   :init 
     40   (defconst lisp--prettify-symbols-alist
     41     '(("lambda"  . ?λ)))
     42   :hook
     43   (lisp-mode))
     44 
     45 
     46 (add-to-list 'load-path (concat user-emacs-directory "/themes/"))
     47 (setq custom-safe-themes t)   ; Treat all themes as safe
     48 (quelpa
     49  '(replace-colorthemes
     50    :fetcher git
     51    :url "https://github.com/emacs-jp/replace-colorthemes"))
     52 
     53 (use-package modus-themes
     54   :ensure t
     55   :init
     56   (setq modus-themes-bold-constructs t
     57         modus-themes-mode-line '3d
     58         modus-themes-italic-constructs t
     59         modus-themes-mixed-fonts nil
     60         modus-themes-subtle-line-numbers nil
     61         modus-themes-intense-markup t)
     62 
     63   (modus-themes-load-themes)
     64   (modus-themes-load-vivendi))
     65 
     66 (display-time-mode 1)
     67 (display-battery-mode 1)
     68 (defvar mode-line-modes
     69       `(:propertize ("" mode-name)
     70                     help-echo "Major mode\n\
     71 mouse-1: Display major mode menu\n\
     72 mouse-2: Show help for major mode\n\
     73 mouse-3: Toggle minor modes"
     74                     mouse-face mode-line-highlight
     75                     local-map ,mode-line-major-mode-keymap))
     76 ;; Clarity
     77 ;; Hober
     78 ;; Comidia
     79 ;; Dark laptop
     80 ;; euphoria
     81 ;; late-night
     82 ;; ld-dark
     83 ;; simple-1
     84 ;; subdued
     85 ;; TODO make joe theme
     86 
     87                                         ; arjen
     88                                         ; dark laptop
     89                                         ; euphoria
     90                                         ; simple-1
     91 
     92 #+END_SRC
     93 ** swiper
     94 #+BEGIN_SRC emacs-lisp
     95 (use-package swiper
     96   :init
     97   (global-set-key (kbd "C-s") 'swiper)
     98   :ensure t)
     99 
    100 (use-package counsel
    101   :ensure t)
    102 
    103 #+END_SRC
    104 
    105 ** Misc
    106 #+BEGIN_SRC emacs-lisp
    107 (use-package rainbow-delimiters
    108   :ensure t
    109   :hook (prog-mode . rainbow-delimiters-mode))
    110 
    111 (add-hook 'prog-mode-hook #'(lambda ()
    112                               (setq show-trailing-whitespace t)))
    113 (save-place-mode 1)
    114 (setq tty-menu-open-use-tmm t)
    115 (global-set-key [f10] 'tmm-menubar)
    116 (put 'upcase-region 'disabled nil)
    117 (electric-pair-mode t)
    118 (show-paren-mode 1)
    119 (setq-default indent-tabs-mode nil)
    120 (setq-default tab-width 4)
    121 (setq column-number-mode t)
    122 (tool-bar-mode -1)
    123 (menu-bar-mode -1)
    124 (scroll-bar-mode -1)
    125 (setq ring-bell-function 'ignore)
    126 (blink-cursor-mode 0)
    127 (set-language-environment "UTF-8")
    128 (setq redisplay-dont-pause t)
    129 (setq vc-follow-symlinks t) ; Otherwise emacs asks
    130 (setq tramp-terminal-type "tramp") ; See zshrc
    131 (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p)
    132 (setq-default truncate-lines t)
    133 ;; scroll one line at a time (less "jumpy" than defaults)
    134 
    135 (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
    136 (setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling
    137 (setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse
    138 
    139 (use-package good-scroll
    140   :ensure t
    141   :init
    142   (good-scroll-mode 1))
    143 
    144 (use-package smooth-scrolling
    145   :ensure t
    146   :init
    147   (setq smooth-scroll-margin 1) 
    148   (smooth-scrolling-mode 1))
    149 ;; Do not jump scroll
    150 (setq auto-window-vscroll nil)
    151 (setq scroll-conservatively 10)
    152 (setq scroll-margin 1)
    153 
    154 ;; Column 80 fill line.
    155 (setq display-fill-column-indicator-column 80)
    156 (add-hook 'prog-mode-hook #'display-fill-column-indicator-mode)
    157 (add-hook 'org-mode-hook #'display-fill-column-indicator-mode)
    158 
    159 
    160 (setenv "MANWIDTH" "100") ; For man mode
    161 
    162 ;; Man-mode auto-kill frame on exit. Should only be called from shell.
    163 (defun man-mode-shell (man-page)
    164   (add-hook 'man-end-hook '(lambda () 
    165                              (setq man-end-hook nil)
    166                              (delete-frame)
    167                              (message "Heck")))
    168   (man man-page)
    169   (delete-window))
    170 
    171 ;; TODO Smithets
    172 (global-set-key (kbd "M-SPC") #'(lambda ()
    173                                   (interactive)
    174                                   (search-forward "<++>")
    175                                   (delete-backward-char 4)))
    176 
    177 (use-package command-log-mode
    178   :ensure t)
    179 
    180 #+END_SRC
    181 
    182 ** Filename-mode associations, modes for specific file types
    183 #+BEGIN_SRC emacs-lisp
    184 
    185 (use-package conf-mode
    186   :init
    187   (add-to-list 'auto-mode-alist '("/sxhkdrc\\'" . conf-unix-mode))
    188   (add-to-list 'auto-mode-alist '("/zshrc\\'" . shell-script-mode))
    189   (add-to-list 'auto-mode-alist '("\\config\\'" . conf-mode))
    190   (add-to-list 'auto-mode-alist '("\\.Xdefaults'" . conf-xdefaults-mode))
    191   (add-to-list 'auto-mode-alist '("\\.Xresources'" conf-xdefaults-mode))
    192   (add-to-list 'auto-mode-alist '("\\.Xdefaults'" . conf-xdefaults-mode)))
    193 
    194 
    195 (use-package systemd
    196   :ensure t
    197   :mode (("\\.service\\'" . systemd-mode)))
    198 
    199 (use-package fish-mode
    200   :ensure t
    201   :mode (("\\.fish\\'" . fish-mode)))
    202 
    203 #+END_SRC
    204 ** Rust
    205 #+BEGIN_SRC emacs-lisp
    206 (use-package rustic
    207   :ensure t
    208   :mode (("\\.rs\\'" . rustic-mode))
    209   :config
    210   (setq rustic-format-on-save t))
    211 
    212 #+END_SRC
    213 ** toml
    214 #+BEGIN_SRC emacs-lisp
    215 
    216 (use-package toml-mode
    217 :ensure t)
    218 #+END_SRC
    219 ** evil mode
    220 #+BEGIN_SRC emacs-lisp
    221 (use-package undo-tree
    222   :ensure t)
    223 (use-package highlight
    224   :ensure t)
    225 (use-package evil
    226   :ensure t
    227   :init
    228   (setq evil-want-keybinding nil)
    229   (global-undo-tree-mode)
    230   (setq evil-undo-system 'undo-tree)
    231   (evil-mode 1)
    232   (use-package evil-collection
    233     :ensure t
    234     :init
    235     (evil-collection-init))
    236   (setq-default evil-cross-lines t)
    237 
    238   ;; Code snippet for color
    239   ;;evil-emacs-state-tag    (propertize "  EMACS  " 'face '((:background "turquoise" :foreground "black")))
    240   (setq evil-normal-state-tag   (propertize "-COMMAND-" 'face '((:foreground "turquoise")))
    241         evil-emacs-state-tag    (propertize "--EMACS--" 'face '((:foreground "blue")))
    242         evil-insert-state-tag   (propertize "--INSRT--" 'face '((:foreground "gold")))
    243         evil-replace-state-tag  (propertize "-REPLACE-" 'face '((:foreground "cyan")))
    244         evil-motion-state-tag   (propertize "--MOTION-" 'face '((:foreground "grey")))
    245         evil-visual-state-tag   (propertize "--VISUAL-" 'face '((:foreground "magenta")))
    246         evil-operator-state-tag (propertize " OPERATE-" 'face '((:foreground "grey"))))
    247   (setq evil-insert-state-cursor '(bar  "green")
    248         evil-normal-state-cursor '(box "magenta"))
    249 
    250   (use-package evil-terminal-cursor-changer
    251     :ensure t
    252     :init
    253     (evil-terminal-cursor-changer-activate))
    254 
    255   (global-unset-key (kbd "C-SPC"))
    256   (define-key evil-normal-state-map (kbd "SPC") nil)
    257   (define-key evil-visual-state-map (kbd "SPC") nil)
    258   (define-key evil-motion-state-map (kbd "SPC") nil)
    259 
    260   (evil-define-key nil 'global (kbd "<leader>er") #'eval-region)
    261   (evil-define-key nil 'global (kbd "<leader>ez") #'suspend-frame)
    262   (evil-define-key nil 'global (kbd "<leader>ss") #'split-window-horizontally)
    263   (evil-define-key nil 'global (kbd "<leader>so") #'split-window-vertically)
    264   (evil-define-key nil 'global (kbd "<leader>x") #'execute-extended-command)
    265 ;; This keybind must be bound to normal map for some reason.
    266   (evil-define-key 'normal org-mode-map (kbd "TAB") #'org-cycle)
    267   ;; set leader key in all states
    268   (evil-set-leader 'insert (kbd "C-SPC"))
    269   (evil-set-leader 'normal (kbd "SPC"))
    270   (evil-set-leader 'visual (kbd "SPC"))
    271 
    272   (define-key evil-visual-state-map (kbd "TAB") #'indent-region))
    273 
    274 ;; global move window keys so non joestar buffers can still have these bindings
    275 (global-set-key (kbd "M-<left>") #'(lambda ()
    276                                      (interactive)
    277                                      (other-window -1)))
    278 
    279 (global-set-key (kbd "M-<right>") #'(lambda ()
    280                                       (interactive)
    281                                       (other-window 1)))
    282 
    283 #+END_SRC
    284 ** markdown
    285 #+begin_src emacs-lisp
    286 
    287 (use-package markdown-mode
    288   :ensure t
    289   :mode (("README\\.md\\'" . gfm-mode)
    290          ("\\.md\\'" . markdown-mode)
    291          ("\\.markdown\\'" . markdown-mode))
    292   :init (setq markdown-command "multimarkdown"))
    293 
    294 #+end_src
    295 ** org
    296 #+BEGIN_SRC emacs-lisp
    297 
    298 (use-package org
    299   :init 
    300   (setq org-src-preserve-indentation nil 
    301         org-edit-src-content-indentation 0)
    302   (require 'org-tempo)
    303 
    304   (setq org-src-tab-acts-natively t)
    305   :bind (:map org-mode-map
    306               ("M-S-<up>" . 'text-scale-increase)
    307               ("M-S-<down>" . 'text-scale-decrease)))
    308 
    309 (use-package org-ref
    310   :ensure t
    311   :config
    312   (require 'bibtex)
    313   (setq bibtex-completion-bibliography `(,(concat user-emacs-directory "/bibliography/references.bib")
    314 					                     ,(concat user-emacs-directory "/bibliography/dei.bib")
    315 					                     ,(concat user-emacs-directory "/bibliography/master.bib")
    316 					                     ,(concat user-emacs-directory "/bibliography/archive.bib"))
    317 	    bibtex-completion-library-path `(,(concat user-emacs-directory "/bibliography/bibtex-pdfs/"))
    318 		bibtex-completion-additional-search-fields '(keywords)
    319         bibtex-completion-notes-path (concat user-emacs-directory "/bibliography/notes/"))
    320   (setq bibtex-autokey-year-length 4
    321 	    bibtex-autokey-name-year-separator "-"
    322 	    bibtex-autokey-year-title-separator "-"
    323 	    bibtex-autokey-titleword-separator "-"
    324 	    bibtex-autokey-titlewords 2
    325 	    bibtex-autokey-titlewords-stretch 1
    326 	    bibtex-autokey-titleword-length 5)
    327   (define-key bibtex-mode-map (kbd "H-b") 'org-ref-bibtex-hydra/body)
    328   (define-key org-mode-map (kbd "C-c ]") 'org-ref-insert-link)
    329   (define-key org-mode-map (kbd "s-[") 'org-ref-insert-link-hydra/body)
    330   (require 'helm-bibtex)
    331   (require 'org-ref-helm)
    332   (require 'org-ref-arxiv)
    333   (require 'org-ref-scopus)
    334   (require 'org-ref-wos))
    335 
    336 ;; (use-package org-ref-ivy
    337 ;;   :init (setq org-ref-insert-link-function 'org-ref-insert-link-hydra/body
    338 ;; 	          org-ref-insert-cite-function 'org-ref-cite-insert-ivy
    339 ;; 	          org-ref-insert-label-function 'org-ref-insert-label-link
    340 ;; 	          org-ref-insert-ref-function 'org-ref-insert-ref-link
    341 ;; 	          org-ref-cite-onclick-function (lambda (_) (org-ref-citation-hydra/body))))
    342 
    343 (use-package org-indent-mode
    344   :config
    345   (org-indent-mode t)
    346   :hook org-mode)
    347 
    348 (quelpa
    349  '(ox-thtml
    350    :fetcher git
    351    :url "https://github.com/Ma11ock/org-thtml"))
    352 
    353 (use-package org-bullets
    354   :ensure t)
    355 
    356 (use-package wc-mode
    357   :ensure t
    358   :hook org-mode)
    359 
    360 
    361 (use-package display-line-numbers-mode
    362   :hook (prog-mode org-mode LaTex-mode)
    363   :init
    364   (setq display-line-numbers-type 'relative))
    365 
    366 
    367 ;; Configuring LaTeX must be done like this because of legacy. 
    368 (use-package tex-mode
    369   :ensure auctex
    370   :init
    371   ;(require 'tex-buf)
    372   (use-package company-auctex
    373     :ensure t)
    374 
    375   (use-package auctex-latexmk
    376     :ensure t)
    377 
    378   :config
    379   (setq TeX-auto-save t)
    380   (setq TeX-parse-self t)
    381   (setq Tex-command-default "LatexMk")
    382   (setq-default TeX-master nil)
    383   (setq-default TeX-engine 'luatex)
    384   (setq-default TeX-PDF-mode t)
    385   (setq-default TeX-show-compilation nil)
    386   (setq-default TeX-process-asynchronous t)
    387                                         ;(setq-default TeX-save-query nil)
    388   (add-hook 'LaTeX-mode-hook #'flyspell-mode)
    389   (add-hook 'LaTeX-mode-hook #'wc-mode)
    390   (add-hook 'LaTeX-mode-hook #'company-auctex-init)
    391   (add-hook 'LaTeX-mode-hook #'company-mode)
    392   (add-hook 'LaTeX-mode-hook #'TeX-source-correlate-mode)
    393   (add-hook 'LaTeX-mode-hook #'TeX-interactive-mode)
    394   (add-hook 'after-save-hook #'(lambda ()
    395                                  (let* ((master-file (TeX-master-file)))
    396                                    (TeX-command "LatexMk" #'TeX-master-file))))
    397 
    398   (require 'auctex-latexmk)
    399   (auctex-latexmk-setup))
    400 
    401 #+End_src
    402 ** vterm
    403 #+BEGIN_SRC emacs-lisp
    404 (when (and module-file-suffix (not (eq system-type 'windows-nt)))
    405   (use-package vterm
    406     :ensure t
    407     :init (setq vterm-always-compile-module t)
    408     :bind (:map vterm-mode-map
    409                 ("M-c" . 'vterm-copy-mode)
    410                 ("M-i" . 'ido-switch-buffer))))
    411 
    412 #+END_SRC
    413 ** helm
    414 #+begin_src emacs-lisp
    415 
    416 (use-package helm
    417   :ensure t
    418   :init
    419   (helm-mode 1)
    420 
    421 
    422   (use-package helm-ag
    423     :ensure t)
    424   (use-package helm-unicode
    425     :ensure t)
    426   (use-package helm-xref
    427     :ensure t)
    428   (define-key global-map [remap find-file] #'helm-find-files)
    429   (define-key global-map [remap execute-extended-command] #'helm-M-x)
    430   (define-key global-map [remap switch-to-buffer] #'helm-mini)
    431   (define-key global-map (kbd "M-i") #'switch-to-buffer)
    432 
    433   (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
    434                                         ;(evil-define-key 'normal 'global (kbd "<leader>f") #'swiper)
    435                                         ;(evil-define-key 'normal 'global (kbd "<leader>cf") #'counsel-fzf)
    436                                         ;(evil-define-key 'normal 'global (kbd "<leader>co") #'counsel-find-file)
    437                                         ;(evil-define-key 'normal 'global (kbd "<leader>cdf") #'counsel-describe-function)
    438                                         ;(evil-define-key 'normal 'global (kbd "<leader>cds") #'counsel-describe-variable)
    439                                         ;(evil-define-key 'normal 'global (kbd "<leader>cdv") #'counsel-describe-symbol)
    440                                         ;(evil-define-key 'normal 'global (kbd "<leader>cdb") #'counsel-descbinds)
    441                                         ;(evil-define-key 'normal 'global (kbd "<leader>dl") #'counsel-info-lookup-symbol)
    442                                         ;(evil-define-key 'normal 'global (kbd "<leader>cg") #'counsel-git)
    443                                         ;(evil-define-key 'normal 'global (kbd "<leader>cG") #'counsel-grep)
    444   (evil-define-key 'normal 'global (kbd "<leader>ha") #'helm-ag)
    445   (evil-define-key 'normal 'global (kbd "<leader>hu") #'helm-unicode)
    446   (evil-define-key 'normal 'global (kbd "<leader>SPC") #'helm-M-x))
    447 ;; General ivy
    448 ;;(global-set-key (kbd "M-i") 'ivy-switch-buffer))
    449 
    450 #+end_src
    451 * IDE
    452 ** Prettify
    453 #+begin_src emacs-lisp
    454 
    455 (use-package format-all
    456 :ensure t)
    457 
    458 #+end_src
    459 ** Haskell
    460 #+begin_src emacs-lisp
    461 (use-package haskell-mode
    462 :ensure t)
    463 
    464 (use-package haskell-snippets
    465 :ensure t)
    466 
    467 (use-package haskell-tab-indent
    468 :ensure t)
    469 #+end_src
    470 ** LSP
    471 #+begin_src emacs-lisp
    472 (use-package lsp-mode
    473   :ensure t
    474   :init
    475 
    476   (setq gc-cons-threshold (* 100 1024 1024)
    477         read-process-output-max (* 1024 1024)
    478         treemacs-space-between-root-nodes nil
    479         company-idle-delay 0.0
    480         company-minimum-prefix-length 1
    481         lsp-idle-delay 0.1)  ;; clangd is fast
    482 
    483   (with-eval-after-load 'lsp-mode
    484     (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration)
    485     (require 'dap-cpptools)
    486     (yas-global-mode))
    487 
    488   ;; optional if you want which-key integration
    489   (use-package which-key
    490     :ensure t
    491     :config
    492     (which-key-mode))
    493   ;; optionally
    494   (use-package lsp-ui :commands lsp-ui-mode :ensure t)
    495 
    496   ;; optionally if you want to use debugger
    497   (use-package dap-mode
    498     :ensure t)
    499   (require 'dap-gdb-lldb)
    500   (dap-gdb-lldb-setup)
    501 
    502   (use-package lsp-treemacs
    503     :ensure t)
    504   ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
    505   (setq lsp-keymap-prefix "C-c l")
    506   :hook ((c-mode c++-mode) . lsp)
    507   :commands lsp)
    508 
    509 ;; (use-package dap-LANGUAGE) to load the dap adapter for your language
    510 
    511 #+end_src
    512 ** YAML
    513 #+begin_src emacs-lisp
    514 
    515 (use-package yaml-mode
    516 :ensure t)
    517 
    518 #+end_src
    519 ** flutter
    520 #+begin_src emacs-lisp
    521 (use-package dart-mode
    522   :ensure t
    523   :init
    524   (with-eval-after-load 'projectile
    525     (add-to-list 'projectile-project-root-files-bottom-up "pubspec.yaml")
    526     (add-to-list 'projectile-project-root-files-bottom-up "BUILD"))
    527 
    528   (setq gc-cons-threshold (* 100 1024 1024)
    529         read-process-output-max (* 1024 1024)
    530         company-minimum-prefix-length 1
    531         lsp-lens-enable t
    532         lsp-signature-auto-activate nil)
    533   (use-package flutter
    534     :ensure t
    535     :after dart-mode
    536     :bind (:map dart-mode-map
    537                 ("s-f" . #'flutter-run-or-hot-reload))
    538     :custom
    539     (if (eq system-type 'windows-nt)
    540         (flutter-sdk-path "C:\\Users\\Ryan\\Documents\\flutter\\bin")
    541       (flutter-sdk-path "/opt/flutter/bin")))
    542 
    543   (use-package lsp-dart
    544     :ensure t
    545     :hook dart-mode)
    546 
    547   (use-package hover
    548     :ensure t
    549     :hook dart-mode)
    550 
    551   (setq gc-cons-threshold (* 100 1024 1024)
    552         read-process-output-max (* 1024 1024)
    553         company-minimum-prefix-length 1
    554         lsp-lens-enable t
    555         lsp-signature-auto-activate nil))
    556 
    557 #+end_src
    558 ** Clojure 
    559 #+begin_src emacs-lisp
    560  (use-package cider
    561   :ensure t
    562   :bind (:map cider-mode-map
    563               ("M-e" . cider-eval-last-sexp)
    564               ("M-r" . cider-eval-region)
    565               )
    566   :init
    567   (eval-after-load "cider-mode"
    568     '(define-key cider-mode-map (kbd "C-x") 'joe-nextword)))
    569 
    570 (use-package clojure-mode
    571   :ensure t)
    572 #+end_src
    573 ** all programming languages
    574 *** company
    575 #+begin_src emacs-lisp
    576 (use-package company
    577   :ensure t
    578   :init (add-hook 'prog-mode-hook 'company-mode)
    579   :bind (:map company-active-map
    580               ("C-n" . company-select-next)
    581               ("C-p" . company-select-previous))
    582   :config
    583   (setq company-idle-delay 0.3)
    584   (setq company-tooltip-align-annotations t) ; aligns annotation to the right hand side
    585   (setq company-minimum-prefix-length 1)
    586   (setq company-clang-arguments '("-std=c++17"))
    587   (use-package company-c-headers
    588     :ensure t
    589     :init
    590     (add-to-list 'company-backends 'company-c-headers)))
    591 #+end_src
    592 *** flycheck
    593 #+begin_src emacs-lisp
    594 (use-package flycheck
    595   :ensure t)
    596 
    597 #+end_src
    598 
    599 ** magit
    600 #+begin_src emacs-lisp
    601 (use-package with-editor
    602 :ensure t)
    603 
    604 (use-package magit
    605   :ensure t
    606   :init
    607   (add-hook 'diff-mode-hook #'whitespace-mode)
    608   (add-hook 'git-commit-setup-hook #'git-commit-turn-on-flyspell))
    609 
    610 #+end_src
    611 ** Misc
    612 #+BEGIN_SRC emacs-lisp
    613 (defun insert-current-date ()
    614   (interactive)
    615   (insert (shell-command-to-string "echo -n $(date +%Y-%m-%d)")))
    616 
    617 (use-package git-modes
    618   :ensure t
    619   :init
    620   (add-to-list 'auto-mode-alist '("\\.gitignore\\'" . gitignore-mode)) )
    621 
    622 (use-package rainbow-mode
    623   :ensure t
    624   :hook (web-mode emacs-lisp-mode))
    625 
    626 (use-package crontab-mode
    627   :ensure t)
    628 
    629 (add-hook 'prog-mode-hook #'flyspell-prog-mode) ; Flyspell on comments and strings.
    630 
    631 (use-package cmake-mode
    632   :ensure t
    633   :hook (cmake-mode . lsp-deferred))
    634 
    635 (use-package cmake-font-lock
    636   :ensure t
    637   :after cmake-mode
    638   :config (cmake-font-lock-activate))
    639 
    640 (use-package etc-sudoers-mode
    641   :ensure t)
    642 
    643 #+END_SRC
    644 ** html 
    645 #+BEGIN_SRC emacs-lisp
    646 (use-package web-mode
    647   :ensure t
    648   :config
    649   (add-to-list 'auto-mode-alist '("\\.api\\'" . web-mode))
    650   (add-to-list 'auto-mode-alist '("/some/react/path/.*\\.js[x]?\\'" . web-mode))
    651 
    652   (setq web-mode-markup-indent-offset 2)
    653   (setq web-mode-css-indent-offset 2)
    654   (setq web-mode-code-indent-offset 2)
    655   (setq web-mode-engines-alist
    656         '(("php"    . "\\.phtml\\'")
    657           ("blade"  . "\\.blade\\.")
    658           ("handlebars" . "\\.handlebars\\'")))
    659 
    660   (setq web-mode-content-types-alist
    661         '(("json" . "/some/path/.*\\.api\\'")
    662           ("xml"  . "/other/path/.*\\.api\\'")
    663           ("jsx"  . "/some/react/path/.*\\.js[x]?\\'")))
    664   (setq web-mode-markup-indent-offset 2)
    665   (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
    666   (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
    667   (add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
    668   (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
    669   (add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
    670   (add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
    671   (add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
    672   (add-to-list 'auto-mode-alist '("\\.css\\'" . web-mode))
    673   (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
    674   (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode))
    675   (define-key web-mode-map (kbd "C-n") 'web-mode-tag-match)
    676   (setq web-mode-enable-current-column-highlight t)
    677   (setq web-mode-enable-current-element-highlight t)
    678   (setq web-mode-enable-auto-closing t))
    679 
    680 (use-package impatient-mode
    681   :ensure t
    682   :hook web-mode)
    683 
    684 #+END_SRC
    685 *** Emmet
    686 #+BEGIN_SRC emacs-lisp
    687 
    688 (use-package emmet-mode
    689   :ensure t
    690   :config
    691   (define-key web-mode-map (kbd "C-j") 'emmet-expand-line)
    692   (emmet-mode)
    693                                         ;      (emmet-preview-mode)
    694   :hook web-mode)
    695 
    696 #+END_SRC
    697 
    698 ** C 
    699 #+begin_src emacs-lisp
    700 
    701 (use-package cc-mode
    702   :config
    703   (setq c-default-style "java"
    704         c-basic-offset 4)
    705   (c-set-offset 'inline-open '0))
    706 
    707 
    708 #+end_src
    709 ** JavaScript
    710 #+begin_src emacs-lisp
    711 (setq js-indent-level 2)
    712 (use-package json-mode
    713   :ensure t)
    714 ;; Typescript
    715 (use-package typescript-mode
    716   :ensure t)
    717 #+end_src
    718 ** Python
    719 #+begin_src emacs-lisp
    720 (use-package elpy
    721   :ensure t
    722   :init
    723   (add-hook 'python-mode-hook #'(lambda ()
    724                                   (elpy-enable)
    725                                   (when (require 'flycheck nil t)
    726                                     (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
    727                                     (add-hook 'elpy-mode-hook 'flycheck-mode)))))
    728 
    729 (use-package blacken
    730   :ensure t)
    731 
    732 (use-package py-autopep8
    733   :ensure t
    734   :init
    735   (add-hook 'elpy-mode-hook #'py-autopep8-enable-on-save))
    736 #+end_src
    737 ** golang
    738 #+begin_src emacs-lisp
    739 (use-package go-mode
    740 :ensure t
    741 :init
    742 (add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode))
    743 (add-hook 'go-mode-hook 'lsp-deferred)
    744 (add-hook 'before-save-hook 'gofmt-before-save))
    745 #+end_src
    746 ** gdscript
    747 #+begin_src emacs-lisp
    748 (use-package gdscript-mode
    749   :ensure t
    750   :init
    751   (defun lsp--gdscript-ignore-errors (original-function &rest args)
    752     "Ignore the error message resulting from Godot not replying to the `JSONRPC' request."
    753     (if (string-equal major-mode "gdscript-mode")
    754         (let ((json-data (nth 0 args)))
    755           (if (and (string= (gethash "jsonrpc" json-data "") "2.0")
    756                    (not (gethash "id" json-data nil))
    757                    (not (gethash "method" json-data nil)))
    758               nil ; (message "Method not found")
    759             (apply original-function args)))
    760       (apply original-function args)))
    761   ;; Runs the function `lsp--gdscript-ignore-errors` around `lsp--get-message-type` to suppress unknown notification errors.
    762   (advice-add #'lsp--get-message-type :around #'lsp--gdscript-ignore-errors)
    763   (setq gdscript-godot-executable "/usr/bin/godot")
    764   (setq gdscript-use-tab-indents nil)
    765   (setq gdscript-indent-offset 4)
    766   (setq gdscript-docs-local-path "/home/ryan/Documents/godot-docs/_build/html/")
    767   :config
    768   (auto-revert-mode))
    769 #+end_src
    770 ** glsl
    771 #+begin_src emacs-lisp
    772 
    773 (use-package glsl-mode
    774   :ensure t)
    775 
    776 #+end_src
    777 ** gradle
    778 #+begin_src emacs-lisp
    779 (use-package gradle-mode
    780 :ensure t)
    781 
    782 (use-package groovy-mode
    783 :ensure t)
    784 #+end_src
    785 ** Lua
    786 #+begin_src emacs-lisp
    787 
    788 (use-package lua-mode
    789 :ensure t)
    790 
    791 #+end_src
    792 * Text-editor
    793 ** spellcheck
    794 #+BEGIN_SRC emacs-lisp
    795 
    796 (setq ispell-program-name (executable-find "hunspell"))
    797 (setq ispell-local-dictionary "en_US")
    798 (setq ispell-local-dictionary-alist
    799       '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil nil nil utf-8)))
    800 
    801 (add-hook 'org-mode-hook 'flyspell-mode)
    802 
    803 #+END_SRC
    804 ** sudo edit
    805 #+BEGIN_SRC emacs-lisp
    806 
    807 (defun er-doas-edit (&optional arg)
    808   "Edit currently visited file as root With a prefix ARG prompt for a file to visit.  Will also prompt for a file to visit if current buffer is not visiting a file."
    809   (interactive "P")
    810   (if (or arg (not buffer-file-name))
    811       (find-file (concat "/doas:root@localhost:"
    812                          (ido-read-file-name "Find file(as root): ")))
    813     (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
    814 
    815 
    816 
    817 (defun er-sudo-edit (&optional arg)
    818   "Edit currently visited file as root With a prefix ARG prompt for a file to visit.  Will also prompt for a file to visit if current buffer is not visiting a file."
    819   (interactive "P")
    820   (if (or arg (not buffer-file-name))
    821       (find-file (concat "/sudo:root@localhost:"
    822                          (ido-read-file-name "Find file(as root): ")))
    823     (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
    824 
    825 
    826 #+END_SRC
    827 ** misc
    828 #+BEGIN_SRC emacs-lisp
    829 
    830 ;; tell emacs not to use the clipboard
    831                                         ;(setq x-select-enable-clipboard nil)
    832 ;; Left-to-right by default for slight performance increase.
    833 (setq-default bidi-paragraph-direction 'left-to-right)
    834 (setq bidi-inhibit-bpa t)
    835 ;; For slight performance increase with long lines.
    836 (global-so-long-mode 1)
    837 
    838 ;; For asynchronous.
    839 (use-package async
    840   :ensure t)
    841 
    842 (use-package emojify
    843 :ensure t)
    844 #+END_SRC
    845 ** snippets
    846 #+begin_src emacs-lisp
    847 (use-package yasnippet
    848   :ensure t
    849   :init
    850   (require 'yasnippet)
    851   (yas-reload-all)
    852   (add-hook 'prog-mode-hook #'yas-minor-mode))
    853 
    854 (use-package yasnippet-snippets
    855   :ensure t)
    856 #+end_src
    857 * emacs-os
    858 #+begin_src emacs-lisp
    859 (when 
    860     (or (string= system-name "arlen") (string= system-name "Springfield"))
    861   (require 'ryan-os))
    862 #+end_src
    863 
    864