#+TITLE: Hane's GNU Emacs Config #+AUTHOR: Hane #+DESCRIPTION: Hane's personal Emacs config made with love by Haibane <3. #+STARTUP: showeverything #+OPTIONS: toc:2 * TABLE OF CONTENTS :toc: - [[#load-first][LOAD FIRST]] - [[#startup-time][Startup Time]] - [[#package-management][Package management]] - [[#package][Package]] - [[#use-packages][Use Packages]] - [[#disable-native-compilation-warnings][Disable native compilation warnings]] - [[#try][try]] - [[#ui][UI]] - [[#Dashboard][Dashboard]] - [[Line wrap and line number][Line wrap and line number]] - [[#disable-menubar-toolbars-and-scrollbars][Disable Menubar, Toolbars and Scrollbars]] - [[#font][Font]] - [[#scratch-buffer][Scratch Buffer]] - [[#startup-screen][Startup screen]] - [[#themes][Themes]] - [[#Tango-dark][Tango-dark]] - [[#Pink-bliss-uwu][Pink-bliss-uwu]] - [[#Modus][Modus]] - [[#ef-themes][ef-themes]] - [[#Selection overwrite][Selection overwrite]] - [[#smooth-scrolling][Smooth scrolling]] - [[#ibuffer][Ibuffer]] - [[#window-navigation][Window Navigation]] - [[#mouse][Mouse]] - [[#windmove][Windmove]] - [[#winner-mode][Winner Mode]] - [[#repeat-mode][Repeat mode]] - [[#help-system][Help System]] - [[#which-key][Which Key]] - [[#embark][embark]] - [[#language-support][LANGUAGE SUPPORT]] - [[#elisp][Elisp]] - [[#org-mode][Org Mode]] - [[#lua][lua]] - [[#markdown][Markdown]] - [[#bbcode][BBcode]] - [[#completion][Completion]] - [[#icomplete][IComplete]] - [[#global-completion-preview-mode][global-completion-preview-mode]] - [[#dabbrev][Dabbrev]] - [[#abbrev][Abbrev]] - [[#orderless][Orderless]] - [[#spell-checking][Spell checking]] - [[#hunspell][hunspell]] - [[#ssh][SSH]] - [[#ssh-agency][SSH Agency]] - [[#emacs-memory][Emacs Memory]] - [[#magit][Magit]] - [[#magit-todos][Magit todos]] - [[#benchmark-init][Benchmark-init]] - [[#projectile][Projectile]] - [[#projectile-ripgrep][Projectile Ripgrep]] - [[#crdt][Crdt]] - [[#dokuwiki][Dokuwiki]] - [[#dokuwiki-mode][Dokuwiki Mode]] - [[#etc][ETC]] - [[#custom-file][Custom file]] - [[#keybinds][Keybinds]] - [[#major-modes][Major modes]] - [[#gnus][Gnus]] - [[#vterm][Vterm]] - [[#emms][Emms]] - [[#yeetube][Yeetube]] - [[#dired][dired]] - [[#marginalia][Marginalia]] * LOAD FIRST ** Startup Time #+begin_src emacs-lisp (defun efs/display-startup-time () (message "Emacs loaded in %s with %d garbage collections." (format "%.2f seconds" (float-time (time-subtract after-init-time before-init-time))) gcs-done)) (add-hook 'emacs-startup-hook #'efs/display-startup-time) #+end_src * Package management ** Package #+begin_src emacs-lisp (use-package package :ensure nil :defer t :custom ;; Add MELPA and other repositories (package-archives '( ("gnu" . "https://elpa.gnu.org/packages/") ("nongnu" . "https://elpa.nongnu.org/nongnu/") ("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") )) :config ;; Initialize package system ) #+end_src ** Use Packages #+begin_src emacs-lisp (setq use-package-always-ensure t) ;; (setq use-package-always-defer t) #+end_src ** Disable native compilation warnings #+begin_src emacs-lisp (setq native-comp-async-report-warnings-errors nil) #+end_src ** try #+begin_src emacs-lisp (use-package try :defer t) #+end_src * UI ** Disable Menubar, Toolbars and Scrollbars #+begin_src emacs-lisp (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) #+end_src ** Dashboard #+begin_src emacs-lisp (use-package dashboard :ensure t :config (dashboard-setup-startup-hook) ;;Logo image (setq dashboard-startup-banner (cons "~/.emacs.d/logo.jpg" "~/.emacs.d/logo.txt")) ;; Content is not centered by default. To center, set (setq dashboard-center-content t) ;; vertically center content (setq dashboard-vertically-center-content nil)) (setq initial-buffer-choice 'dashboard-open) #+end_src ** Line wrap and line number #+begin_src emacs-lisp (global-visual-line-mode t) (global-display-line-numbers-mode t) #+end_src ** Font Nice font try it #+begin_src emacs-lisp ;; (set-face-attribute 'default nil ;; :font "FiraCode Nerd Font" ;; ) #+end_src ** Scratch Buffer #+begin_src emacs-lisp (setq initial-major-mode 'org-mode) ;; start in org mode (setq initial-scratch-message nil) #+end_src ** Startup screen #+begin_src emacs-lisp (setq inhibit-startup-screen t) #+end_src ** Themes I look down on for not using modus-vivendi-tinted *** Tango-dark #+begin_src emacs-lisp ;(load-theme 'tango-dark) #+end_src *** Pink-bliss-uwu #+begin_src emacs-lisp ;; (use-package pink-bliss-uwu-theme ;; :config ;; (load-theme 'pink-bliss-uwu t) ;; :custom ;; (pink-bliss-uwu-use-custom-font nil)) #+end_src *** Modus #+begin_src emacs-lisp (use-package modus-themes :after ef-themes :ensure nil :demand t :init ;; Starting with version 5.0.0 of the `modus-themes', other packages ;; can be built on top to provide their own "Modus" derivatives. ;; For example, this is what I do with my `ef-themes' and ;; `standard-themes' (starting with versions 2.0.0 and 3.0.0, ;; respectively). ;; ;; The `modus-themes-include-derivatives-mode' makes all Modus ;; commands that act on a theme consider all such derivatives, if ;; their respective packages are available and have been loaded. ;; ;; Note that those packages can even completely take over from the ;; Modus themes such that, for example, `modus-themes-rotate' only ;; goes through the Ef themes (to this end, the Ef themes provide ;; the `ef-themes-take-over-modus-themes-mode' and the Standard ;; themes have the `standard-themes-take-over-modus-themes-mode' ;; equivalent). ;; ;; If you only care about the Modus themes, then (i) you do not need ;; to enable the `modus-themes-include-derivatives-mode' and (ii) do ;; not install and activate those other theme packages. (modus-themes-include-derivatives-mode 1) :bind (("" . modus-themes-load-random-dark) ("C-" . modus-themes-select) ("M-" . modus-themes-load-random-light)) :config ;; Your customizations here: (setq modus-themes-to-toggle '(modus-operandi modus-vivendi) modus-themes-to-rotate modus-themes-items modus-themes-mixed-fonts t modus-themes-variable-pitch-ui t modus-themes-italic-constructs t modus-themes-bold-constructs t modus-themes-completions '((t . (bold))) modus-themes-prompts '(bold) modus-themes-headings '((agenda-structure . (variable-pitch light 2.2)) (agenda-date . (variable-pitch regular 1.3)) (t . (regular 1.15)))) (setq modus-themes-common-palette-overrides nil) ;; Finally, load your theme of choice (or a random one with ;; `modus-themes-load-random', `modus-themes-load-random-dark', ;; `modus-themes-load-random-light'). ;; (modus-themes-load-theme 'modus-operandi) ;; (modus-themes-load-random-dark) ) #+end_src **** ef-themes #+begin_src emacs-lisp (use-package ef-themes :defer nil :ensure t :init ;; This makes the Modus commands listed below consider only the Ef ;; themes. For an alternative that includes Modus and all ;; derivative themes (like Ef), enable the ;; `modus-themes-include-derivatives-mode' instead. The manual of ;; the Ef themes has a section that explains all the possibilities: ;; ;; - Evaluate `(info "(ef-themes) Working with other Modus themes or taking over Modus")' ;; - Visit (ef-themes-take-over-modus-themes-mode 1) :config ;; All customisations here. (setq modus-themes-mixed-fonts t) (setq modus-themes-italic-constructs t) ;; Finally, load your theme of choice (or a random one with ;; `modus-themes-load-random', `modus-themes-load-random-dark', ;; `modus-themes-load-random-light'). ;;(modus-themes-load-theme 'ef-day) ;;(modus-themes-load-theme 'ef-kassio) (modus-themes-load-theme 'ef-summer) ;;(modus-themes-load-theme 'ef-tritanopia-light) ) #+end_src ** Selection overwrite #+begin_src emacs-lisp (delete-selection-mode t) #+end_src #+begin_src emacs-lisp (setq scroll-step 1) (setq scroll-margin 5) ;; add few margin lines at top and bottom #+end_src ** Ibuffer :fix: #+begin_src emacs-lisp (use-package ibuffer :bind (("C-x C-b" . ibuffer)) :custom ;; (ibuffer-use-other-window nil) ;; Ibuffer filters (ibuffer-show-empty-filter-groups nil) ; don't show empty groups (ibuffer-saved-filter-groups '(("default" ("org" (or (mode . org-mode) (name . "^\\*Org Src") (name . "^\\*Org Agenda\\*$"))) ("tramp" (name . "^\\*tramp.*")) ("emacs" (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$") (name . "^\\*Warnings\\*$") (name . "^\\*Shell Command Output\\*$") (name . "^\\*Async-native-compile-log\\*$"))) ("ediff" (name . "^\\*[Ee]diff.*")) ("vc" (name . "^\\*vc-.*")) ("dired" (mode . dired-mode)) ("terminal" (or (mode . term-mode) (mode . shell-mode) (mode . eshell-mode))) ("help" (or (name . "^\\*Help\\*$") (name . "^\\*info\\*$"))) ("news" (name . "^\\*Newsticker.*")) ("gnus" (or (mode . message-mode) (mode . gnus-group-mode) (mode . gnus-summary-mode) (mode . gnus-article-mode) (name . "^\\*Group\\*") (name . "^\\*Summary\\*") (name . "^\\*Article\\*") (name . "^\\*BBDB\\*"))) ("chat" (or (mode . rcirc-mode) (mode . erc-mode) (name . "^\\*rcirc.*") (name . "^\\*ERC.*")))))) :config (ibuffer-switch-to-saved-filter-groups "default") ) #+end_src * Window Navigation ** Mouse #+begin_src emacs-lisp (setq mouse-autoselect-window t) #+end_src ** Windmove #+begin_src emacs-lisp (use-package windmove :custom (windmove-create-window 1) :config (windmove-default-keybindings) (windmove-default-keybindings 'ctrl)) #+end_src ** Winner Mode #+begin_src emacs-lisp (winner-mode 1) #+end_src ** Repeat mode #+begin_src emacs-lisp (use-package repeat :init (repeat-mode) :bind (("C-." . repeat))) #+end_src * Help System ** Which Key #+begin_src emacs-lisp (use-package which-key :custom (which-key-idle-delay 0.001) ;; a vaule of zero cause issues never set it to zero :config (which-key-mode 1)) #+end_src ** embark Shows all actions on point NOTE: Meh. #+begin_src emacs-lisp (use-package embark :defer t) #+end_src * LANGUAGE SUPPORT Emacs has built-in programming language modes for Lisp, Scheme, DSSSL, Ada, ASM, AWK, C, C++, Fortran, Icon, IDL (CORBA), IDLWAVE, Java, Javascript, M4, Makefiles, Metafont, Modula2, Object Pascal, Objective-C, Octave, Pascal, Perl, Pike, PostScript, Prolog, Python, Ruby, Simula, SQL, Tcl, Verilog, and VHDL. Other languages will require you to install additional modes. ** Elisp TODO: No funciona? #+begin_src emacs-lisp ;; (electric-pair-mode 1) ;; maybe use M-( instead you can also embed word by (seclting) them (use-package rainbow-delimiters :vc (:url https://github.com/Fanael/rainbow-delimiters.git) :hook (prog-mode . rainbow-delimiters-mode)) #+end_src ** Org Mode *** Show Images in Org Mode #+begin_src emacs-lisp ;; show images in org (setq org-startup-with-inline-images t) #+end_src *** Enabling Table of Contents :fix: #+begin_src emacs-lisp (use-package toc-org :disabled :commands toc-org-enable ;; :init (add-hook 'org-mode-hook 'toc-org-enable)) :hook (org-mode . toc-org-enable)) #+end_src *** Enabling Org Bullets Org-bullets gives us attractive bullets rather than asterisks. #+begin_src emacs-lisp ;;(add-hook 'org-mode-hook 'org-indent-mode) ;;(use-package org-bullets) ;;(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) #+end_src *** Diminish Org Indent Mode Removes "Ind" from showing in the modeline. #+begin_src emacs-lisp (eval-after-load 'org-indent '(diminish 'org-indent-mode)) #+end_src *** Org Level Headers #+begin_src emacs-lisp (custom-set-faces '(org-level-1 ((t (:inherit outline-1 :height 1.7)))) '(org-level-2 ((t (:inherit outline-2 :height 1.6)))) '(org-level-3 ((t (:inherit outline-3 :height 1.5)))) '(org-level-4 ((t (:inherit outline-4 :height 1.4)))) '(org-level-5 ((t (:inherit outline-5 :height 1.3)))) '(org-level-6 ((t (:inherit outline-5 :height 1.2)))) '(org-level-7 ((t (:inherit outline-5 :height 1.1))))) #+end_src *** Org Todo #+begin_src emacs-lisp (setq org-todo-keywords (quote ((sequence "TODO" "NEXT" "DONE" "PROJECTDONE" "WAITING" "SOMEDAY" "CANCELLED")))) (setq org-todo-keyword-faces (quote (("TODO" :foreground "lime green" :weight bold) ("NEXT" :foreground "cyan" :weight bold) ("DONE" :foreground "dim gray" :weight bold) ("PROJECTDONE" :foreground "dim gray" :weight bold) ("WAITING" :foreground "tomato" :weight bold) ("SOMEDAY" :foreground "magenta" :weight bold) ("CANCELLED" :foreground "dim gray" :weight bold) ("NOTE" :foreground "pink" :weight bold)))) #+end_src This code is pointles sense we are not using hl-todo i inserted it here to make the job of porting it the src block that above easier sense i cant really know which one you want and which ones you dont want #+begin_src emacs-lisp (setq hl-todo-keyword-faces '(("HOLD" . "#d0bf8f") ("TODO" . hl-todo-custom-face) ("todo" . hl-todo-custom-face) ("NEXT" . "#dca3a3") ("THEM" . "#dc8cc3") ("PROG" . "#7cb8bb") ("OKAY" . "#7cb8bb") ("DONT" . "#5f7f5f") ("FAIL" . "#8c5353") ("DONE" . "#afd8af") ("NOTE" . "#d0bf8f") ("KLUDGE" . "#d0bf8f") ("HACK" . "#d0bf8f") ("TEMP" . "#d0bf8f") ("FIXME" . "#cc9393") ("XXX+" . "#cc9393"))) #+end_src *** Source Code Block Tag Expansion Org-tempo is not a separate package but a module within org that can be enabled. Org-tempo allows for '" . icomplete-forward-completions) ("" . icomplete-backward-completions) ;;("C-v" . icomplete-vertical-toggle) ("RET" . icomplete-force-complete-and-exit) ("C-j" . exit-minibuffer)) ;; So we can exit commands like `multi-file-replace-regexp-as-diff' :custom (fido-vertical-mode 1) (icomplete-delay-completions-threshold 0) (icomplete-compute-delay 0) (icomplete-show-matches-on-no-input t) ;; (icomplete-hide-common-prefix nil) (icomplete-prospects-height 10) ;; (icomplete-separatorq " . ") (icomplete-with-completion-tables t) (icomplete-in-buffer t) (icomplete-max-delay-chars 0) (icomplete-scroll t) (icomplete-vertical-in-buffer-adjust-list t) (icomplete-vertical-render-prefix-indicator t) ;; (icomplete-vertical-selected-prefix-indicator " @ ") ;; (icomplete-vertical-unselected-prefix-indicator " ") :config ;; hide the minibuffer (advice-add 'completion-at-point :after #'minibuffer-hide-completions) ) #+end_src ** global-completion-preview-mode This is what shows an unopinionated autocomplete suggestion. I love this implementation #+begin_src emacs-lisp (use-package completion-preview :config (global-completion-preview-mode) (push 'org-self-insert-command completion-preview-commands)) #+end_src ** Dabbrev #+begin_src emacs-lisp (use-package dabbrev ;; Swap M-/ and C-M-/ :bind (("M-/" . dabbrev-completion) ("C-M-/" . dabbrev-expand)) :config (add-to-list 'dabbrev-ignored-buffer-regexps "\\` ") (add-to-list 'dabbrev-ignored-buffer-modes 'authinfo-mode) (add-to-list 'dabbrev-ignored-buffer-modes 'doc-view-mode) (add-to-list 'dabbrev-ignored-buffer-modes 'pdf-view-mode) (add-to-list 'dabbrev-ignored-buffer-modes 'tags-table-mode)) #+end_src ** Abbrev #+begin_src emacs-lisp (use-package abbrev :ensure nil :custom (save-abbrevs nil) :config (define-abbrev-table 'global-abbrev-table '(;; Arrows ("ra" "→") ("la" "←") ("ua" "↑") ("da" "↓") ;; Emojis for context markers ("todo" "👷 TODO:") ("fixme" "🔥 FIXME:") ("note" "📎 NOTE:") ("hack" "👾 HACK:") ("pinch" "🤌") ("smile" "😄") ("party" "🎉") ("up" "☝️") ("applause" "👏") ("manyapplauses" "👏👏👏👏👏👏👏👏") ("heart" "❤️") ;; NerdFonts ("nerdfolder" " ") ("nerdgit" "") ("nerdemacs" "") ;; HTML ("nb" " ") ("lt" "<") ;; < ("gt" ">") ;; > ("le" "≤") ;; ≤ ("ge" "≥") ;; ≥ ("ap" "'") ;; ' ("laa" "«") ;; « ("raa" "»") ;; » ("co" "©") ;; © ("tm" "™") ;; ™ ("em" "—") ;; — ("en" "–") ;; – ("dq" """) ;; " ("html" "\n\n\n \n Document\n\n\n\n\n") ;; Utils ("isodate" "" (lambda () (insert (format "%s" (format-time-string "%Y-%m-%dT%H:%M:%S"))))) ("uuid" "" (lambda () (insert (org-id-uuid)))) ;; Markdown ("cb" "```@\n\n```" (lambda () (search-backward "@") (delete-char 1))) ;; ORG ("ocb" "#+BEGIN_SRC @\n\n#+END_SRC" (lambda () (search-backward "@") (delete-char 1))) ("oheader" "#+TITLE: ###1###\n#+AUTHOR: ###2###\n#+EMAIL: ###3###\n#+OPTIONS: toc:nil\n" emacs-solo/abbrev--replace-placeholders) ;; JS/TS snippets ("imp" "import { ###1### } from '###2###';" emacs-solo/abbrev--replace-placeholders) ("fn" "function ###1### () {\n ###@### ;\n};" emacs-solo/abbrev--replace-placeholders) ("clog" "console.log(\">>> LOG:\", { ###@### })" emacs-solo/abbrev--replace-placeholders) ("cwarn" "console.warn(\">>> WARN:\", { ###@### })" emacs-solo/abbrev--replace-placeholders) ("cerr" "console.error(\">>> ERR:\", { ###@### })" emacs-solo/abbrev--replace-placeholders) ("afn" "async function() {\n \n}" (lambda () (search-backward "}") (forward-line -1) (end-of-line))) ("ife" "(function() {\n \n})();" (lambda () (search-backward ")();") (forward-line -1) (end-of-line))) ("esdeps" "// eslint-disable-next-line react-hooks/exhaustive-deps" (lambda () (search-backward ")();") (forward-line -1) (end-of-line))) ("eshooks" "// eslint-disable-next-line react-hooks/rules-of-hooks" (lambda () (search-backward ")();") (forward-line -1) (end-of-line))) ;; React/JSX ("rfc" "const ###1### = () => {\n return (\n
###2###
\n );\n};" emacs-solo/abbrev--replace-placeholders)))) #+end_src ** Orderless #+begin_src emacs-lisp ;; Optionally use the `orderless' completion style. (use-package orderless :disabled t :vc (:url https://github.com/oantolin/orderless.git) :custom ;; (orderless-style-dispatchers '(orderless-affix-dispatch)) ;; (orderless-component-separator #'orderless-escapable-split-on-space) (completion-styles '(orderless basic)) (completion-category-overrides '((file (styles partial-completion)))) (completion-category-defaults nil) ;; Disable defaults, use our settings (completion-pcm-leading-wildcard t)) ;; Emacs 31: partial-completion behaves like substring #+end_src ** Spell checking *** Cape #+begin_src emacs-lisp (use-package cape :ensure t ;; For nixos only :init ;; Add dictionary completion (add-to-list 'completion-at-point-functions #'cape-dict) ;; :custom ;; (cape-dict-file "/run/current-system/sw/share/hunspell/en_US.dic") ;; For nixos only ) #+end_src ** hunspell install hunspell for spell checking to work #+begin_src emacs-lisp (setq ispell-program-name "hunspell") (setq ispell-dictionary "en_US") #+end_src * SSH ** SSH Agency #+begin_src emacs-lisp (use-package ssh-agency :defer t) #+end_src * Emacs Memory #+begin_src emacs-lisp (recentf-mode 1) ;; enables M-x recentf-open-files (setq history-length 25) ;; Limit history length to speed up emacs startup time this only effect every history lists that don’t specify their own maximum lengths (save-place-mode 1) ;; Remember and restore the last cursor location of opened files (savehist-mode 1) ;; Save what you enter into minibuffer prompts #+end_src * Magit :soy: #+begin_src emacs-lisp (use-package magit :defer t) #+end_src ** Magit todos :soy: #+begin_src emacs-lisp (use-package magit-todos :after magit :commands (magit-todos-mode) :custom (magit-todos-nice nil) ;; ((magit-todos-git-grep-extra-args (list "-n"))) (magit-todos-scanner 'magit-todos--scan-with-rg) ;; (magit-todos-depth 100) :config (magit-todos-mode 1)) #+end_src * Projectile :soy: #+begin_src emacs-lisp (use-package projectile :defer t :custom ;;Allowing per project compilation command (projectile-per-project-compilation-buffer t) :config (projectile-global-mode)) #+end_src ** Projectile Ripgrep :soy: #+begin_src emacs-lisp (use-package projectile-ripgrep :after projectile) #+end_src * Crdt #+begin_src emacs-lisp (use-package crdt :defer t) #+end_src * Dokuwiki #+begin_src emacs-lisp (use-package dokuwiki :defer t :custom (dokuwiki-xml-rpc-url "https://wiki.roboces.dev/lib/exe/xmlrpc.php") (dokuwiki-login-user-name "superuser")) #+end_src ** Dokuwiki Mode #+begin_src emacs-lisp (use-package dokuwiki-mode :after dokuwiki) #+end_src * ETC #+begin_src emacs-lisp (setq back-directory-alist '(("." . "~/.config/emacs/backups/"))) ;; so you dont get backup files ending with ~ in the same folder as the file NOTE:maybe there is a way to use the $EMACSDIR instead of Specifying it here (setq use-dialog-box nil) ;; Don't pop up UI dialogs when prompting (global-auto-revert-mode 1) ;; Revert buffers when the underlying file has changed (setq global-auto-revert-non-file-buffers t ) ;; Revert Dired and other buffers (context-menu-mode 1) ;; right click menu (xterm-mouse-mode 1) ;; mouse support in the terminal (setq echo-keystrokes 0.001) ;; make keybinds appear faster after the echo area however overwritten by which-key-idle-delay ;; (global-subword-mode 1) ;; for SubWords!! (auto-save-visited-mode 1) ;; read the documentation to get the behavior you want to be exact both auto-save-visited-interval and auto-save-visited-predicate #+end_src * Custom file Move customization variables to a separate file and load it #+begin_src emacs-lisp (setq custom-file (locate-user-emacs-file "custom.el")) (load custom-file 'noerror 'nomessage) #+end_src * Keybinds yes this is very silly but also very useful for setting generic keybinds #+begin_src emacs-lisp ;;(use-package emacs ;;:disabled t ;;:bind ;; keybinds are defined here ;;) #+end_src * Keybinds bind repeat to a better key #+begin_src emacs-lisp ;;(global-set-key (kbd "C-.") #'repeat) #+end_src #+begin_src emacs-lisp (defun enlarge-window-minibuf () (interactive) (let ((are 0)) (setq are (read-from-minibuffer "Size offset: " nil nil 1 nil 0 1)) (enlarge-window are))) (defun move-to-window-line-minibuf () (interactive) (let ((are 0)) (setq are (read-from-minibuffer "Line offset: " nil nil 1 nil 0 1)) (move-to-window-line are))) ;;See: https://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs (defvar my-keys-minor-mode-map (let ((map (make-sparse-keymap))) ;; Windmove/winner mappings (define-key map (kbd "C-c h") 'windmove-left) (define-key map (kbd "C-c j") 'windmove-down) (define-key map (kbd "C-c k") 'windmove-up) (define-key map (kbd "C-c l") 'windmove-right) (define-key map (kbd "C-c u") 'winner-undo) ;; Map inverse transpose (define-key map (kbd "C-S-t") (lambda () (interactive) (transpose-chars -1))) ;; Use regex search tools (define-key map (kbd "C-s") 'isearch-forward-regexp) (define-key map (kbd "C-r") 'isearch-backward-regexp) ;; Kill whole line (define-key map (kbd "C-z") 'kill-whole-line) ;;Function key shenanigans (define-key map [f5] 'eval-buffer) (define-key map [f6] 'comment-region) (define-key map [f9] (lambda () (interactive) (find-file user-init-file)) ) (define-key map [f8] 'projectile-find-file) (define-key map [f7] 'projectile-compile-project) (define-key map [f10] (lambda () (interactive) (kill-buffer "*compilation*"))) ;; info-apropos mapping (define-key map (kbd "C-c a") 'info-apropos) ;; Rectangle mark mode and insert (define-key map (kbd "C-c SPC") 'string-insert-rectangle) (define-key map (kbd "C-x SPC") 'rectangle-mark-mode) ;;frame size control (global-set-key (kbd "C-x C-c") 'toggle-frame-maximized) ;; Enlarge/shrink windows (define-key map (kbd "C-c w") 'enlarge-window-minibuf) ;;Move one vertical amount of lines / end - beginning buffer (define-key map (kbd "C-c e") 'move-to-window-line-minibuf) ;;emms bindings (define-key map (kbd "C-c +") 'emms-volume-mode-plus) (define-key map (kbd "C-c -") 'emms-volume-mode-minus) (define-key map (kbd "C-c )") 'emms-next) (define-key map (kbd "C-c (") 'emms-previous) (define-key map (kbd "C-c *") 'emms-pause) ;; On-home-row cycling through buffers (define-key map (kbd "C-c n") 'previous-buffer) (define-key map (kbd "C-c m") 'next-buffer) ;; On-home-row point movement ;; (define-key map (kbd "C-; j") 'next-line) ;; (define-key map (kbd "C-; l") 'previous-line) ;; (define-key map (kbd "C-; ;") 'forward-char) ;; (define-key map (kbd "C-; ñ") 'forward-char) ;; (define-key map (kbd "C-; j") 'backward-char) ;; Move forward word by word ;; (define-key map (kbd "C-f") 'forward-word) ;; (define-key map (kbd "C-b") 'backward-word) ;; Map delete/backspace ;; (define-key map (kbd "C-S-d") (lambda () (interactive) (backward-delete-char-untabify 1))) ;; Map RET ;;(define-key map (kbd "C-i") (lambda () (interactive) (newline))) ;; TODO: Remap up/downcase to region instead of word - not working ;; (put 'downcase-region 'disabled nil) ;; (put 'upcase-region 'disabled nil) ;; (define-key map (kbd "M-S-l") (lambda () (interactive) (upcase-region))) ;; (define-key map (kbd "M-l") (lambda () (interactive) (downcase-region))) ;; Map scroll line by line ;;(define-key map (kbd "M-i") (lambda () (interactive) (scroll-up 1)) ) ;;(define-key map (kbd "M-p") (lambda () (interactive) (scroll-down 1)) ) ;; Old-school cycle windows ;; (define-key map (kbd "C-x C-u") (lambda () (interactive) (other-window -1))) ;; (define-key map (kbd "C-x C-o") (lambda () (interactive) (other-window 1))) ;; Dired-jump and delete-blank-lines ;;(define-key map (kbd "C-x u") 'dired-jump) ;;(define-key map (kbd "C-x o") 'delete-blank-lines) ;;; On-home-row cycling through buffers ;; (define-key map (kbd "C-x C-j") 'previous-buffer) ;; (define-key map (kbd "C-x C-ñ") 'next-buffer) ;; (define-key map (kbd "C-x C-;") 'next-buffer) ;;Undo/redo and kill line ;; (define-key map (kbd "C-n") 'undo) ;; (define-key input-decode-map [?\C-m] [C-m]) ;; (define-key map (kbd "") 'undo-redo) ;;zap-to-char M-z, toggle-input-method C-\, transpose-chars C-t ;; (define-key map (kbd "M-b") 'backward-char) ;; (define-key map (kbd "M-f") 'forward-char) ;; (global-set-key (kbd "C-.") 'end-of-buffer) ;; (global-set-key (kbd "M-.") 'beginning-of-buffer) map) "my-keys-minor-mode keymap.") (define-minor-mode my-keys-minor-mode "A minor mode so that my key settings override annoying major modes." :init-value t :lighter " my-keys") (my-keys-minor-mode 1) #+end_src * Major modes ** Gnus for when you join the cult 😈 #+begin_src emacs-lisp (use-package gnus :disabled :defer t :custom ;; Make Gnus more asynchronous (gnus-asynchronous t) ;; Sane newsrc management (gnus-always-read-dribble-file t) (gnus-save-newsrc-file nil) (gnus-read-newsrc-file nil) (gnus-save-newsrc-file nil) (gnus-read-newsrc-file nil) (gnus-startup-file "~/.config/emacs/newsrc") ;; Make gnus remember everything (gnus-registry-use t) (gnus-registry-track-extra t) (gnus-suppress-duplicates t) ;; check Message-ID to make sure you only read an artical once (mm-text-html-renderer 'gnus-w3m) ;; Enable image support (gnus-inhibit-images nil) (gnus-blocked-images nil) ;; Set scoring for things other than FROM: header (gnus-extra-headers '(To Cc X-Feedname Newsgroups Keywords) nnmail-extra-headers gnus-extra-headers) (nnmail-debug-splitting t) (gnus-search-use-parsed-queries t) ;; same syntax for all search backends ;; Make Gnus backend agnostic (gnus-select-method '(nnnil)) ;; Backends (gnus-secondary-select-methods '(;; (nntp "news.gmane.io") ;; best usenet sever ever can be used to view mailing lists without actualy joining them disabled by default for load time (nnmaildir "" ;; The best way to view rss in Gnus is via fethcing them from sfeed then piping into mbox file then using fdm script to turn every feed into a maildir folder dm me about it (directory "~/mail/rss/") (nnmaildir-get-new-mail t)))) :bind (("C-x g" . gnus))) #+end_src ** Vterm #+begin_src emacs-lisp (use-package vterm :defer t) #+end_src *** Eshell vterm #+begin_src emacs-lisp (use-package eshell-vterm :after eshell :config (eshell-vterm-mode 1) (add-to-list 'eshell-visual-commands "htop") (add-to-list 'eshell-visual-commands "ssh") (add-to-list 'eshell-visual-commands "nvim") (add-to-list 'eshell-visual-commands "less") (add-to-list 'eshell-visual-commands "watch") (add-to-list 'eshell-visual-commands "yazi") (add-to-list 'eshell-visual-commands "top") (add-to-list 'eshell-visual-commands "btop") (add-to-list 'eshell-visual-commands "wiremix") ) #+end_src ** Emms Your Emacs media Centor and manager (or just a fany .m3a files client if you want that way) #+begin_src emacs-lisp (use-package emms :defer t :init ;; set this function as your browser for sites like youtube (defun my-browse-url-emms (url &rest _args) "Play URL with EMMS." (emms-add-url url)) :config (emms-all) ;; this enables everything that package can do which makes it really heavy and slow but its recommended at the start to know all the features of the package (setq-default emms-player-list '(emms-player-mpv) emms-player-mpv-environment '("PULSE_PROP_media.role=music") emms-volume-change-function 'emms-volume-mpv-change emms-volume-mpv-method 'smart emms-info-functions '(emms-info-native)) ;; (emms-default-players) ;; use this if you want to set mpv and only mpv as your default player ;;(add-to-list 'emms-player-list 'emms-player-mpv) (emms-history-load) ) #+end_src ** Yeetube #+BEGIN_SRC emacs-lisp (use-package yeetube :disabled nil :defer t :init (define-prefix-command 'my/yeetube-map) ;;(setf yeetube-filter "Views") (setf yeetube-filter "Likes") :config (setf yeetube-play-function #'emms-play-url) (setf yeetube-play-function #'browse-url) :bind (("C-x y" . 'my/yeetube-map) :map my/yeetube-map ("s" . 'yeetube-search) ("b" . 'yeetube-play-saved-video) ("d" . 'yeetube-download-videos) ("p" . 'yeetube-mpv-toggle-pause) ("v" . 'yeetube-mpv-toggle-video) ("V" . 'yeetube-mpv-toggle-no-video-flag) ("k" . 'yeetube-remove-saved-video))) #+END_SRC ** dired #+begin_src emacs-lisp (setq image-animate-loop t) ;; gif support in emacs (add-hook 'image-mode-hook #'image-toggle-animation) #+end_src *** Dired Preview #+begin_src emacs-lisp (use-package dired-preview ;;:disabled t :after dired :custom ;; Default values for demo purposes (dired-preview-delay 0.001) ;; cant be a 0 or it will translate to 0.1 (dired-preview-max-size (expt 2 20)) (dired-preview-ignored-extensions-regexp (concat "\\." "\\(gz\\|" "zst\\|" "tar\\|" "xz\\|" "rar\\|" "zip\\|" "iso\\|" "epub" "\\)")) :config ;; Enable `dired-preview-mode' in a given Dired buffer or do it ;; globally: (dired-preview-global-mode 1) ) #+end_src ** Marginalia #+begin_src emacs-lisp ;; Enable rich annotations using the Marginalia package (use-package marginalia ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. :bind (:map minibuffer-local-map ("M-A" . marginalia-cycle)) ;; The :init section is always executed. :init ;; Marginalia must be activated in the :init section of use-package such that ;; the mode gets enabled right away. Note that this forces loading the ;; package. (marginalia-mode)) #+end_src