summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSakamoto <me@sakamoto.network>2026-08-16 15:34:00 -0500
committerSakamoto <me@sakamoto.network>2026-08-16 15:34:00 -0500
commitd51beea88d300cb5066bb92a8148cad52fa1091d (patch)
tree4357b4958c19dddd304a0d6ee77994fb9f12c118
parenta623fed63460d6d810605ce1ce858a58a5b222f7 (diff)
downloaddotfiles-d51beea88d300cb5066bb92a8148cad52fa1091d.tar.xz
dotfiles-d51beea88d300cb5066bb92a8148cad52fa1091d.zip
update
-rw-r--r--.chezmoi.toml.tmpl3
-rw-r--r--dot_config/emacs/init.el91
-rw-r--r--dot_config/emacs/lisp/avy-config.el176
-rw-r--r--dot_config/emacs/lisp/completion-config.el104
-rw-r--r--dot_config/emacs/lisp/doom-quit.el62
-rw-r--r--dot_config/emacs/lisp/editing-config.el41
-rw-r--r--dot_config/emacs/lisp/elfeed-config.el32
-rw-r--r--dot_config/emacs/lisp/emacs-config.el280
-rw-r--r--dot_config/emacs/lisp/email-config.el3
-rw-r--r--dot_config/emacs/lisp/embark-config.el11
-rw-r--r--dot_config/emacs/lisp/evil-config.el132
-rw-r--r--dot_config/emacs/lisp/git-config.el24
-rw-r--r--dot_config/emacs/lisp/gptel-config.el24
-rw-r--r--dot_config/emacs/lisp/irc-config.el35
-rw-r--r--dot_config/emacs/lisp/lsp-mode-config.el169
-rw-r--r--dot_config/emacs/lisp/meow-config.el233
-rw-r--r--dot_config/emacs/lisp/org-demo-macro.el66
-rw-r--r--dot_config/emacs/lisp/org-mode-config.el165
-rw-r--r--dot_config/emacs/lisp/pretty-config.el31
-rw-r--r--dot_config/emacs/lisp/reading-config.el26
-rw-r--r--dot_config/emacs/lisp/shell-config.el26
-rw-r--r--dot_config/foot/foot.ini10
-rw-r--r--dot_config/kanshi/config8
-rw-r--r--dot_config/notmuch/default/encrypted_config.asc32
-rw-r--r--dot_config/notmuch/default/hooks/encrypted_executable_post-new.asc10
-rw-r--r--dot_config/notmuch/default/hooks/encrypted_executable_pre-new.asc8
-rw-r--r--dot_config/nvim/lazy-lock.json22
-rw-r--r--dot_config/nvim/lua/plugins/trash/autopairs.luaa7
-rw-r--r--dot_config/nvim/lua/plugins/trash/crates.luaa17
-rw-r--r--dot_config/nvim/lua/plugins/trash/grapple.luaa14
-rw-r--r--dot_config/nvim/lua/plugins/trash/leetcode.luaa12
-rw-r--r--dot_config/nvim/lua/plugins/trash/mini-pairs.luaa1
-rw-r--r--dot_config/nvim/lua/plugins/trash/neck.luaa1
-rw-r--r--dot_config/nvim/lua/plugins/trash/neogit.luaa9
-rw-r--r--dot_config/nvim/lua/plugins/trash/neorg.luaa24
-rw-r--r--dot_config/nvim/lua/plugins/trash/neorg.luaaa24
-rw-r--r--dot_config/nvim/lua/plugins/trash/neotest.luaa82
-rw-r--r--dot_config/nvim/lua/plugins/trash/noice.luaa23
-rw-r--r--dot_config/nvim/lua/plugins/trash/nvim-surround.luaa10
-rw-r--r--dot_config/nvim/lua/plugins/trash/orgmode.luaa19
-rw-r--r--dot_config/nvim/lua/plugins/trash/persistence.luaa8
-rw-r--r--dot_config/nvim/lua/plugins/trash/scroll.luaa38
-rw-r--r--dot_config/nvim/lua/plugins/trash/tabout.luaa31
-rw-r--r--dot_config/paru/paru.conf2
-rw-r--r--dot_config/private_mpv/input.conf9
-rw-r--r--dot_config/private_mpv/mpv.conf1
-rw-r--r--dot_config/private_senpai/encrypted_private_senpai.scfg.asc10
-rw-r--r--dot_config/rustypaste/encrypted_config.toml.asc12
-rw-r--r--dot_config/waybar-crypto/encrypted_config.ini.asc13
-rw-r--r--encrypted_dot_mbsyncrc.asc22
50 files changed, 1871 insertions, 342 deletions
diff --git a/.chezmoi.toml.tmpl b/.chezmoi.toml.tmpl
new file mode 100644
index 0000000..0244c18
--- /dev/null
+++ b/.chezmoi.toml.tmpl
@@ -0,0 +1,3 @@
+encryption = "gpg"
+[gpg]
+ recipient = "me@sakamoto.network"
diff --git a/dot_config/emacs/init.el b/dot_config/emacs/init.el
new file mode 100644
index 0000000..a7ad5d3
--- /dev/null
+++ b/dot_config/emacs/init.el
@@ -0,0 +1,91 @@
+;;; Performance hacks
+(setq gc-cons-threshold #x40000000)
+(setq read-process-output-max (* 1024 1024 4))
+(setq native-comp-jit-compilation t)
+
+;;; MELPA setup
+(require 'package)
+(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
+(setq use-package-always-ensure t)
+(setq package-install-upgrade-built-in t)
+
+(add-to-list 'load-path "~/.config/emacs/lisp/")
+
+;;; External packages
+(require 'emacs-config)
+(require 'lsp-mode-config)
+(require 'elfeed-config)
+(require 'completion-config)
+(require 'doom-quit)
+(require 'org-mode-config)
+(require 'editing-config)
+(require 'gptel-config)
+(require 'irc-config)
+(require 'reading-config)
+(require 'git-config)
+(require 'pretty-config)
+(require 'email-config)
+(require 'embark-config)
+(require 'shell-config)
+(require 'avy-config)
+;; (require 'evil-config)
+;; (require 'meow-config)
+
+(use-package pass)
+
+(use-package docker
+ :ensure t
+ :bind ("C-c d" . docker))
+
+(use-package project-x
+ :ensure t
+ :after project
+ :config
+ (setq project-x-auto-save-delay 5)
+ (project-x-mode 1))
+
+(use-package popper
+ :ensure t
+ :bind (("C-`" . popper-toggle)
+ ("M-`" . popper-cycle)
+ ("C-M-`" . popper-toggle-type))
+ :init
+ (setq popper-reference-buffers
+ '(("^\\*Warnings\\*$" . hide)
+ ("^\\*Compile-Log\\*$" . hide)
+ "^\\*Backtrace\\*"
+ "^\\*Apropos"
+ "^Calc:"
+ "^\\*eldoc\\*"
+ "^\\*TeX errors\\*"
+ "^\\*ielm\\*"
+ "^\\*TeX Help\\*"
+ "\\*Shell Command Output\\*"
+ "\\*Async Shell Command\\*"
+ ("\\*Detached Shell Command\\*" . hide)
+ "\\*Completions\\*"
+ "^\\*Org QL View:notmuch-links\\*$"
+ ;; "\\*scratch.*\\*$"
+ "[Oo]utput\\*"
+ calendar-mode
+ Man-mode
+ fennel-repl-mode
+ grep-mode
+ occur-mode
+ compilation-mode
+ messages-buffer-mode
+ help-mode
+ compilation-mode))
+ (setq popper-group-function #'popper-group-by-directory)
+ (popper-mode +1)
+ (popper-echo-mode +1)) ; For echo area hints
+
+(use-package inhibit-mouse
+ :custom
+ (inhibit-mouse-adjust-mouse-highlight t)
+ (inhibit-mouse-adjust-show-help-function t)
+
+ :init
+ (if (daemonp)
+ (add-hook 'server-after-make-frame-hook #'inhibit-mouse-mode)
+ (inhibit-mouse-mode 1)))
diff --git a/dot_config/emacs/lisp/avy-config.el b/dot_config/emacs/lisp/avy-config.el
new file mode 100644
index 0000000..50c14ce
--- /dev/null
+++ b/dot_config/emacs/lisp/avy-config.el
@@ -0,0 +1,176 @@
+;;; tweaked from karthink's .emacs.d
+
+(use-package avy
+ :ensure t
+ :commands (avy-goto-word-1 avy-goto-char-2 avy-goto-char-timer)
+ :config
+ (setq avy-timeout-seconds 0.4)
+ (setq avy-keys '(?a ?r ?s ?t ?g ?m ?n ?e ?i ?o ?'
+ ?q ?w ?f ?p ?b ?j ?l ?u ?y ?\; ?-
+ ?z ?x ?c ?d ?v ?k ?h ?, ?. ?/))
+
+ (setq avy-single-candidate-jump nil)
+ (setq avy-dispatch-alist '((?m . avy-action-mark)
+ (?$ . avy-action-ispell)
+ (?z . avy-action-zap-to-char)
+ (? . avy-action-embark)
+ (?= . avy-action-define)
+ (23 . avy-action-zap-to-char)
+ (?c . avy-action-mark-to-char)
+ (?h . avy-action-helpful)
+ (?x . avy-action-exchange)
+
+ (11 . avy-action-kill-line)
+ (25 . avy-action-yank-line)
+
+ (?w . avy-action-easy-kill)
+ (?k . avy-action-kill-stay)
+ (?y . avy-action-yank)
+ (?t . avy-action-teleport)
+
+ (?W . avy-action-copy-whole-line)
+ (?K . avy-action-kill-whole-line)
+ (?Y . avy-action-yank-whole-line)
+ (?T . avy-action-teleport-whole-line)))
+
+ ;; Improved to include transposition by hylophile
+ (defun avy-action-easy-kill (pt)
+ (unless (require 'easy-kill nil t)
+ (user-error "Easy Kill not found, please install."))
+ (cl-letf* ((bounds (cond
+ ((use-region-p)
+ (prog1 (cons (region-beginning) (region-end))
+ (deactivate-mark)))
+ ((bounds-of-thing-at-point 'sexp))
+ (t (cons (point) (point)))))
+ (transpose-map
+ (define-keymap
+ "M-t" (lambda () (interactive "*")
+ (pcase-let ((`(,beg . ,end) (easy-kill--bounds)))
+ (transpose-regions (car bounds) (cdr bounds) beg end
+ 'leave-markers)))))
+ ((symbol-function 'easy-kill-activate-keymap)
+ (lambda ()
+ (let ((map (easy-kill-map)))
+ (set-transient-map
+ (make-composed-keymap transpose-map map)
+ (lambda ()
+ ;; Prevent any error from activating the keymap forever.
+ (condition-case err
+ (or (and (not (easy-kill-exit-p this-command))
+ (or (eq this-command
+ (lookup-key map (this-single-command-keys)))
+ (let ((cmd (key-binding
+ (this-single-command-keys) nil t)))
+ (command-remapping cmd nil (list map)))))
+ (ignore
+ (easy-kill-destroy-candidate)
+ (unless (or (easy-kill-get mark) (easy-kill-exit-p this-command))
+ (easy-kill-save-candidate))))
+ (error (message "%s:%s" this-command (error-message-string err))
+ nil)))
+ (lambda ()
+ (let ((dat (ring-ref avy-ring 0)))
+ (select-frame-set-input-focus
+ (window-frame (cdr dat)))
+ (select-window (cdr dat))
+ (goto-char (car dat)))))))))
+ (goto-char pt)
+ (easy-kill)))
+
+ (defun avy-action-exchange (pt)
+ "Exchange sexp at PT with the one at point."
+ (set-mark pt)
+ (transpose-sexps 0))
+
+ (defun avy-action-helpful (pt)
+ (save-excursion
+ (goto-char pt)
+ (call-interactively #'display-local-help))
+ (select-window
+ (cdr (ring-ref avy-ring 0)))
+ t)
+
+ (defun avy-action-define (pt)
+ (cl-letf (((symbol-function 'keyboard-quit)
+ #'abort-recursive-edit))
+ (save-excursion
+ (goto-char pt)
+ (dictionary-search-dwim))
+ (select-window
+ (cdr (ring-ref avy-ring 0))))
+ t)
+
+ (defun avy-action-embark (pt)
+ (unwind-protect
+ (save-excursion
+ (goto-char pt)
+ (embark-act))
+ (select-window
+ (cdr (ring-ref avy-ring 0))))
+ t)
+
+ (defun avy-action-kill-line (pt)
+ (unwind-protect
+ (save-excursion
+ (goto-char pt)
+ (kill-line))
+ (avy-resume))
+ (select-window
+ (cdr (ring-ref avy-ring 0)))
+ t)
+
+ (defun avy-action-copy-whole-line (pt)
+ (save-excursion
+ (goto-char pt)
+ (cl-destructuring-bind (start . end)
+ (bounds-of-thing-at-point 'line)
+ (copy-region-as-kill start end)))
+ (select-window
+ (cdr
+ (ring-ref avy-ring 0)))
+ t)
+
+ (defun avy-action-kill-whole-line (pt)
+ (unwind-protect
+ (save-excursion
+ (goto-char pt)
+ (kill-whole-line)
+ (avy-resume)))
+ (select-window
+ (cdr
+ (ring-ref avy-ring 0)))
+ t)
+
+ (defun avy-action-yank-whole-line (pt)
+ (avy-action-copy-whole-line pt)
+ (save-excursion (yank))
+ t)
+
+ (defun avy-action-teleport-whole-line (pt)
+ (avy-action-kill-whole-line pt)
+ (save-excursion (yank)) t)
+
+ (defun avy-action-mark-to-char (pt)
+ (activate-mark)
+ (goto-char pt))
+
+ :bind (("C-M-'" . avy-resume)
+ ("C-'" . avy-goto-char-this-window)
+ ("M-j" . avy-goto-char-timer)
+ ("M-s y" . avy-copy-line)
+ ("M-s M-y" . avy-copy-region)
+ ("M-s M-k" . avy-kill-whole-line)
+ ("M-s j" . avy-goto-char-2)
+ ("M-s M-p" . avy-goto-line-above)
+ ("M-s M-n" . avy-goto-line-below)
+ ("M-s M-l" . avy-goto-end-of-line)
+ ("M-s C-w" . avy-kill-region)
+ ("M-s M-w" . avy-kill-ring-save-region)
+ ("M-s t" . avy-move-line)
+ ("M-s M-t" . avy-move-region)
+ :map isearch-mode-map
+ ("C-'" . avy-isearch)
+ ("M-j" . avy-isearch)))
+
+(provide 'avy-config)
diff --git a/dot_config/emacs/lisp/completion-config.el b/dot_config/emacs/lisp/completion-config.el
new file mode 100644
index 0000000..75c184a
--- /dev/null
+++ b/dot_config/emacs/lisp/completion-config.el
@@ -0,0 +1,104 @@
+;; Modern interactive completion framework for the minibuffer
+(use-package vertico
+ :hook
+ (after-init . vertico-mode) ;; Enable vertico after Emacs has initialized.
+ :custom
+ (vertico-cycle nil) ;; Do not cycle through candidates when reaching the end of the list.
+ :config
+ ;; Customize the display of the current candidate in the completion list.
+ ;; This will prefix the current candidate with “» ” to make it stand out.
+ ;; Reference: https://github.com/minad/vertico/wiki#prefix-current-candidate-with-arrow
+ (advice-add #'vertico--format-candidate :around
+ (lambda (orig cand prefix suffix index _start)
+ (setq cand (funcall orig cand prefix suffix index _start))
+ (concat
+ (if (= vertico--index index)
+ (propertize "» " 'face '(:foreground "#80adf0" :weight bold))
+ " ")
+ cand))))
+
+(use-package which-key
+ :ensure nil
+ :config
+ (which-key-mode 1))
+
+(use-package orderless
+ :defer t ;; Load Orderless on demand.
+ :after vertico ;; Ensure Vertico is loaded before Orderless.
+ :init
+ (setq completion-styles '(orderless basic) ;; Set the completion styles.
+ completion-category-defaults nil ;; Clear default category settings.
+ completion-category-overrides '((file (styles partial-completion))))) ;; Customize file completion styles.
+
+;; Marginalia enhances the completion experience in Emacs by adding
+;; additional context to the completion candidates. This includes
+;; helpful annotations such as documentation and other relevant
+;; information, making it easier to choose the right option.
+(use-package marginalia
+ :hook
+ (after-init . marginalia-mode))
+
+;;; CONSULT
+;; Consult provides powerful completion and narrowing commands for Emacs.
+;; It integrates well with other completion frameworks like Vertico, enabling
+;; features like previews and enhanced register management. It's useful for
+;; navigating buffers, files, and xrefs with ease.
+(use-package consult
+ :ensure t
+ :defer t
+ :init
+ ;; Enhance register preview with thin lines and no mode line.
+ (advice-add #'register-preview :override #'consult-register-window)
+
+ ;; Use Consult for xref locations with a preview feature.
+ (setq xref-show-xrefs-function #'consult-xref
+ xref-show-definitions-function #'consult-xref)
+
+ :bind (;; C-x bindings in `ctl-x-map'
+ ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command
+ ("C-x b" . consult-buffer) ;; orig. switch-to-buffer
+ ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window
+ ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame
+ ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab
+ ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump
+ ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer
+ ;; Custom M-# bindings for fast register access
+ ("M-#" . consult-register-load)
+ ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated)
+ ("C-M-#" . consult-register)
+ ;; Other custom bindings
+ ("M-y" . consult-yank-pop) ;; orig. yank-pop
+ ;; M-g bindings in `goto-map'
+ ("M-g e" . consult-compile-error)
+ ("M-g r" . consult-grep-match)
+ ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck
+ ("M-g g" . consult-goto-line) ;; orig. goto-line
+ ("M-g M-g" . consult-goto-line) ;; orig. goto-line
+ ("M-g o" . consult-outline) ;; Alternative: consult-org-heading
+ ("M-g m" . consult-mark)
+ ("M-g k" . consult-global-mark)
+ ("M-g i" . consult-imenu)
+ ("M-g I" . consult-imenu-multi)
+ ;; M-s bindings in `search-map'
+ ("M-s d" . consult-find) ;; Alternative: consult-fd
+ ("M-s c" . consult-locate)
+ ("M-s g" . consult-grep)
+ ("M-s G" . consult-git-grep)
+ ("M-s r" . consult-ripgrep)
+ ("M-s l" . consult-line)
+ ("M-s L" . consult-line-multi)
+ ("M-s k" . consult-keep-lines)
+ ("M-s u" . consult-focus-lines)
+ ;; Isearch integration
+ ("M-s e" . consult-isearch-history)
+ :map isearch-mode-map
+ ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string
+ ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string
+ ("M-s l" . consult-line) ;; needed by consult-line to detect isearch
+ ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch
+ ;; Minibuffer history
+ :map minibuffer-local-map
+ ("M-s" . consult-history) ;; orig. next-matching-history-element
+ ("M-r" . consult-history))) ;; orig. previous-matching-history-element
+
+(provide 'completion-config)
diff --git a/dot_config/emacs/lisp/doom-quit.el b/dot_config/emacs/lisp/doom-quit.el
new file mode 100644
index 0000000..009aff0
--- /dev/null
+++ b/dot_config/emacs/lisp/doom-quit.el
@@ -0,0 +1,62 @@
+(defvar +doom-quit-messages
+ `(;; from Doom 1
+ "Please don't leave, there's more demons to toast!"
+ "Let's beat it -- This is turning into a bloodbath!"
+ ,(format "I wouldn't leave if I were you. %s is much worse."
+ (if (featurep :system 'windows) "DOS" "UNIX"))
+ "Don't leave yet -- There's a demon around that corner!"
+ "Ya know, next time you come in here I'm gonna toast ya."
+ "Go ahead and leave. See if I care."
+ "Are you sure you want to quit this great editor?"
+ ;; from Doom 2
+ ,(format "Don't go now, there's a dimensional shambler waiting at the %s prompt!"
+ (if (featurep :system 'windows) "DOS" "UNIX"))
+ "Get outta here and go back to your boring operating system."
+ "Look, bud. You leave now and you forfeit your body count!"
+ "Just leave. When you come back, I'll be waiting with a bat."
+ "You're lucky I don't smack you for thinking about leaving."
+ ;; from Portal
+ "Thank you for participating in this Aperture Science computer-aided enrichment activity."
+ "You can't fire me, I quit!"
+ "I don't know what you think you are doing, but I don't like it. I want you to stop."
+ "This isn't brave. It's murder. What did I ever do to you?"
+ "I'm the man who's going to burn your house down! With the lemons!"
+ "Okay, look. We've both said a lot of things you're going to regret..."
+ ;; Custom
+ "(setq nothing t everything 'permitted)"
+ "Emacs will remember that."
+ "Emacs, Emacs never changes."
+ "Hey! Hey, M-x listen!"
+ "It's not like I'll miss you or anything, b-baka!"
+ "Wake up, Mr. Stallman. Wake up and smell the ashes."
+ "You are *not* prepared!"
+ "Please don't go. The drones need you. They look up to you."
+ "Don't forget, you're here forever.")
+ "A list of quit messages, picked randomly by `+doom-quit'. Taken from
+http://doom.wikia.com/wiki/Quit_messages and elsewhere.")
+
+(defun +doom-quit-fn (&rest _)
+ (doom-quit-p
+ (format "%s %s"
+ (propertize (nth (random (length +doom-quit-messages))
+ +doom-quit-messages)
+ 'face '(italic default))
+ "Really quit Emacs?")))
+
+
+(defun doom-quit-p (&optional prompt)
+ (if use-dialog-box
+ (x-popup-dialog
+ t `("Really quit Emacs?"
+ ("Yes" . t)
+ ("Cancel" . nil)))
+ (let ((confirmed (y-or-n-p (format "%s" (or prompt "Really quit Emacs?")))))
+ (if confirmed
+ t
+ (progn
+ (message "Aborted")
+ nil)))))
+
+(setq confirm-kill-emacs #'+doom-quit-fn)
+
+(provide 'doom-quit)
diff --git a/dot_config/emacs/lisp/editing-config.el b/dot_config/emacs/lisp/editing-config.el
new file mode 100644
index 0000000..3df8a99
--- /dev/null
+++ b/dot_config/emacs/lisp/editing-config.el
@@ -0,0 +1,41 @@
+(use-package expreg
+ :bind
+ ("C-=" . expreg-expand)
+ :config
+ (defvar expreg-repeat-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "=" #'expreg-expand)
+ (define-key map "-" #'expreg-contract)
+ map))
+ (put 'expreg-expand 'repeat-map 'expreg-repeat-map)
+ (put 'expreg-contract 'repeat-map 'expreg-repeat-map))
+
+(use-package surround
+ :ensure t
+ :bind-keymap ("M-'" . surround-keymap))
+
+(use-package easy-kill
+ :config
+ (global-set-key [remap kill-ring-save] 'easy-kill)
+ (global-set-key [remap mark-sexp] 'easy-mark))
+
+(use-package devil
+ :config
+ (global-devil-mode 1))
+
+(use-package ace-window
+ :config
+ (global-set-key (kbd "s-w") 'ace-window)
+ (global-set-key [remap other-window] 'ace-window))
+
+(use-package vundo
+ :bind (("C-x u" . vundo)))
+
+(use-package multiple-cursors
+ :ensure t
+ :bind (("C-c g" . mc/mark-all-dwim)
+ ("C->" . mc/mark-next-like-this)
+ ("C-<" . mc/mark-previous-like-this)
+ ("M-<mouse-1>" . mc/add-cursor-on-click)))
+
+(provide 'editing-config)
diff --git a/dot_config/emacs/lisp/elfeed-config.el b/dot_config/emacs/lisp/elfeed-config.el
new file mode 100644
index 0000000..9d93327
--- /dev/null
+++ b/dot_config/emacs/lisp/elfeed-config.el
@@ -0,0 +1,32 @@
+(use-package elfeed
+ :defer t
+ :custom
+ (elfeed-use-curl t)
+ (elfeed-db-directory "~/.config/emacs/elfeed")
+
+ :config
+ ;; Mark all YouTube entries
+ (defun browse-url-mpv (url &optional _new-window)
+ (start-process "mpv" nil "mpv" url))
+
+ (setq browse-url-browser-function
+ '(("https://\\(www\\.\\)?youtu\\(\\.be\\|be\\.com\\)" . browse-url-mpv)
+ ("." . browse-url-default-browser)))
+ (add-hook 'elfeed-new-entry-hook
+ (elfeed-make-tagger :feed-url "youtube\\.com"
+ :add '(video youtube)))
+ :bind
+ ("C-c e" . elfeed))
+
+(use-package elfeed-protocol
+ :ensure t
+ :after elfeed
+ :config
+ (setq elfeed-feeds nil)
+ (setq elfeed-use-curl t)
+ (setq elfeed-feeds '(("fever+https://sakamoto@rss.sakamoto.network"
+ :api-url "https://rss.sakamoto.network/fever/"
+ :password (password-store-get "rss"))))
+ (elfeed-protocol-enable))
+
+(provide 'elfeed-config)
diff --git a/dot_config/emacs/lisp/emacs-config.el b/dot_config/emacs/lisp/emacs-config.el
new file mode 100644
index 0000000..bfc15ee
--- /dev/null
+++ b/dot_config/emacs/lisp/emacs-config.el
@@ -0,0 +1,280 @@
+(use-package emacs
+ :ensure nil
+ :custom
+ (user-mail-address "me@sakamoto.network")
+ (user-full-name "Sakamoto")
+ (mml-secure-openpgp-sign-with-sender t)
+ (message-sendmail-envelope-from 'header)
+ (auto-save-default nil) ;; Disable automatic saving of buffers.
+ (column-number-mode t) ;; Display the column number in the mode line.
+ (create-lockfiles nil) ;; Prevent the creation of lock files when editing.
+ (delete-by-moving-to-trash t) ;; Move deleted files to the trash instead of permanently deleting them.
+ (delete-selection-mode 1) ;; Enable replacing selected text with typed text.
+ (display-line-numbers-type 'relative) ;; Use relative line numbering in programming modes.
+ (global-auto-revert-non-file-buffers t) ;; Automatically refresh non-file buffers.
+ (history-length 100) ;; Set the length of the command history.
+ (indent-tabs-mode nil) ;; Disable the use of tabs for indentation (use spaces instead).
+ (inhibit-startup-message t) ;; Disable the startup message when Emacs launches.
+ (initial-scratch-message "") ;; Clear the initial message in the *scratch* buffer.
+ (ispell-program-name "hunspell")
+ (ispell-dictionary "en_US")
+ (shr-use-colors nil)
+ (blink-cursor-mode nil)
+ (make-backup-files nil) ;; Disable creation of backup files.
+ (pixel-scroll-precision-mode t) ;; Enable precise pixel scrolling.
+ (pixel-scroll-precision-use-momentum nil) ;; Disable momentum scrolling for pixel precision.
+ (fill-column 80) ;; Set column fill
+ (ring-bell-function 'ignore) ;; Disable the audible bell.
+ (split-width-threshold 300) ;; Prevent automatic window splitting if the window width exceeds 300 pixels.
+ (switch-to-buffer-obey-display-actions t) ;; Make buffer switching respect display actions.
+ (tab-always-indent 'complete) ;; Make the TAB key complete text instead of just indenting.
+ (tab-width 4) ;; Set the tab width to 4 spaces.
+ (treesit-font-lock-level 4) ;; Use advanced font locking for Treesit mode.
+ (truncate-lines t) ;; Enable line truncation to avoid wrapping long lines.
+ (global-visual-line-mode 1) ;; Soft wrap text
+ (global-visual-wrap-prefix-mode t)
+ (use-dialog-box nil) ;; Disable dialog boxes in favor of minibuffer prompts.
+ (use-short-answers t) ;; Use short answers in prompts for quicker responses (y instead of yes)
+ (warning-minimum-level :emergency) ;; Set the minimum level of warnings to display.
+ (help-window-select t)
+ (repeat-mode 1)
+ (scroll-conservatively 101)
+ (epg-pinentry-mode 'loopback)
+ (view-read-only t) ;; Enter view mode on read-only files
+ (imenu-auto-rescan t) ;; Automatically update imenu entries based on current buffer/file
+ (minibuffer-visible-completions t) ;; Use arrow keys to select completion candidates
+
+ :hook ;; Add hooks to enable specific features in certain modes.
+ (prog-mode . display-line-numbers-mode) ;; Enable line numbers in programming modes.
+ (text-mode . display-line-numbers-mode)
+
+ :config
+ ;; By default emacs gives you access to a lot of *special* buffers, while navigating with [b and ]b,
+ ;; this might be confusing for newcomers. This settings make sure ]b and [b will always load a