MEGUMACS @dotfiles @emacs
Doom-like emacs config with a teensy tiny bit of weeb.
Table of Contents
- Introduction
- Installation
- Bootstrap
- Font
- Themes
- Appearance
- Modeline
- Dashboard
- Auto Completion
- Evil
- Calendar
- Org-mode
- Keybindings
- Source Control
- Encryption
- File Management
- Project Management
- Syntax Checking
- Language Modes
- Language Server Protocol
- Buffers and Windows
- Navigation
- Editing
- Templates
- Discord Presence
Introduction
Installation
- Clone into .emacs.d:
$ git clone https://github.com/b-coimbra/.emacs.d.git ~/.emacs.d
- Install nerd-icons fonts:
M-x nerd-icons-install-fonts
- Install ligatures font (Fira Code Symbol):
M-x fira-code-mode-install-fonts
- Install emoji font (Noto Emoji) for Linux
- Install language servers manually or with
M-x lsp-install-server
Bootstrap
Globals
Global variables to easily customize portions of Megumacs.
(setq globals--banner-path "etc/banners/megumacs.png" ; Banner image path shown in the dashboard globals--font "Fantasque Sans Mono 11" ; Font family and font size globals--theme 'mirwood ; Theme used by Emacs. globals--email "b-coimbra@hotmail.com" ; Email for GPG encryption globals--leader-key "<SPC>" ; Leader prefix key used for most bindings )
Better defaults
Disable mouse and tooltips:
(when window-system (blink-cursor-mode 0) ; Disable the cursor blinking (scroll-bar-mode 0) ; Disable the scroll bar (tool-bar-mode 0) ; Disable the tool bar (tooltip-mode 0)) ; Disable the tooltips
General better defaults:
(setq-default ad-redefinition-action 'accept ; Silence warnings for redefinition auto-window-vscroll nil ; Lighten vertical scroll confirm-kill-emacs 'yes-or-no-p ; Confirm before exiting Emacs cursor-in-non-selected-windows nil ; Hide the cursor in inactive windows delete-by-moving-to-trash t ; Delete files to trash display-time-default-load-average nil ; Don't display load average display-time-format "%H:%M" ; Format the time string fill-column 80 ; Set width for automatic line breaks help-window-select t ; Focus new help windows when opened indent-tabs-mode nil ; Use tabs to indent inhibit-startup-screen t ; Disable start-up screen initial-scratch-message "" ; Empty the initial *scratch* buffer mouse-yank-at-point t ; Yank at point rather than pointer ns-use-srgb-colorspace nil ; Don't use sRGB colors select-enable-clipboard t ; Merge system's and Emacs' clipboard sentence-end-double-space nil ; End a sentence after a dot and a space show-help-function nil ; Disable help messages show-trailing-whitespace t ; Display trailing whitespaces split-height-threshold nil ; Disable vertical window splitting split-width-threshold nil ; Disable horizontal window splitting tab-width 4 ; Set width for tabs uniquify-buffer-name-style 'forward ; Uniquify buffer names window-combination-resize t ; Resize windows proportionally x-stretch-cursor t ; Stretch cursor to the glyph width delete-old-versions -1 ; Delete excess backup versions silently version-control t ; Use version control ring-bell-function 'ignore ; Silent bell when you make a mistake inhibit-compacting-font-caches t ; Faster navigation point (costs more memory) recentf-mode t ; Keep recent files make-backup-files nil ; Stop creating backup files display-line-numbers-type 'relative ; Use relative line numbers vc-follow-symlinks t ; When the symlink points to a version-controlled file use-default-font-for-symbols nil ; Do not use the frame font when rendering emojis frame-inhibit-implied-resize nil) ; Don't ask for confirmation when opening symlinked file (cd "~/") ; Move to the user directory (global-display-line-numbers-mode t) ; Enable line numbers globally (delete-selection-mode 1) ; Replace region when inserting text (display-time-mode 1) ; Enable time in the mode-line (global-auto-revert-mode 1) ; Automatically revert a buffer when it changes on disk (fringe-mode '(8 . 0)) ; Enable fringe on the left for git-gutter-fringe+ (electric-pair-mode t) ; Enable Matching delimeters (electric-indent-mode t) ; Auto indentation (fset 'yes-or-no-p 'y-or-n-p) ; Replace yes/no prompts with y/n (global-subword-mode 1) ; Iterate through CamelCase words (menu-bar-mode 0) ; Disable the menu bar (mouse-avoidance-mode 'jump) ; Avoid collision of mouse with point (put 'downcase-region 'disabled nil) ; Enable downcase-region (put 'upcase-region 'disabled nil) ; Enable upcase-region (show-paren-mode 1) ; Highlight matching parenthesis
Enable fullscreen.
(if (eq window-system 'ns) (toggle-frame-maximized) (toggle-frame-fullscreen))
Garbage collection on focus-out, Emacs should feel snappier.
(add-hook 'focus-out-hook #'garbage-collect)
Remove trailing whitespace on save:
(add-hook 'before-save-hook 'delete-trailing-whitespace)
Default to utf-8 encoding.
(set-default-coding-systems 'utf-8) (set-language-environment "UTF-8") (prefer-coding-system 'utf-8) (set-terminal-coding-system 'utf-8)
Load .custom.el
One is able to use the customization interface that is bundled within Emacs. It
is meant to help people who are not familiar with Emacs Lisp in the
configuration of Emacs itself. By default, changes in the customization will be
automatically detected and appended at the end of the configuration file,
init.el
.
Since that in my case, the actual configuration file is a new one, crafted by
org-mode
, adding code at the end of init.el
might mess things up. The
following tells Emacs to add extra code in another file that would be then
loaded, if existing.
(setq-default custom-file (expand-file-name "etc/.custom.el" user-emacs-directory)) (when (file-exists-p custom-file) (load custom-file))
Load config.el
Whenever the base core.org
file is updated, all the custom user settings are wiped out.
To prevent this, the user may define permanent settings in the config.org
file.
(setq-default userconfig-file (expand-file-name "config.el" user-emacs-directory)) (when (file-exists-p userconfig-file) (load userconfig-file))
Load custom themes
Custom themes location.
(add-to-list 'custom-theme-load-path (expand-file-name "etc/themes/" user-emacs-directory))
No littering
Keep ~/.emacs.d
clean.
(use-package no-littering :straight t :demand t)
Performance
(use-package gcmh :demand t :straight t :config (gcmh-mode 1))
Utilities
(defun open-config-file () (interactive) (find-file (expand-file-name "core.org" user-emacs-directory)))
Font
Font family used by Emacs.
Nice looking fonts:
- Iosevka (size 12)
- Fira Code (size 12)
- Fantasque Sans (size 11)
- JetBrains Mono (size 10, 11)
(set-face-attribute 'default nil :font globals--font) (set-frame-font globals--font nil t)
Ligatures
Rip off only the ligatures from the Fira Code font using the fira-code-mode minor mode.
Requires installation of the Fira Code Regular Symbol font with M-x fira-code-mode-install-fonts
(use-package fira-code-mode :straight t :demand t :hook prog-mode :custom (fira-code-mode-disabled-ligatures '("[]" ":" "x")) :config (fira-code-mode-set-font))
Emoji
Set up emoji rendering, requires installation of the Noto Emoji font for Linux.
;; Default Windows emoji font (when (member "Segoe UI Emoji" (font-family-list)) (set-fontset-font t 'symbol (font-spec :family "Segoe UI Emoji") nil 'prepend) (set-fontset-font "fontset-default" '(#xFE00 . #xFE0F) "Segoe UI Emoji")) ;; Linux emoji font (when (member "Noto Color Emoji" (font-family-list)) (set-fontset-font t 'symbol (font-spec :family "Noto Color Emoji") nil 'prepend) (set-fontset-font "fontset-default" '(#xFE00 . #xFE0F) "Noto Color Emoji"))
Themes
Autothemer
Conveniently create Emacs themes.
(use-package autothemer :straight t)
Mirwood theme
A pleaseant theme with earthy colors.
(straight-use-package '(emacs-mirwood-theme :type git :host github :repo "b-coimbra/emacs-mirwood-theme"))
Kaolin themes
Set of eye pleasing themes for GNU Emacs. Supports both GUI and terminal.
(use-package kaolin-themes :defer 5 :straight t :custom (kaolin-themes-bold t) (kaolin-themes-italic t) (kaolin-themes-underline t) (kaolin-themes-distinct-company-scrollbar t))
Doom themes
An opinionated pack of modern color-themes
(use-package doom-themes :straight t :demand t :custom (doom-themes-enable-bold t) (doom-themes-enable-italic t) (doom-themes-treemacs-enable-variable-pitch nil) :config (load-theme globals--theme t) (doom-themes-treemacs-config))
Theme customization
Persistent theme customization.
(set-face-attribute 'font-lock-keyword-face nil :weight 'bold)
Appearance
Solaire mode
Gives other windows slightly different background colors (brightness).
(use-package solaire-mode :straight t :hook (after-init . solaire-global-mode))
Rainbow-mode
Colorize color names in buffers.
(use-package rainbow-mode :straight t :hook prog-mode :config (rainbow-mode))
Rainbow delimiters
"Rainbow parentheses"-like mode which highlights delimiters such as parentheses, brackets or braces according to their depth.
(use-package rainbow-delimiters :straight t :hook (prog-mode . rainbow-delimiters-mode))
All the icons
A utility package to collect various Icon Fonts and propertize them within Emacs.
(use-package all-the-icons :straight t :if (display-graphic-p))
Modeline
Doom-modeline
A fancy and fast mode-line inpsired by minimalism design.
(use-package doom-modeline :straight t :init (doom-modeline-mode) :custom (doom-modeline-major-mode-icon nil) (doom-modeline-major-mode-color-icon nil) (doom-modeline-icon (display-graphic-p)) (doom-modeline-modal-modern-icon nil) (doom-modeline-buffer-modification-icon nil) (doom-modeline-flycheck-icon nil) (doom-modeline-checker-simple-format t) (doom-modeline-buffer-encoding nil) (doom-modeline-height 35))
Spaceline
Powerline theme from Spacemacs.
(use-package spaceline :disabled t :straight t :init (progn (setq spaceline-highlight-face-func 'spaceline-highlight-face-evil-state) (setq-default powerline-default-separator 'slant) ) :config (spaceline-emacs-theme) (setq spaceline-buffer-encoding-abbrev-p nil spaceline-workspace-number-p t spaceline-window-numbers-unicode nil spaceline-version-control-p nil spaceline-minor-modes-p nil spaceline-major-mode-p nil spaceline-buffer-size-p t spaceline-window-number-p t spaceline-buffer-id-p t spaceline-bufFer-size-p t) (powerline-reset))
Dashboard
emacs-dashboard
An extensible emacs startup screen showing you what’s most important.
(use-package dashboard :straight t :demand t :init (add-hook 'dashboard-mode-hook (lambda () (setq show-trailing-whitespace nil))) :custom (dashboard-banner-logo-title "[M E G U M A C S]") (dashboard-startup-banner (expand-file-name globals--banner-path user-emacs-directory)) (dashboard-footer-messages '("EXPLOOOOOOOOOOSIONNN!")) (dashboard-footer-icon (nerd-icons-wicon "nf-weather-meteor" :height 1.5 :v-adjust 0.0 :face 'font-lock-keyword-face)) (dashboard-center-content t) (dashboard-set-heading-icons t) (dashboard-set-file-icons t) (dashboard-set-navigator t) (dashboard-navigator-buttons `( ;; Links ((,(nerd-icons-codicon "nf-cod-octoface" :height 1.3 :v-adjust 0.0) "Homepage" "Browse homepage" (lambda (&rest _) (browse-url "https://github.com/b-coimbra/.emacs.d")) nil "" " |") (,(nerd-icons-faicon "nf-fa-refresh" :height 1.3 :v-adjust 0.0) "Update" "Update Megumacs" (lambda (&rest _) (straight-pull-all)) warning "" " |") (,(nerd-icons-faicon "nf-fa-flag" :height 1.3 :v-adjust 0.0) nil "Report a BUG" (lambda (&rest _) (browse-url "https://github.com/b-coimbra/.emacs.d/issues/new")) error "" "")) ;; Empty line (("" "\n" "" nil nil "" "")) ;; Keybindings ((,(nerd-icons-faicon "nf-fa-search" :height 1.1 :v-adjust -0.1) " Find file" nil (lambda (&rest _) (counsel-find-file)) nil "" " SPC f f")) ((,(nerd-icons-octicon "nf-oct-file_directory" :height 1.1 :v-adjust -0.1) " Open project" nil (lambda (&rest _) (counsel-projectile-switch-project)) nil "" " SPC p p")) ((,(nerd-icons-codicon "nf-cod-three_bars" :height 1.1 :v-adjust -0.1) " File explorer" nil (lambda (&rest _) (counsel-projectile-switch-project)) nil "" " SPC t t")) ((,(nerd-icons-codicon "nf-cod-settings" :height 1.1 :v-adjust -0.1) " Open settings" nil (lambda (&rest _) (open-config-file)) nil "" " SPC f P")) )) :config (dashboard-setup-startup-hook))
Auto Completion
Company
Modular in-buffer completion framework.
(use-package company :defer 0.5 :straight t :delight :init (global-company-mode) :custom (company-begin-commands '(self-insert-command)) (company-minimum-prefix-length 2) (company-idle-delay 0.1) (company-show-numbers t) (company-tooltip-align-annotations t) :config (add-to-list 'company-backends '(company-yasnippet company-files company-keywords company-capf company-dabbrev company-dabbrev-code)))
company-jedi
Company backend for Python jedi.
(use-package company-jedi :straight t :after company :init (add-to-list 'company-backends 'company-jedi) :config (setq jedi:setup-keys t) (setq jedi:complete-on-dot t))
Evil
Evil is an extensible vi layer for Emacs. It emulates the main features of Vim, and provides facilities for writing custom extensions.
evil-mode
Base package for evil-mode
(use-package evil :straight t :demand t :init (setq evil-want-keybinding nil evil-want-integration t) :custom (evil-want-C-u-scroll t) (evil-want-C-i-jump t) :config (evil-mode 1) (evil-set-undo-system 'undo-redo))
evil-escape
Unfortunately we need a separate package to handle custom <ESC> key sequences.
(use-package evil-escape :straight t :defer 1 :custom (evil-escape-key-sequence "jk") :config (evil-escape-mode))
evil-surround
Useful package for adding, editing or removing all types of surrounding characters (even HTML tags!).
(use-package evil-surround :straight t :defer 2 :after evil :config (global-evil-surround-mode 1))
evil-mc
Multiple cursors implementation for evil-mode.
(use-package evil-mc :straight t :after evil :init (global-evil-mc-mode 1))
evil-commentary
Evil bindings for commenting out chunks of code.
(use-package evil-commentary :straight t :defer 2 :config (evil-commentary-mode))
evil-collection
(use-package evil-collection :straight t :demand t :after evil :custom (evil-collection-minibuffer-setup t) :config (evil-collection-init))
evil-fringe-mark
(use-package evil-fringe-mark :straight t :init (global-evil-fringe-mark-mode))
Calendar
calfw
This program displays a calendar view in the Emacs buffer.
(use-package calfw :straight t)
Org-mode
org
Org mode is for keeping notes, maintaining to-do lists, planning projects, authoring documents, computational notebooks, literate programming and more — in a fast and effective plain text system
(use-package org :init (setq org-startup-folded t org-element-use-cache nil) :straight t :config ;; prettify (setq org-hide-macro-markers t org-hide-emphasis-markers t org-adapt-indentation t org-hide-leading-stars t org-odd-levels-only t) ;; org archive (setq org-archive-location (concat "archive/" (format-time-string "%Y-%m" (current-time)) "_%s_archive::")) ;; org persist (setq org-persist-directory (concat user-emacs-directory "var/org/persist/")) ;; org modules (setq org-modules '(ol-w3m ol-bbdb ol-bibtex ol-docview ol-gnus ol-info ol-irc ol-mhe ol-rmail ol-eww)) ;; org-todo (setq org-todo-keywords '((sequence "TODO(t)" "DOING(d!)" "MAYBE(m)" "BLOCKED(b@)" "DONE(D!)" "READ(r)" "ARCHIVED(a!)"))) (setq org-todo-keyword-faces '(("TODO" . (:foreground "HotPink3" :weight bold)) ("DOING" . (:foreground "salmon" :weight bold)) ("BLOCKED" . (:foreground "DeepPink" :weight bold)) ("MAYBE" . (:foreground "LightSteelBlue4" :weight bold)) ("DONE" . (:foreground "SeaGreen3" :weight bold)) ("READ" . (:foreground "SteelBlue2" :weight bold)) ("ARCHIVED" . (:foreground "LightSlateGrey" :weight bold)))))
ox-reveal
Reveal.js presentation back-end for org export engine.
(use-package ox-reveal :straight t :defer 3 :after org :custom (setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js") (setq org-reveal-klipsify-src t) ; Evaluate code )
calfw-org
Display org schedules.
(use-package calfw-org :straight t :defer 2 :config (setq cfw:org-agenda-schedule-args '(:timestamp :scheduled :deadline)))
htmlize
Used for exporting source code with syntax highlighting.
(use-package htmlize :straight t)
Keybindings
General
More convenient key definitions.
(use-package general :straight t :demand t :config (general-evil-setup t) (define-key evil-motion-state-map " " nil) (general-create-definer leader-def :prefix globals--leader-key) (leader-def :states 'normal ;; Misc "TAB" 'mode-line-other-buffer "." 'xref-find-definitions "," 'xref-pop-marker-stack "'" 'eshell "qq" 'evil-quit ;; Applications "a" '(:ignore t :which-key "applications") "au" 'undo-tree-visualize "aU" 'straight-pull-all "ac" 'cfw:open-org-calendar ;; Buffers "b" '(:ignore t :which-key "buffers") "bb" 'counsel-switch-buffer "bd" 'kill-this-buffer "bp" 'previous-buffer "bn" 'next-buffer "bN" 'evil-buffer-new "be" 'erase-buffer ;; Bookmarks "B" '(:ignore t :which-key "bookmarks") "BB" 'bookmark-jump "Bs" 'bookmark-set ;; Compiling "c" 'compile ;; Errors "e" '(:ignore t :which-key "errors") ;; Files "f" '(:ignore t :which-key "file") "ff" 'find-file "fs" 'save-buffer "fS" 'evil-write-all "fR" 'rename-file "fb" 'ranger-show-bookmarks "fP" 'open-config-file ;; Focus "F" '(:ignore t :which-key "focus") ;; LSP "l" '(:ignore t :which-key "language") ;; Projects "p" '(:ignore t :which-key "project") ;; Toggles "t" '(:ignore t :which-key "toggles") "tn" 'display-line-numbers-mode "tL" 'visual-line-mode "tu" 'lsp-ui-mode "ti" 'highlight-indent-guides-mode ;; Themes "T" '(:ignore t :which-key "themes") ;; Windows "w" '(:ignore t :which-key "window") "wm" 'delete-other-windows "wf" 'delete-other-windows "wj" 'evil-window-down "wk" 'evil-window-up "wl" 'evil-window-right "wh" 'evil-window-left "ws" 'split-and-follow-horizontally "wv" 'split-and-follow-vertically "wd" 'evil-window-delete "wc" 'evil-window-delete "wH" 'evil-window-move-far-left "wL" 'evil-window-move-far-right "wK" 'evil-window-move-very-top "wJ" 'evil-window-move-very-bottom "w=" 'balance-windows ;; Help "h" '(:ignore t :which-key "help") "hk" 'describe-key "hv" 'describe-variable "hf" 'describe-function "hK" 'general-describe-keybindings ))
Which-key
Package that displays available keybindings in a popup.
(use-package which-key :defer 5 :straight t :config (which-key-mode))
Source Control
Magit
General source control package. Has a nice interface for every git operation there is.
(use-package magit :straight t :defer 3 :general (nmap :prefix globals--leader-key "g" '(nil :which-key "magit") "gs" 'magit-status "gb" 'magit-blame))
Git Gutter
Commit diff and other repo informations. Has the capability to stage hunks and what-not.
(use-package git-gutter+ :straight t :defer 3 :config (global-git-gutter+-mode))
(use-package git-gutter-fringe+ :straight t :after git-gutter+ :defer 3 :custom (git-gutter-fr+-side 'left-fringe) :config (git-gutter-fr+-minimal))
Encryption
Interface for GPG, setup for transparent encryption and decryption:
(use-package epa-file :ensure nil :config (setq epa-file-encrypt-to '(globals--email)) :custom (epa-file-select-keys 'silent))
File Management
Ranger
Bringing the goodness of ranger to dired!
(use-package ranger :straight t :general (nmap :prefix globals--leader-key "ar" 'ranger "ad" 'deer) :config (ranger-override-dired-mode t))
Project Management
Treemacs
A tree layout file explorer.
(use-package treemacs :straight t :after evil :general (nmap :prefix globals--leader-key "tt" 'treemacs) :custom (treemacs-no-png-images nil) (treemacs-width 35))
treemacs-evil
must be installed and loaded if you use evil.
The keybindings and the cursor will not be setup properly otherwise.
It’ll also enable navigation with j/k instead of n/p.
(use-package treemacs-evil :straight t :demand t :after treemacs evil)
treemacs-magit
is a small utility package to fill the small gaps left
by using filewatch-mode and git-mode in conjunction with magit:
it will inform treemacs about (un)staging of files and commits happening in magit.
(use-package treemacs-magit :straight t)
Projectile
Project interaction library.
(use-package projectile :straight t :custom (projectile-enable-caching t) :config (setq projectile-indexing-method 'alien) (projectile-mode))
projectile/counsel
ivy
UI for Projectile.
(use-package counsel-projectile :straight t :general (nmap :prefix globals--leader-key "pp" 'counsel-projectile-switch-project "pf" 'counsel-projectile-find-file "pd" 'counsel-projectile-find-dir "pg" 'counsel-projectile-git-grep "pR" 'projectile-replace "ps" 'projectile-save-project-buffers))
Syntax Checking
Flycheck
Modern on-the-fly syntax checking extension.
(use-package flycheck :straight t :hook (prog-mode . flycheck-mode) :general (nmap :prefix globals--leader-key "en" 'flycheck-next-error "ep" 'flycheck-previous-error))
Language Modes
Base language packages.
Rust
(use-package rust-mode :straight t)
Ruby
(use-package ruby-mode :straight t)
Javascript
(use-package js2-mode :straight t :custom (js-indent-level 2) (js2-basic-offset 2) :init (add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode)))
RSJX
(use-package rjsx-mode :straight t)
Typescript
(use-package typescript-mode :custom (typescript-indent-level 2) :straight t)
Web
(use-package web-mode :straight t :custom (web-mode-code-indent-offset 2) (web-mode-markup-indent-offset 2))
Python
(use-package python-mode :straight t :hook (python-mode-hook . jedi:setup))
Language Server Protocol
LSP
lsp-mode
aims to provide IDE-like experience by providing optional integration with the most popular Emacs packages like company
, flycheck
and projectile
.
(use-package lsp-mode :straight t :general (nmap :prefix globals--leader-key "la" 'lsp-execute-code-action "lF" 'lsp-format-buffer "lR" 'lsp-rename) :hook ((js2-mode . lsp-deferred) (js-mode . lsp-deferred) (rjsx-mode . lsp-deferred) (typescript-mode . lsp-deferred) (rust-mode . lsp-deferred) (python-mode . lsp-deferred) (ruby-mode . lsp-deferred)) :commands (lsp lsp-deferred) :config (setq lsp-enable-completion-at-point t))
LSP-UI
Higher level UI modules of lsp-mode
.
(use-package lsp-ui :straight t :after lsp-mode :commands lsp-ui-mode :hook (lsp-mode . lsp-ui-mode) :general (nmap :prefix globals--leader-key "li" 'lsp-ui-peek-find-implementation "lr" 'lsp-ui-peek-find-references "ld" 'lsp-ui-peek-find-definitions "lg" 'lsp-ui-doc-glance "ll" 'lsp-ui-flycheck-list) :custom (lsp-ui-doc-enable t) (lsp-ui-sideline-enable t) (lsp-ui-flycheck-enable t) (lsp-ui-flycheck-live-reporting t) (lsp-ui-sideline-toggle-symbols-info t) (lsp-ui-sideline-show-hover t) (lsp-ui-peek-enable t))
Buffers and Windows
Winum
Numbering for buffers, windows and eyebrowse
workspaces.
(use-package winum :straight t :defer 0.5 :custom (winum-auto-setup-mode-line nil) :config (winum-mode))
Eyebrowse
A simple-minded way of managing window configs in emacs.
(use-package eyebrowse :straight t :defer 2 :general :config (eyebrowse-mode) (eyebrowse-setup-opinionated-keys))
windmove
Windmove is used for moving buffers to other windows.
(use-package windmove :straight t :general (nmap :prefix globals--leader-key "wH" 'windmove-swap-states-left "wL" 'windmove-swap-states-right "wK" 'windmove-swap-states-up "wJ" 'windmove-swap-states-down) :init (windmove-default-keybindings))
Focus on newly created windows
(defun split-and-follow-horizontally () (interactive) (split-window-below) (balance-windows) (other-window 1)) (defun split-and-follow-vertically () (interactive) (split-window-right) (balance-windows) (other-window 1))
Navigation
Ivy
avy
is similar to Vim's easymotion plugin, it provides commands for jumping to visible text using a char-based decision tree.
(use-package ivy :straight t :demand t :general (nmap :prefix globals--leader-key "s" 'swiper ";" 'avy-goto-word-1 ":" 'avy-goto-char) :custom (ivy-count-format "(%d/%d) ") (avy-background t) :config (global-set-key "\C-s" 'swiper) (ivy-mode)) (use-package ivy-rich :straight t :after ivy :init (ivy-rich-mode 1) :config (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line))
Ivy/Counsel
Completion frontend for things such as M-x find-file
.
(use-package counsel :straight t :after ivy :general (nmap :prefix globals--leader-key "SPC" 'counsel-M-x "fr" 'counsel-recentf "Ts" 'counsel-load-theme))
Highlight Indent Guides
Indentation highlights via font-lock
(use-package highlight-indent-guides :straight t :custom (highlight-indent-guides-method 'character) (highlight-indent-guides-character ?\|))
Editing
Focus
Dim the font color of text in surrounding paragraphs.
(use-package focus :straight t :general (nmap :prefix globals--leader-key "tf" 'focus-mode "Fp" 'focus-pin "Fu" 'focus-unpin "Fc" 'focus-change-thing))
Undo-tree
Branching tree of changes made in a file.
(use-package undo-tree :straight t :init (global-undo-tree-mode) :config (setq undo-tree-auto-save-history nil))
Origami
A text folding minor mode for Emacs. With this minor mode enabled, you can collapse and expand regions of text.
(use-package origami :straight t :hook ((js2-mode . origami-mode) (js-mode . origami-mode) (typescript-mode . origami-mode) (rust-mode . origami-mode)))
Templates
Yasnippet
A snippet template system.
(use-package yasnippet :straight t :general (nmap :prefix globals--leader-key "yt" 'yas-describe-tables) :init (yas-global-mode 1) :custom (yas-prompt-functions 'yas-ido-prompt))
Solve conflicts between company-mode and yasnippet-mode.
(defun company-yasnippet-or-completion () "Solve company yasnippet conflicts." (interactive) (let ((yas-fallback-behavior (apply 'company-complete-common nil))) (yas-expand))) (add-hook 'company-mode-hook (lambda () (substitute-key-definition 'company-complete-common 'company-yasnippet-or-completion company-active-map)))
Yasnippet/snippets
A collection of yasnippet
snippets for many languages
(use-package yasnippet-snippets :after yasnippet :straight t)
Discord Presence
elcord
Discord rich presence for emacs.
(use-package elcord :straight t :defer 5 :config (setq elcord-client-id "903078200886853665") (setq elcord-editor-icon "megumacs-icon") (elcord-mode))