#+Title: Crony's Emacs Config #+AUTHOR: Crony Akatsuki #+DESCRIPTION: Crony's personal emacs config #+STARTUP: showeverything #+OPTIONS: toc:2 #+PROPERTY: header-args:emacs-lisp :tangle ./config.el * GARBAGE COLLECTION #+begin_src emacs-lisp (defvar file-name-handler-alist-old file-name-handler-alist) (setq file-name-handler-alist nil gc-cons-threshold most-positive-fixnum) (add-hook 'after-init-hook `(lambda () (setq file-name-handler-alist file-name-handler-alist-old) (setq gc-cons-threshold (* 2 1000 1000)) (setq gc-cons-percentage 0.1)) t) #+end_src(defvar file-name-handler-alist-old file-name-handler-alist) * BACKUPS Move backup files to a diff directory. #+begin_src emacs-lisp (setq backup-directory-alist '(("." . "~/.cache/emacs/")) backup-by-copying t ; Don't delink hardlinks version-control t ; Use version numbers on backups delete-old-versions t ; Automatically delete excess backups kept-new-versions 20 ; how many of the newest versions to keep kept-old-versions 5 ; and how many of the old ) #+end_src * SANE DEFAULTS #+begin_src emacs-lisp (delete-selection-mode 1) ;; You can select text and delete it by typing. (electric-indent-mode -1) ;; Turn off the weird indenting that Emacs does by default. (global-auto-revert-mode t) ;; Automatically show changes if the file has changed (setq initial-scratch-message nil) ;; disable the initial scratch message. (setq-default delete-pair-blink-delay 0) ;; remove delay when deleting pairs (prefer-coding-system 'utf-8) ;; utf-8 (global-set-key [escape] 'keyboard-escape-quit) ;; escape minibuffers with ESC #+end_src * GUI TWEAKS #+begin_src emacs-lisp (global-visual-line-mode t) ;; Enable truncated lines (menu-bar-mode -1) ;; Disable the menu bar (scroll-bar-mode -1) ;; Disable the scroll bar (tool-bar-mode -1) ;; Disable the tool bar (set-fringe-mode 10) ;; Give me some breathing room (fset 'yes-or-no-p 'y-or-n-p) ;; don't ask to spell out "yes" (setq-default frame-resize-pixelwise t) ;; avoid leaving a gap beetween the frame and the screen (column-number-mode) ;; Display line colums ;; disable line numbers for following modes (dolist (mode '(org-mode-hook term-mode-hook shell-mode-hook eshell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (global-display-line-numbers-mode 1) ;; Display line numbers (blink-cursor-mode -1) ;; disable blinking cursor #+end_src * FONTS #+begin_src emacs-lisp (set-face-attribute 'default nil :font "CommitMono Nerd Font" :height 140 :weight 'medium) (set-face-attribute 'variable-pitch nil :font "DejaVu Sans" :height 150 :weight 'medium) (set-face-attribute 'fixed-pitch nil :font "CommitMono Nerd Font" :height 140 :weight 'medium) (add-to-list 'default-frame-alist '(font . "CommitMono Nerd Font-14")) #+end_src * ELECTRIC PAIR #+begin_src emacs-lisp (electric-pair-mode 1) (add-hook 'org-mode-hook (lambda () (setq-local electric-pair-inhibit-predicate `(lambda (c) (if (char-equal c ?<) t (,electric-pair-inhibit-predicate c)))))) #+end_src * TRANSFORM INTO VIM ** EVIL MODE #+begin_src emacs-lisp (use-package evil :init (setq evil-want-integration t evil-want-keybinding nil evil-want-C-u-scroll t evil-want-C-i-jump nil evil-vsplit-window-right t evil-split-window-below t evil-undo-system 'undo-redo) :config (evil-mode 1) (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state) (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) (evil-set-initial-state 'messages-buffer-mode 'normal) (evil-set-initial-state 'dashboard-mode 'normal)) (use-package evil-collection :after evil :config (evil-collection-init)) #+end_src ** MODELINE #+begin_src emacs-lisp (use-package doom-modeline :ensure t :init (doom-modeline-mode 1) :config (setq doom-modeline-height 25 doom-modeline-bar-width 5 doom-modeline-persp-name t doom-modeline-persp-icon t)) #+end_src ** VIM LIKE SCROLLING #+begin_src emacs-lisp ;; Vim like scrolling (setq scroll-margin 10 scroll-step 1 scroll-conservatively 10000 scroll-preserve-screen-position 1) #+end_src * WHICH_KEY #+begin_src emacs-lisp (use-package which-key :init (which-key-mode 1) :diminish :config (setq which-key-side-window-location 'bottom which-key-sort-order #'which-key-key-order-alpha which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil which-key-min-display-lines 6 which-key-side-window-slot -10 which-key-side-window-max-height 0.25 which-key-idle-delay 0.3 which-key-max-description-length 25 which-key-allow-imprecise-window-fit nil which-key-separator " → " )) #+end_src * GENERAL KEYBINDINGS #+begin_src emacs-lisp (use-package general :ensure t :init (with-eval-after-load 'evil (general-evil-setup)) (general-auto-unbind-keys) :config (general-override-mode) (general-create-definer +config/leader-key :keymaps 'override :states '(insert emacs normal hybrid motion visual operator) :prefix "SPC" :non-normal-prefix "s-SPC") (general-create-definer +config/local-leader :keymaps 'override :states '(emacs normal hybrid motion visual operator) :prefix "m" :non-normal-prefix "s-m" "" '(:ignore t :which-key (lambda (arg) `(,(cadr (split-string (car arg) " ")) . ,(replace-regexp-in-string "-mode$" "" (symbol-name major-mode))))))) #+end_src * DIMINISH #+begin_src emacs-lisp (use-package diminish) #+end_src ORG MODE ** Update and setup org mode #+begin_src emacs-lisp ;; fixes a bug where evil mnode bounds return key, so it isn't accesible (with-eval-after-load 'evil-maps (define-key evil-motion-state-map (kbd "RET") nil)) (defun crony/org-mode-setup () (org-indent-mode) (visual-line-mode 1)) ;; Replace list hyphen with dot (font-lock-add-keywords 'org-mode '(("^ *\\([-]\\) " (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) (use-package org :defer t :init (require 'org-tempo) :hook (org-mode . crony/org-mode-setup) :config (setq org-ellipsis " ▾") (setq org-edit-src-content-indentation 0) ;; org agenda settings (setq org-agenda-start-with-log-mode t) (setq org-log-done 'time) (setq org-log-into-drawer t) (setq org-agenda-files '("~/docs/notes/tasks.org" "~/docs/notes/birthdays.org")) ;; refiling (setq org-refile-targets '(("archive.org" :maxlevel . 1) ("tasks.org" :maxlevel . 1))) ;; save after refiling (advice-add 'org-refile :after 'org-save-all-org-buffers) (setq org-return-follows-link t)) #+end_src ** Column width #+begin_src emacs-lisp (defun crony/org-mode-visual-fill () (setq visual-fill-column-width 110 visual-fill-column-center-text t) (visual-fill-column-mode 1)) (use-package visual-fill-column :defer t :hook (org-mode . crony/org-mode-visual-fill)) #+end_src ** Enabling Org Bullets #+begin_src emacs-lisp (use-package org-bullets :after org :hook (org-mode . org-bullets-mode)) #+end_src ** Enabling Table of Contents #+begin_src emacs-lisp (use-package toc-org :after org :commands toc-org-enable :init (add-hook 'org-mode-hook 'toc-org-enable)) #+end_src * THEME #+begin_src emacs-lisp (use-package gruvbox-theme :config (load-theme 'gruvbox-dark-medium :no-confirm)) #+end_src * HELPFUL #+begin_src emacs-lisp (use-package helpful :bind ([remap describe-function] . helpful-function) ([remap describe-command] . helpful-command) ([remap describe-variable] . helpful-variable) ([remap describe-key] . helpful-key)) #+end_src * COMPLETION ** VERTICO #+begin_src emacs-lisp (use-package vertico :bind (:map vertico-map ("C-j" . vertico-next) ("C-k" . vertico-previous) ("C-l" . vertico-exit) :map minibuffer-local-map ("C-h" . backward-kill-word)) :custom (vertico-scroll-margin 0) ;; Different scroll margin (vertico-count 15) ;; Show more candidates (vertico-resize t) ;; Grow and shrink the Vertico minibuffer (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' :init (vertico-mode)) (use-package savehist :ensure nil :init (savehist-mode)) (use-package emacs :ensure nil :custom (context-menu-mode t) (enable-recursive-minibuffers t) (read-extended-command-predicate #'command-completion-default-include-p) (minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt))) #+end_src ** MARGINALIA #+begin_src emacs-lisp (use-package marginalia :bind (:map minibuffer-local-map ("M-A" . marginalia-cycle)) :init (marginalia-mode)) #+end_src ** CONSULT #+begin_src emacs-lisp (use-package consult :after vertico :custom (completion-in-region-function #'consult-completion-in-region) :config (recentf-mode t)) #+end_src ** ORDERLESS #+begin_src emacs-lisp (use-package orderless :ensure t :custom (completion-styles '(orderless basic)) (completion-category-overrides '((file (styles partial-completion)))) (completion-pcm-leading-wildcard t)) ;; Emacs 31: partial-completion behaves like substring #+end_src * IN BUFFER COMPLETION ** CORFU Adds in buffer completion for code/snippets #+begin_src emacs-lisp (use-package corfu ;; Optional customizations :custom (tab-always-indent 'complete) (completion-cycle-threshold nil) (corfu-cycle t) (corfu-auto t) (corfu-auto-prefix 2) (corfu-auto-delay 0.1) (corfu-min-width 60) (corfu-popupinfo-delay '(0.5 . 0.2)) (corfu-preview-current 'insert) (corfu-preselect 'prompt) (corfu-on-exact-match nil) :bind (:map corfu-map ("C-j" . corfu-next) ("C-k" . corfu-previous) ("C-l" . corfu-insert)) :init (corfu-history-mode) (corfu-popupinfo-mode) (global-corfu-mode) :config (add-hook 'eshell-mode-hook (lambda () (setq-local corfu-quit-at-boundary t corfu-quit-no-match t corfu-auto nil) (corfu-mode)))) #+end_src ** KIND ICON Eyecandy for corfu #+begin_src emacs-lisp (use-package kind-icon :ensure t :after corfu :custom (kind-icon-default-face 'corfu-default) :config (plist-put kind-icon-default-style :height 0.8) (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter)) #+end_src ** CAPE extending corpu #+begin_src emacs-lisp (use-package cape :defer 10 :bind ("C-c f" . cape-file) :init (defalias 'dabbrev-after-2 (cape-capf-prefix-length #'cape-dabbrev 2)) (add-to-list 'completion-at-point-functions 'dabbrev-after-2 t) (cl-pushnew #'cape-file completion-at-point-functions) :config (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-silent) (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-purify)) #+end_src ** YASNIPPET #+begin_src emacs-lisp (use-package yasnippet :ensure t :init (setq yas-nippet-dir "~/.config/emacs/snippets/") (yas-global-mode)) (use-package yasnippet-snippets :ensure t :after yasnippet) #+end_src * DIRED #+begin_src emacs-lisp (use-package dired-open :config (setq dired-open-extensions '(("mkv" . "mpv") ("mp4" . "mpv")))) (use-package peep-dired :after dired :hook (evil-normalize-keymaps . peep-dired-hook) :config (evil-define-key 'normal dired-mode-map (kbd "h") 'dired-up-directory) (evil-define-key 'normal dired-mode-map (kbd "l") 'dired-open-file) (evil-define-key 'normal peep-dired-mode-map (kbd "j") 'peep-dired-next-file) (evil-define-key 'normal peep-dired-mode-map (kbd "k") 'peep-dired-prev-file) ) #+end_src