;;; EMACS init file -*- lexical-binding:t -*- (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) (package-initialize) (setq use-package-always-ensure t use-package-always-defer t use-package-expand-minimally t) (require 'use-package) (use-package gcmh :demand t :config (gcmh-mode)) (let ((emacs-tmp-dir (expand-file-name (format "emacs%d" (user-uid)) temporary-file-directory))) (setq auto-save-file-name-transforms `((".*" ,emacs-tmp-dir t)) auto-save-list-file-prefix emacs-tmp-dir backup-directory-alist (setq undo-tree-history-directory-alist `((".*" . ,emacs-tmp-dir))) org-preview-latex-image-directory (expand-file-name "ltximg" emacs-tmp-dir))) (setq backup-by-copying t inhibit-splash-screen t custom-file (expand-file-name "custom.el" temporary-file-directory)) (use-package auto-package-update :custom (auto-package-update-prompt-before-update t) (auto-package-update-show-preview t) (auto-package-update-delete-old-versions t) :config (auto-package-update-at-time "05:00")) (use-package undo-tree :hook (evil-local-mode . turn-on-undo-tree-mode)) (use-package evil :demand t :custom (select-enable-clipboard nil "Disable automatic clipboard=unnamedplus") (evil-want-keybinding nil "Necessary for evil-collection") (evil-want-Y-yank-to-eol t "Make Y behave like it should") (evil-want-C-u-scroll t "Scroll with C-u") (evil-want-C-h-delete t "Delete with C-h") (evil-want-C-w-in-emacs-state t "Allow C-w movement in Emacs windows") (evil-undo-system 'undo-tree "Undo with undo-tree") :config (evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) (defadvice evil-force-normal-state (after evil-search-remove-hl activate) (evil-ex-nohighlight)) (evil-global-set-key 'insert (kbd "C-S-h") #'help-command)) (use-package evil-collection :demand t :after evil :custom (evil-collection-setup-minibuffer t) :config (evil-collection-init)) (use-package evil-leader :demand t :after evil :config (evil-leader/set-leader "") (evil-leader/set-key "u" #'universal-argument "bb" #'switch-to-buffer "bd" #'evil-delete-buffer "fd" #'dirvish-dwim "fq" #'dirvish-quit "ff" #'find-file "ft" #'treemacs "fs" #'evil-write "f'" #'bookmark-jump "gg" #'magit-status "mm" #'minimap-mode "ps" (lambda () (interactive) (package-refresh-contents) (auto-package-update-now-async)) "qq" #'evil-quit "qk" #'kill-emacs) (global-evil-leader-mode)) (use-package evil-surround :demand t :after evil :config (global-evil-surround-mode)) (use-package evil-commentary :demand t :after evil :config (evil-commentary-mode)) (use-package evil-numbers :demand t :after evil :config (evil-define-key '(normal visual) 'global "g+" #'evil-numbers/inc-at-pt) (evil-define-key '(normal visual) 'global "g-" #'evil-numbers/dec-at-pt) (evil-define-key '(normal visual) 'global "g=+" #'evil-numbers/inc-at-pt-incremental) (evil-define-key '(normal visual) 'global "g=-" #'evil-numbers/inc-at-pt-incremental)) (use-package evil-replace-with-register :demand t :after evil :custom (evil-replace-with-register-indent t) :config (evil-replace-with-register-install)) (use-package evil-org :after evil :hook org-mode :config (require 'evil-org-agenda) (evil-org-agenda-set-keys)) (use-package evil-goggles :demand t :after evil :custom (evil-goggles-duration 0.12 "Decrease the duration a tiny bit") (evil-goggles-pulse t) :config (evil-goggles-use-diff-faces) (evil-goggles-mode)) (use-package evil-terminal-cursor-changer) (use-package hydra :config (defhydra hydra-evil-c-w (evil-normal-state-map "C-w") "C-w" ("h" #'evil-window-left "left") ("j" #'evil-window-down "down") ("k" #'evil-window-up "up") ("l" #'evil-window-right "right") ("C-w" #'evil-window-next "next") ("+" #'evil-window-increase-height "+height") ("-" #'evil-window-decrease-height "-height") (">" #'evil-window-increase-width "+width") ("<" #'evil-window-decrease-width "-width"))) (use-package lispy) (use-package lispyville :hook (emacs-lisp-mode eval-expression-minibuffer-setup ielm-mode lisp-mode lisp-interaction-mode scheme-mode clojure-mode) :config (lispyville-set-key-theme '(operators c-w slurp/barf-cp commentary text-objects additional additional-insert mark (prettify insert) (escape insert emacs) (additional-movement normal visual motion))) (evil-define-key 'normal lispyville-mode-map (kbd "C-v") nil) (evil-define-key 'insert lispyville-mode-map (kbd "DEL") #'lispy-delete-backward) (evil-define-key 'insert lispyville-mode-map (kbd "C-h") #'lispy-delete-backward) (evil-define-key 'insert lispyville-mode-map "(" #'lispy-parens) (evil-define-key 'insert lispyville-mode-map ")" #'lispy-right-nostring) (evil-define-key 'insert lispyville-mode-map "\"" #'lispy-quotes) (evil-define-key 'normal lispyville-mode-map ";" nil) (evil-define-key 'normal lispyville-mode-map (kbd "C-;") #'lispy-comment) (evil-define-key 'visual lispyville-mode-map "iF" #'special-lispy-flow)) (use-package treesit :ensure nil :custom (treesit-extra-load-path `(,(expand-file-name "tree-sitter-module/dist/" user-emacs-directory)))) (use-package dtrt-indent :demand t :config (dtrt-indent-global-mode)) (use-package aggressive-indent :hook (prog-mode org-mode)) (use-package rainbow-delimiters :hook prog-mode) (use-package which-key :demand t :custom (which-key-idle-delay 0.2) :config (which-key-mode)) (use-package orderless :demand t :custom (completion-styles '(orderless basic)) (completion-category-defaults nil) (completion-category-overrides '((file (styles partial-completion))))) (use-package marginalia :demand t :after vertico :bind (:map minibuffer-local-map ("M-a" . marginalia-cycle)) :config (marginalia-mode)) (use-package vertico :demand t :config (evil-define-key 'insert minibuffer-local-map (kbd "C-j") #'vertico-next) (evil-define-key 'insert minibuffer-local-map (kbd "C-k") #'vertico-previous) (vertico-mode) (vertico-mouse-mode)) (use-package yasnippet) (use-package yasnippet-snippets) (use-package all-the-icons :demand t) (use-package all-the-icons-completion :after (marginalia all-the-icons) :hook (marginalia-mode . all-the-icons-completion-marginalia-setup) :init (all-the-icons-completion-mode)) (use-package treemacs :commands treemacs) (use-package treemacs-evil :demand t :after treemacs) (use-package treemacs-all-the-icons :demand t :after treemacs :config (treemacs-load-theme 'all-the-icons)) (use-package doom-modeline :demand t :custom (doom-modeline-fn-alist (--map (cons (remove-pos-from-symbol (car it)) (cdr it)) doom-modeline-fn-alist)) :config (doom-modeline-mode)) (use-package dirvish :after dired :custom (dirvish-attributes '(all-the-icons)) :config (dirvish-override-dired-mode)) (use-package pdf-tools :mode (("\\.pdf\\'" . pdf-view-mode)) :config (pdf-tools-install)) (defun set-text-modes-font () (interactive) (setq buffer-face-mode-face '(:family "DejaVu Sans Mono" :height 105) line-spacing 0.5) (buffer-face-mode)) (use-package org :mode (("\\.org$" . org-mode)) :hook ((org-mode . org-indent-mode) (org-mode . flyspell-mode) (org-mode . auto-fill-mode) (org-mode . set-text-modes-font)) :custom (org-list-allow-alphabetical t) (org-hide-emphasis-markers t) :config (setq org-format-latex-options (plist-put org-format-latex-options :scale 1.1)) (defhydra hydra-org-evil-shiftmove (org-mode-map "C-c") "S+arrows" ("h" #'org-shiftleft "left") ("j" #'org-shiftdown "down") ("k" #'org-shiftup "up") ("l" #'org-shiftright "right"))) (use-package org-superstar :custom (org-superstar-leading-bullet ?\s) :hook org-mode) (use-package org-pdftools :hook (org-mode . org-pdftools-setup-link)) (use-package editorconfig :demand t :config (editorconfig-mode)) (use-package json-mode :mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'") (use-package nix-mode :mode "\\.nix'") (use-package markdown-mode :mode ("README\\.md\\'" . gfm-mode) :custom (markdown-command '("pandoc" "--from=markdown" "--to=html5"))) (use-package minimap :commands minimap-mode :custom-face (minimap-active-region-background ((t (:background nil :inherit hl-line)))) :hook ((minimap-sb-mode . evil-emacs-state) (minimap-sb-mode . turn-on-solaire-mode)) :config (with-eval-after-load 'evil (defadvice evil-quit (after evil-quit-remove-minimap activate) (let ((windows (window-list nil 0))) (when (and (eq (length windows) 1) (with-current-buffer (window-buffer (car windows)) (member 'minimap-sb-mode local-minor-modes))) (if (daemonp) (delete-frame) (kill-emacs))))))) (use-package magit :hook ((git-commit-setup . git-commit-turn-on-flyspell) (git-commit-setup . git-commit-turn-on-auto-fill))) (use-package tramp :custom (remote-file-name-inhibit-cache nil) (tramp-verbose 1) :config (setq vc-ignore-dir-regexp (format "%s\\|%s" vc-ignore-dir-regexp tramp-file-name-regexp))) (use-package vterm :hook (vterm-mode . my-inhibit-hl-line-mode) :config (evil-define-key 'insert vterm-mode-map (kbd "C-h") #'vterm--self-insert) (evil-define-key 'insert vterm-mode-map (kbd "C-S-h") #'help-command)) (use-package elfeed :commands (elfeed elfeed-update) :custom (elfeed-feeds '(("https://archlinux.org/feeds/news/" arch-linux)))) (use-package xkcd :commands xkcd :config (evil-set-initial-state 'xkcd-mode 'emacs)) (use-package ligature :hook (prog-mode (ligature-mode . prettify-symbols-mode)) :custom (prettify-symbols-unprettify-at-point t) :config (ligature-set-ligatures 'prog-mode '("|||>" "<|||" "<==>" "" "---" "-<<" "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "" "###" "#_(" "..<" "..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~=" "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|" "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:" ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" "<$" "<=" "<>" "<-" "<<" "<+" "" "++" "?:" "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)" "\\\\" "://"))) (use-package gruvbox-theme) (use-package catppuccin-theme) (defun load-theme-with-solaire () (load-theme 'catppuccin-macchiato t) (solaire-global-mode) (when (daemonp) (remove-hook 'server-after-make-frame-hook #'load-theme-with-solaire))) (use-package solaire-mode :demand t :custom (solaire-mode-real-buffer-fn (lambda () (and (solaire-mode-real-buffer-p) (or (custom-theme-enabled-p 'gruvbox) (not (member 'minimap-sb-mode local-minor-modes)))))) :config (if (daemonp) (add-hook 'server-after-make-frame-hook #'load-theme-with-solaire) (load-theme-with-solaire))) (use-package emacs-everywhere :load-path "~/emacs-everywhere" :commands emacs-everywhere) (use-package tool-bar :ensure nil :config (tool-bar-mode 0)) (use-package menu-bar :ensure nil :config (menu-bar-mode 0)) (use-package scroll-bar :ensure nil :config (scroll-bar-mode 0)) (setq pixel-scroll-precision-large-scroll-height 40) (pixel-scroll-precision-mode) (setcar mouse-wheel-scroll-amount 3) (setq server-client-instructions nil scroll-step 1 scroll-margin 3 scroll-conservatively 9999 read-file-name-completion-ignore-case t read-buffer-completion-ignore-case t completion-ignore-case t sentence-end-double-space nil) (setq-default c-basic-offset 4 tab-width 4 fill-column 80) (global-hl-line-mode) (defun my-inhibit-hl-line-mode () (setq-local global-hl-line-mode nil)) (defun my-relative-linenum () (setq display-line-numbers 'relative)) (dolist (hook '(prog-mode-hook text-mode-hook conf-mode-hook org-mode-hook)) (add-hook hook #'my-relative-linenum)) (defun my-use-spaces-for-indent () (setq indent-tabs-mode nil)) (dolist (hook '(emacs-lisp-mode-hook lisp-mode-hook scheme-mode-hook clojure-mode-hook)) (add-hook hook #'my-use-spaces-for-indent)) (defun scroll-down-3 () "Scrolls down by 3" (interactive) (scroll-down 3)) (defun scroll-up-3 () "Scrolls up by 3" (interactive) (scroll-up 3)) (defun frame-make-detect-term (frame) "Check when frames are made in order to make terminal-only configurations" (unless (display-graphic-p frame) (xterm-mouse-mode) (global-set-key (kbd "") #'scroll-down-3) (global-set-key (kbd "") #'scroll-up-3) (etcc-on) (setq after-make-frame-functions (remove 'frame-make-detect-term after-make-frame-functions)))) (add-to-list 'after-make-frame-functions #'frame-make-detect-term) (add-to-list 'auto-mode-alist '("\\.yuck\\'" . lisp-mode)) (with-current-buffer "*scratch*" (cd "~/"))