34 KiB
Hane's GNU Emacs Config
- TABLE OF CONTENTS
- LOAD FIRST
- Package management
- UI
- Window Navigation
- Help System
- LANGUAGE SUPPORT
- Completion
- SSH
- Emacs Memory
- Magit
- Projectile
- Crdt
- Dokuwiki
- ETC
- Custom file
- Keybinds
- Major modes
TABLE OF CONTENTS toc
LOAD FIRST
Startup Time
(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)
Package management
Package
(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
)
Use Packages
(setq use-package-always-ensure t)
;; (setq use-package-always-defer t)
Disable native compilation warnings
(setq native-comp-async-report-warnings-errors nil)
try
(use-package try
:defer t)
UI
Disable Menubar, Toolbars and Scrollbars
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
Dashboard
(use-package dashboard
:ensure t
:config
(dashboard-setup-startup-hook)
;;Logo image
(setq dashboard-startup-banner (cons "~/.emacs.d/logo2.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)
Line wrap and line number
(global-visual-line-mode t)
(global-display-line-numbers-mode t)
Font
Nice font try it
;; (set-face-attribute 'default nil
;; :font "FiraCode Nerd Font"
;; )
Scratch Buffer
(setq initial-major-mode 'org-mode) ;; start in org mode
(setq initial-scratch-message nil)
Startup screen
(setq inhibit-startup-screen t)
Themes
I look down on for not using modus-vivendi-tinted
Tango-dark
;(load-theme 'tango-dark)
Pink-bliss-uwu
;; (use-package pink-bliss-uwu-theme
;; :config
;; (load-theme 'pink-bliss-uwu t)
;; :custom
;; (pink-bliss-uwu-use-custom-font nil))
Modus
(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
(("<f5>" . modus-themes-load-random-dark)
("C-<f5>" . modus-themes-select)
("M-<f5>" . 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)
)
ef-themes
(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 <https://protesilaos.com/emacs/ef-themes#h:6585235a-5219-4f78-9dd5-6a64d87d1b6e>
(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)
)
Selection overwrite
(delete-selection-mode t)
(setq scroll-step 1)
(setq scroll-margin 5) ;; add few margin lines at top and bottom
Ibuffer fix
(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")
)
Window Navigation
Mouse
(setq mouse-autoselect-window t)
Windmove
(use-package windmove
:custom
(windmove-create-window 1)
:config
(windmove-default-keybindings)
(windmove-default-keybindings 'ctrl))
Winner Mode
(winner-mode 1)
Repeat mode
(use-package repeat
:init (repeat-mode)
:bind (("C-." . repeat)))
Help System
Which Key
(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))
embark
Shows all actions on point NOTE: Meh.
(use-package embark
:defer t)
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?
;; (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))
Org Mode
Show Images in Org Mode
;; show images in org
(setq org-startup-with-inline-images t)
Enabling Table of Contents fix
(use-package toc-org
:disabled
:commands toc-org-enable
;; :init (add-hook 'org-mode-hook 'toc-org-enable))
:hook (org-mode . toc-org-enable))
Enabling Org Bullets
Org-bullets gives us attractive bullets rather than asterisks.
;;(add-hook 'org-mode-hook 'org-indent-mode)
;;(use-package org-bullets)
;;(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
Diminish Org Indent Mode
Removes "Ind" from showing in the modeline.
(eval-after-load 'org-indent '(diminish 'org-indent-mode))
Org Level Headers
(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)))))
Org Todo
(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))))
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
(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")))
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 '<s' followed by TAB to expand to a begin_src tag. Other expansions available include:
| Typing the below + TAB | Expands to … |
|---|---|
| <a | '#+BEGIN_EXPORT ascii' … '#+END_EXPORT |
| <c | '#+BEGIN_CENTER' … '#+END_CENTER' |
| <C | '#+BEGIN_COMMENT' … '#+END_COMMENT' |
| <e | '#+BEGIN_EXAMPLE' … '#+END_EXAMPLE' |
| <E | '#+BEGIN_EXPORT' … '#+END_EXPORT' |
| <h | '#+BEGIN_EXPORT html' … '#+END_EXPORT' |
| <l | '#+BEGIN_EXPORT latex' … '#+END_EXPORT' |
| <q | '#+BEGIN_QUOTE' … '#+END_QUOTE' |
| <s | '#+BEGIN_SRC' … '#+END_SRC' |
| <v | '#+BEGIN_VERSE' … '#+END_VERSE' |
(require 'org-tempo)
lua
(use-package lua-mode
:defer t)
Markdown
(use-package markdown-mode
:defer t
:custom
(markdown-command "multimarkdown"))
BBcode
Check the Wiki
(use-package bbcode-mode
:disabled t
:vc (:url "https://github.com/lassik/emacs-bbcode-mode.git"))
Completion
IComplete
;; (fido-mode 1)
;; (fido-vertical-mode 1) ;; for veritcal fido
;; (setq resize-mini-windows nil) ;; if you disabled fido-vertical-mode uncomment this so standard fido doesnt resize the echo area HOWEVER if you are using fido-vertical-mode and enabled this it will break
(use-package icomplete
:bind (:map icomplete-minibuffer-map
("C-n" . icomplete-forward-completions)
("C-p" . icomplete-backward-completions)
("<down>" . icomplete-forward-completions)
("<up>" . 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)
)
global-completion-preview-mode
This is what shows an unopinionated autocomplete suggestion. I love this implementation
(use-package completion-preview
:config
(global-completion-preview-mode)
(push 'org-self-insert-command completion-preview-commands))
Dabbrev
(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))
Abbrev
(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" "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Document</title>\n</head>\n<body>\n\n</body>\n</html>")
;; 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 <div>###2###</div>\n );\n};"
emacs-solo/abbrev--replace-placeholders))))
Orderless
;; 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
Spell checking
Cape
(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
)
hunspell
install hunspell for spell checking to work
(setq ispell-program-name "hunspell")
(setq ispell-dictionary "en_US")
SSH
SSH Agency
(use-package ssh-agency
:defer t)
Emacs Memory
(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
Magit soy
(use-package magit
:defer t)
Magit todos soy
(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))
Projectile soy
(use-package projectile
:defer t
:custom
;;Allowing per project compilation command
(projectile-per-project-compilation-buffer t)
:config
(projectile-global-mode))
Projectile Ripgrep soy
(use-package projectile-ripgrep
:after projectile)
Crdt
(use-package crdt
:defer t)
Dokuwiki
(use-package dokuwiki
:defer t
:custom
(dokuwiki-xml-rpc-url "https://wiki.roboces.dev/lib/exe/xmlrpc.php")
(dokuwiki-login-user-name "superuser"))
Dokuwiki Mode
(use-package dokuwiki-mode
:after dokuwiki)
ETC
(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
Custom file
Move customization variables to a separate file and load it
(setq custom-file (locate-user-emacs-file "custom.el"))
(load custom-file 'noerror 'nomessage)
Keybinds
yes this is very silly but also very useful for setting generic keybinds
;;(use-package emacs
;;:disabled t
;;:bind
;; keybinds are defined here
;;)
- Keybinds
bind repeat to a better key
;;(global-set-key (kbd "C-.") #'repeat)
(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 "<C-m>") '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)
Major modes
Gnus
for when you join the cult 😈
(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)))
Vterm
(use-package vterm
:defer t)
Eshell vterm
(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")
)
Emms
Your Emacs media Centor and manager (or just a fany .m3a files client if you want that way)
(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)
)
Yeetube
(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)))
dired
(setq image-animate-loop t) ;; gif support in emacs
(add-hook 'image-mode-hook #'image-toggle-animation)
Dired Preview
(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)
)
Marginalia
;; 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))