#+title: Emacs Tool Setup * Vi Keybindings Use =vi= keybindings with =evil=. Set the undo system to =undo-fu=. Wrapped lines can be moved between with =j= and =k=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package evil :init (setq evil-want-keybinding nil) :config (evil-mode) (evil-global-set-key 'motion "j" 'evil-next-visual-line) (evil-global-set-key 'motion "k" 'evil-previous-visual-line) (evil-global-set-key 'motion (kbd "RET") nil) :custom (evil-undo-system 'undo-fu)) #+end_src Use =evil-collection= to include =vi= keybindings in extra modes. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package evil-collection :after evil :config (evil-collection-init)) #+end_src * Undo Better undo with =undo-fu=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package undo-fu) #+end_src Make undo persistent when closing Emacs with =undo-fu-session=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package undo-fu-session :init (undo-fu-session-global-mode 1)) #+end_src * Lookup Better lookup with =dumb-jump=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package dumb-jump :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)) #+end_src * Version Control Install Magit for Git integration. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package magit) #+end_src * Remote Editing #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (setq tramp-default-method "ssh") #+end_src * Document Viewing Replace =DocView= with a better document viewer from =pdf-tools=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package pdf-tools :config (pdf-tools-install) :init (add-hook 'pdf-view-mode-hook #'(lambda () (display-line-numbers-mode -1))) (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) :config (setq TeX-view-program-selection '((output-pdf "PDF Tools")) TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view)) TeX-source-correlate-start-server t)) #+end_src Save place in PDFs with =saveplace-pdf-view=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package saveplace-pdf-view :config (save-place-mode 1)) #+end_src * Org-Mode Ensure that =org= is set up before any of this. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package org) #+end_src Set my =org-mode= directory. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (setq org-directory "~/org") #+end_src Hide emphasis markers because I can see if something is *bold*, /italic/, or =monospace= without needing to see the markers. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (setq org-hide-emphasis-markers t) #+end_src Set up nicer looking bullet points. - they look like circles - instead of hyphens #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (font-lock-add-keywords 'org-mode '(("^ *\\([-]\\) " (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) #+end_src Set up fonts. Don't use =monospace= by default. Do use it where necessary though. Also, make different heading levels different sizes. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (add-hook 'org-mode-hook 'variable-pitch-mode) (custom-set-faces `(variable-pitch ((t :font ,jj/var-font))) `(fixed-pitch ((t :font ,jj/mono-font))) '(org-block ((t (:inherit fixed-pitch)))) '(org-code ((t (:inherit (shadow fixed-pitch))))) '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch))))) '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch))))) '(org-verbatim ((t (:inherit (shadow fixed-pitch))))) '(org-table ((t (:inherit (shadow fixed-pitch))))) '(org-document-title ((t (:inherit title :height 2.0 :underline nil)))) '(org-level-1 ((t (:inherit outline-1 :weight: bold :height 1.75)))) '(org-level-2 ((t (:inherit outline-2 :weight: bold :height 1.5)))) '(org-level-2 ((t (:inherit outline-3 :weight: bold :height 1.25)))) '(org-level-2 ((t (:inherit outline-4 :weight: bold :height 1.1)))) '(org-level-4 ((t (:inherit outline-4 :height 1.1)))) '(org-level-5 ((t (:inherit outline-5 :height 1.0)))) ) #+end_src Wrap lines and centre the view to make for a nicer reading experience. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package visual-fill-column) (add-hook 'org-mode-hook 'visual-line-mode) (add-hook 'org-mode-hook #'(lambda () (display-line-numbers-mode -1))) (defun jj/org-mode-visual-fill () (setq visual-fill-column-width 100 visual-fill-column-center-text t) (visual-fill-column-mode 1)) (add-hook 'org-mode-hook #'jj/org-mode-visual-fill) #+end_src Increase the size of LaTeX previews. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0)) #+end_src Follow links with the return key. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (setq org-return-follows-link t) #+end_src Tangle on save. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (defun org-babel-tangle-config () (when (string-suffix-p ".org" (buffer-file-name)) (org-babel-tangle))) (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'org-babel-tangle-config))) #+end_src Enable Org Crypt. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (org-crypt-use-before-save-magic) (setq org-tags-exclude-from-inheritance '("crypt")) (setq org-crypt-key nil) (setq auto-save-default nil) #+end_src * Shell Use =eshell= as an integrated shell. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package eshell) (global-set-key (kbd "C-c e") 'eshell) #+end_src * Language Servers Add =eglot= keybindings. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (global-set-key (kbd "C-c r") 'eglot-rename) (global-set-key (kbd "C-c a") 'eglot-code-actions) #+end_src Install =tree-sitter=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package tree-sitter) (use-package tree-sitter-langs) #+end_src Define function to set up =eglot= automatically. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (defun jj/eglot-setup () (eglot-ensure) (tree-sitter-mode 1) (tree-sitter-hl-mode 1)) #+end_src * Completions Use company for completions with no delay, starting immediately after first character is typed. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package company :config (add-hook 'after-init-hook 'global-company-mode) (setq company-idle-delay 0 company-minimum-prefix-length 1 company-selection-wrap-around t)) #+end_src Use =vertico= as a completion user interface. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package vertico :custom (vertico-cycle t) :init (vertico-mode)) #+end_src Use =orderless= to allow typing any portion of a word that you want to search for. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package orderless :ensure t :custom (completion-styles '(orderless basic)) (completion-category-overrides '((file (styles basic partial-completion))))) #+end_src Get descriptions of items in =vertico= with =marginalia=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package marginalia :bind (:map minibuffer-local-map ("M-A" . marginalia-cycle)) :init (marginalia-mode)) #+end_src Get nerd font icons in completions. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package nerd-icons-completion :config (nerd-icons-completion-mode)) #+end_src Use consult with =vertico= for extra functionality to various functions. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package consult :bind ( ("C-c M-x" . consult-mode-command) ("C-c h" . consult-history) ("C-c k" . consult-kmacro) ("C-c m" . consult-man) ("C-c i" . consult-info) ([remap Info-search] . consult-info) ("C-x M-:" . consult-complex-command) ("C-x b" . consult-buffer) ("C-x 4 b" . consult-buffer-other-window) ("C-x 5 b" . consult-buffer-other-frame) ("C-x t b" . consult-buffer-other-tab) ("C-x r b" . consult-bookmark) ("C-x p b" . consult-project-buffer) ("M-#" . consult-register-load) ("M-'" . consult-register-store) ("C-M-#" . consult-register) ("M-y" . consult-yank-pop) ("M-g e" . consult-compile-error) ("M-g f" . consult-flycheck) ("M-g g" . consult-goto-line) ("M-g M-g" . consult-goto-line) ("M-g o" . consult-outline) ("M-g m" . consult-mark) ("M-g k" . consult-global-mark) ("M-g i" . consult-imenu) ("M-g I" . consult-imenu-multi) ("M-s d" . consult-fd) ("M-s c" . consult-locate) ("M-s g" . consult-grep) ("M-s G" . consult-git-grep) ("M-s r" . consult-ripgrep) ("M-s l" . consult-line) ("M-s L" . consult-line-multi) ("M-s k" . consult-keep-lines) ("M-s u" . consult-focus-lines) ("M-s e" . consult-isearch-history) :map isearch-mode-map ("M-e" . consult-isearch-history) ("M-s e" . consult-isearch-history) ("M-s l" . consult-line) ("M-s L" . consult-line-multi) :map minibuffer-local-map ("M-s" . consult-history) ("M-r" . consult-history)) :hook (completion-list-mode . consult-preview-at-point-mode) :init (setq register-preview-delay 0.5 register-preview-function #'consult-register-format) (advice-add #'register-preview :override #'consult-register-window) (setq xref-show-xrefs-function #'consult-xref xref-show-definitions-function #'consult-xref) :config (consult-customize consult-theme :preview-key '(:debounce 0.2 any) consult-ripgrep consult-git-grep consult-grep consult-bookmark consult-recent-file consult-xref consult--source-bookmark consult--source-file-register consult--source-recent-file consult--source-project-recent-file :preview-key '(:debounce 0.4 any)) (setq consult-narrow-key "<")) #+end_src Use Flycheck for syntax checking. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package flycheck :config (add-hook 'after-init-hook #'global-flycheck-mode)) #+end_src Use Flyspell for spell checking. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (dolist (hook '(text-mode-hook)) (add-hook hook (lambda () (flyspell-mode 1)))) (use-package flyspell-correct :after flyspell :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))) #+end_src * Snippets Use =yasnippet= for snippets so I don't need to type as much. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package yasnippet :init (yas-global-mode 1) :config (global-set-key (kbd "C-c s") 'yas-insert-snippet)) #+end_src Install snippet collection for =yasnippet=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package yasnippet-snippets) #+end_src * Formatting Automatically format with Apheleia and =clang-format=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package apheleia :init (apheleia-global-mode +1)) (use-package clang-format) #+end_src * RSS Use Emacs as an RSS feed with =elfeed=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package elfeed :config (global-set-key (kbd "C-c f") 'elfeed) (global-set-key (kbd "C-c M-f") 'elfeed-update)) #+end_src Make =elfeed= more powerful with =elfeed-goodies=. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package elfeed-goodies :after elfeed :config (elfeed-goodies/setup)) #+end_src Store my feed in Org-mode [[./feed.org][here]]. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package elfeed-org :config (elfeed-org) (setq rmh-elfeed-org-files (list "~/.config/emacs/feed.org"))) #+end_src * Deft Use the Deft package to manage notes. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package deft :config (global-set-key (kbd "C-c d") 'deft) (setq deft-directory "~/notes/" deft-default-extension "org")) #+end_src * Reference Management Use Biblio and Citar to manage citations. #+begin_src emacs-lisp :tangle ~/.config/emacs/tools.el :mkdirp yes (use-package biblio) (use-package citar :custom (citar-bibliography '("~/bib/references.bib")) :hook (LaTeX-mode . citar-capf-setup) (org-mode . citar-capf-setup)) (use-package citar-embark :after citar embark :no-require :config (citar-embark-mode)) #+end_src