summaryrefslogtreecommitdiff
path: root/.config/emacs/modules
diff options
context:
space:
mode:
Diffstat (limited to '.config/emacs/modules')
-rw-r--r--.config/emacs/modules/bd--devel.el67
-rw-r--r--.config/emacs/modules/bd--dictionary.el9
-rw-r--r--.config/emacs/modules/bd--dired.el21
-rw-r--r--.config/emacs/modules/bd--emms.el47
-rw-r--r--.config/emacs/modules/bd--erc.el12
-rw-r--r--.config/emacs/modules/bd--essential-windowing.el30
-rw-r--r--.config/emacs/modules/bd--essentials.el62
-rw-r--r--.config/emacs/modules/bd--eww.el25
-rw-r--r--.config/emacs/modules/bd--exwm-windowing.el168
-rw-r--r--.config/emacs/modules/bd--image.el23
-rw-r--r--.config/emacs/modules/bd--minibuffer.el34
-rw-r--r--.config/emacs/modules/bd--modeline.el126
-rw-r--r--.config/emacs/modules/bd--org.el87
-rw-r--r--.config/emacs/modules/bd--roam.el38
-rw-r--r--.config/emacs/modules/bd--rss.el24
-rw-r--r--.config/emacs/modules/bd--shells.el57
-rw-r--r--.config/emacs/modules/bd--themes.el40
17 files changed, 870 insertions, 0 deletions
diff --git a/.config/emacs/modules/bd--devel.el b/.config/emacs/modules/bd--devel.el
new file mode 100644
index 0000000..34d14fc
--- /dev/null
+++ b/.config/emacs/modules/bd--devel.el
@@ -0,0 +1,67 @@
+;; -*- lexical-binding: t; -*-
+
+
+;;;; general
+(defun remote-shell ()
+ (interactive)
+ (let ((default-directory "/ssh:bdunahu@perch"))
+ (shell)))
+
+(defun request-sudo ()
+ "Uses TRAMP to edit current opened file as root."
+ (interactive)
+ (when buffer-file-name
+ (find-alternate-file
+ (concat "/sudo:root@localhost:"
+ buffer-file-name))))
+
+
+(setq compilation-always-kill t)
+
+(add-hook 'prog-mode-hook (lambda ()
+ (font-lock-add-keywords
+ nil '(("\\<\\(FIX\\(ME\\)?\\|TODO\\)"
+ 1 font-lock-warning-face t)))))
+
+
+(use-package company
+ :hook (prog-mode)
+ :custom
+ (company-set-idle-delay (lambda () (if (company-in-string-or-comment) nil 0.3)))
+ (company-minimum-prefix-length 1)
+ (company-tooltip-flip-when-above t)
+ (company-show-numbers t)
+ (company-tooltip-align-annotations t)
+ (company-tooltip-limit 15)
+ (company-selection-wrap-around t))
+
+(use-package magit
+ :commands magit-status
+ :custom
+ (magit-define-global-key-bindings 'recommended))
+
+
+(use-package tex
+ :ensure auctex
+ :hook
+ ((latex-mode)
+ (text-mode . (lambda() (setq ispell-parser 'tex)))) ; improves ispell in LaTeX
+ :config
+ (push '(output-pdf "Zathura") TeX-view-program-selection)
+ :custom
+ (TeX-auto-save t)
+ ;; better support for latex packages
+ (TeX-parse-self t))
+
+(use-package slime
+ :commands slime
+ :config
+ (add-hook 'slime-mode-hook
+ (lambda ()
+ (local-set-key (kdb "C-c C-k") 'slime-eval-buffer)))
+ :custom
+ ;; more memory for ml libraries
+ (inferior-lisp-program "sbcl --dynamic-space-size 4096"))
+
+
+(provide 'bd--devel)
diff --git a/.config/emacs/modules/bd--dictionary.el b/.config/emacs/modules/bd--dictionary.el
new file mode 100644
index 0000000..35c93ca
--- /dev/null
+++ b/.config/emacs/modules/bd--dictionary.el
@@ -0,0 +1,9 @@
+;; -*- lexical-binding: t; -*-
+
+
+(keymap-global-set "C-c i" 'dictionary-lookup-definition)
+(setopt dictionary-server "localhost"
+ dictionary-use-single-buffer t)
+
+
+(provide 'bd--dictionary)
diff --git a/.config/emacs/modules/bd--dired.el b/.config/emacs/modules/bd--dired.el
new file mode 100644
index 0000000..0304435
--- /dev/null
+++ b/.config/emacs/modules/bd--dired.el
@@ -0,0 +1,21 @@
+;; -*- lexical-binding: t; -*-
+
+
+(keymap-global-set "C-c d" 'dired-jump)
+
+(setopt dired-listing-switches "-alhLG --time-style=long-iso --group-directories-first"
+
+ dired-recursive-copies 'always
+ dired-recursive-deletes 'always
+
+ ;; "dwim": guess where to move files
+ dired-dwim-target t
+
+ dired-guess-shell-alist-user
+ `((,(regexp-opt '(".mkv" ".mov" ".mp4" ".webm" ".m4v" ".wav" ".mp3" ".opus" ".ogv" ".flac")) "mpv &")
+ (,(regexp-opt '(".jpeg" ".jpg" ".png")) "feh &")
+ (,(regexp-opt '(".pdf")) "zathura &")
+ (,(regexp-opt '(".html")) "icecat &")))
+
+
+(provide 'bd--dired)
diff --git a/.config/emacs/modules/bd--emms.el b/.config/emacs/modules/bd--emms.el
new file mode 100644
index 0000000..40acf36
--- /dev/null
+++ b/.config/emacs/modules/bd--emms.el
@@ -0,0 +1,47 @@
+;; -*- lexical-binding: t; -*-
+
+
+(defun emms-open-playlist-buffer ()
+ "Opens the current playlist in the right
+side window."
+ (interactive)
+ (if (get-buffer emms-playlist-buffer-name)
+ (progn (display-buffer-in-side-window (get-buffer emms-playlist-buffer-name) '((side . right)))
+ (select-window (get-buffer-window emms-playlist-buffer-name)))
+ (message "The Ainur cannot hear you...")))
+
+(defun emms-quickstart ()
+ "Queues a shuffled playlist and starts
+playback."
+ (interactive)
+ (emms-stop)
+ (when (bufferp emms-playlist-buffer-name)
+ (kill-buffer emms-playlist-buffer-name))
+ (emms-play-directory-tree (expand-file-name "~/Personal/mpd/music/"))
+ (emms-shuffle))
+
+(use-package emms
+ :bind (("C-z C-m" . 'emms-open-playlist-buffer)
+ ("C-z C-p" . 'emms-play-playlist)
+ ("C-z C-s" . 'emms-quickstart))
+ :config
+ (emms-all)
+ (add-to-list 'emms-info-functions 'emms-info-functions 'emms-info-mpd)
+ (add-to-list 'emms-player-list 'emms-player-mpd)
+ :custom
+ ;; make sure mpd is configured similarly
+ (emms-player-mpd-server-name "localhost")
+ (emms-player-mod-server-port "6600")
+ ;; set dir and volume keys
+ (emms-player-mpd-music-directory (expand-file-name "~/Personal/mpd/music/"))
+ (emms-source-file-default-directory (expand-file-name "~/Personal/mpd/playlists/"))
+ (emms-volume-change-function 'emms-volume-mpd-change)
+ ;; misc
+ (emms-mode-line-format "%s ")
+ (emms-playlist-buffer-name "*Playlist*")
+ (require 'all-the-icons)
+ (emms-mode-line-icon-before-format (format "%s" (all-the-icons-fileicon "owl")))
+ (emms-mode-line-icon-enabled-p t))
+
+
+(provide 'bd--emms)
diff --git a/.config/emacs/modules/bd--erc.el b/.config/emacs/modules/bd--erc.el
new file mode 100644
index 0000000..c001834
--- /dev/null
+++ b/.config/emacs/modules/bd--erc.el
@@ -0,0 +1,12 @@
+;; -*- lexical-binding: t; -*-
+
+
+(with-eval-after-load "erc" (defalias 'erc 'erc-tls))
+(setopt erc-lurker-threshold-time 3600
+ erc-server "irc.libera.chat"
+ erc-nick "Isaz"
+ erc-kill-buffer-on-part t
+ erc-autojoin-channels-alist '(("irc.libera.chat" "#parabola" "#emacs" "#guix")))
+
+
+(provide 'bd--erc)
diff --git a/.config/emacs/modules/bd--essential-windowing.el b/.config/emacs/modules/bd--essential-windowing.el
new file mode 100644
index 0000000..bba3dee
--- /dev/null
+++ b/.config/emacs/modules/bd--essential-windowing.el
@@ -0,0 +1,30 @@
+;; -*- lexical-binding: t; -*-
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file contains sane windowing settings for any ;;
+;; environment type. ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(menu-bar-mode -1)
+(tool-bar-mode -1)
+(scroll-bar-mode -1)
+
+;; allow one side window per side of frame
+(setopt window-sides-slots '(1 1 1 1))
+
+;; alpha
+(defun bd/clamp (lower-bound upper-bound value)
+ (max lower-bound (min value upper-bound)))
+
+(defun set-frame-alpha (value)
+ "Sets the transparency of the frame background. 0=transparent/100=opaque"
+ (interactive "nTransparency Value (30 - 100 opaque): ")
+ (setq value (bd/clamp 30 100 value))
+ (set-frame-parameter (selected-frame) 'alpha `(,value . ,value))
+ (message "Alpha set to %d" value))
+(add-to-list 'default-frame-alist '(alpha . (82 . 82)))
+
+
+(provide 'bd--essential-windowing)
diff --git a/.config/emacs/modules/bd--essentials.el b/.config/emacs/modules/bd--essentials.el
new file mode 100644
index 0000000..cc51202
--- /dev/null
+++ b/.config/emacs/modules/bd--essentials.el
@@ -0,0 +1,62 @@
+;; -*- lexical-binding: t; -*-
+
+
+;;;; standard bindings
+;; both of these are bad--especially in exwm
+(global-unset-key (kbd "C-z"))
+(global-unset-key (kbd "C-x C-z"))
+
+(global-set-key (kbd "C-z =") 'text-scale-increase)
+(global-set-key (kbd "C-z -") 'text-scale-decrease)
+
+
+;;;; UI
+(setopt inhibit-startup-message t)
+
+;; line numbers
+(require 'display-line-numbers)
+(global-display-line-numbers-mode)
+(global-visual-line-mode t)
+(setopt display-line-numbers-type 'relative)
+(global-hl-line-mode 1)
+
+(defcustom display-line-numbers-exempt-modes
+ '(vterm-mode eshell-mode shell-mode term-mode ansi-term-mode image-mode doc-view-mode newsticker-treeview-mode newsticker-treeview-item-mode dired-mode org-agenda-mode)
+ "Major modes on which to disable line numbers."
+ :group 'display-line-numbers
+ :type 'list
+ :version "green")
+
+(defun display-line-numbers--turn-on ()
+ "Turn on line numbers except for certain major modes.
+Exempt major modes are defined in `display-line-numbers-exempt-modes'."
+ (unless (or (minibufferp)
+ (member major-mode display-line-numbers-exempt-modes))
+ (display-line-numbers-mode)))
+
+
+;;;; defaults
+;; basic editing
+(setopt kill-whole-line t)
+
+(defun bd/cleanup-buffer ()
+ (interactive)
+ (delete-trailing-whitespace)
+ (untabify (point-min) (point-max))
+ (indent-region (point-min) (point-max)))
+
+(setopt next-line-add-newlines t)
+(add-hook 'before-save-hook 'bd/cleanup-buffer)
+
+
+;;;; buffers
+(global-auto-revert-mode 1)
+(winner-mode 1)
+;; do not show async command buffers by default
+(add-to-list 'display-buffer-alist
+ (cons "\\*Async Shell Command\\*.*" (cons #'display-buffer-no-window nil)))
+(setopt scroll-up-aggressively '0.65
+ scroll-down-aggressively '0.65)
+
+
+(provide 'bd--essentials)
diff --git a/.config/emacs/modules/bd--eww.el b/.config/emacs/modules/bd--eww.el
new file mode 100644
index 0000000..7bde428
--- /dev/null
+++ b/.config/emacs/modules/bd--eww.el
@@ -0,0 +1,25 @@
+;; -*- lexical-binding: t; -*-
+
+
+;; do not use an external browser
+(setopt browse-url-browser-function 'eww-browse-url
+ shr-use-fonts nil
+ shr-cookie-policy nil
+ shr-max-width 85
+ ;; send only user agent
+ url-privacy-level '(email os emacs lastloc cookies)
+ eww-search-prefix "https://searx.be/search?q="
+ eww-auto-rename-buffer 'title
+ eww-use-browse-url (regexp-opt '("mailto:"
+ "youtube.com"
+ "youtu.be"
+ "yewtu.be"
+ "vid.puffyan.us"))
+ browse-url-handlers
+ `((,(regexp-opt'("youtube.com" "youtu.be" "yewtu.be" "vid.puffyan.us")) .
+ (lambda (url &rest _)
+ (message "Ludu %s" url)
+ (start-process-shell-command "rip-video" nil (concat "rip-video " url))))))
+
+
+(provide 'bd--eww)
diff --git a/.config/emacs/modules/bd--exwm-windowing.el b/.config/emacs/modules/bd--exwm-windowing.el
new file mode 100644
index 0000000..a275f5a
--- /dev/null
+++ b/.config/emacs/modules/bd--exwm-windowing.el
@@ -0,0 +1,168 @@
+;; -*- lexical-binding: t; -*-
+
+
+;;;; utilities
+;; desktop
+(use-package desktop-environment
+ :custom
+ (desktop-environment-screenshot-directory (xdg-user-dir "PICTURES"))
+ (desktop-environment-screenshot-command "flameshot full")
+ (desktop-environment-screenshot-partial-command "flameshot launcher"))
+
+
+(defun bd/exwm-update-class ()
+ "Changes the buffer name to reflect the class name for
+that buffer."
+ (exwm-workspace-rename-buffer exwm-class-name))
+
+(defun bd/exwm-init-hook ()
+ "Make workspace 1 the default startup workspace."
+ (exwm-workspace-switch-create 1))
+
+
+(defun toggle-current-window-dedication ()
+ "Adds or revokes dedicated window status from a buffer. A
+dedicated buffer will never be automatically orphaned."
+ (interactive)
+ (let* ((window (selected-window))
+ (dedicated (window-dedicated-p window)))
+ (set-window-dedicated-p window (not dedicated))
+ (message "Window %sdedicated to %s"
+ (if dedicated "no longer " "")
+ (buffer-name))))
+
+
+;;;; bookmarks, passwords
+(defun insert-bookmark ()
+ "Inserts a url or string from permanent
+bookmark file. If an x window, place in kill-ring."
+ ;; note xdotool had issues with repeated keys when sending to windowid
+ (interactive)
+ (let ((url (car (last (split-string (choose-line-from-file "~/Personal/scripts/bookmarks.txt"))))))
+ (if (exwm--buffer->id (current-buffer))
+ (kill-new url)
+ (insert url))))
+
+(defun choose-line-from-file (file)
+ "Uses completion-framework to allow user to
+select a line from a file."
+ (let* ((choices (read-file-into-list file)))
+ (completing-read "Recall: " choices)))
+
+(defun read-file-into-list (file)
+ (with-current-buffer
+ (find-file-noselect file)
+ (split-string
+ (save-restriction
+ (widen)
+ (buffer-substring-no-properties
+ (point-min)
+ (point-max)))
+ "\n" t)))
+
+(use-package password-store
+ :custom
+ (password-store-time-before-clipboard-restore 20)
+ (define-key global-map (kbd "C-c k") #'password-store-copy))
+
+;; emacs-pinentry; wonderful in EXWM, has security flaws
+(use-package pinentry
+ :init
+ (pinentry-start)
+ :custom
+ (pinentry-popup-prompt-window nil))
+
+
+(use-package exwm
+ :config
+ (add-hook 'exwm-init-hook #'bd/exwm-init-hook)
+ (add-hook 'exwm-update-class-hook #'bd/exwm-update-class)
+ ;; order is important
+ (require 'exwm-randr)
+ (exwm-randr-enable)
+ ;; because my nvidia driver is currently unsupported with nouveau,
+ ;; xrandr seems to be entirely broken. This line is only here for
+ ;; future reference
+ ;;(start-process-shell-command "xrandr" nil (expand-file-name "exwm_xrandr.sh" user-emacs-directory))
+ (start-process-shell-command "picom" nil "picom")
+ (start-process-shell-command "bg" nil "set-bg")
+ (start-process-shell-command "xrate" nil "xset r rate 250 70")
+
+ (dolist (k '(("s-B" "icecat")))
+ (let ((f (lambda () (interactive)
+ (save-window-excursion
+ (start-process-shell-command (cadr k) nil (cadr k))))))
+ (exwm-input-set-key (kbd (car k)) f)
+ (define-key exwm-mode-map (kbd (car k)) f)))
+
+ (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key)
+ (exwm-enable)
+ (server-start)
+ :custom
+ (exwm-workspace-number 10) ; puts scratch buffer everywhere
+ (exwm-input-prefix-keys
+ '(?\C-x
+ ?\C-u
+ ?\C-g
+ ?\C-h
+ ?\C-z
+ ?\M-x
+ ?\M-`
+ ?\M-&
+ ?\M-: ))
+ (exwm-input-global-keys
+ `(([?\s-n] . other-window)
+ ([?\s-p] . (lambda ()
+ (interactive)
+ (other-window -1)))
+ ([?\s-L] . desktop-environment-lock-screen)
+ ([f2] . desktop-environment-brightness-decrement)
+ ([f3] . desktop-environment-brightness-increment)
+ ([f7] . emms-volume-lower)
+ ([f8] . emms-volume-raise)
+ ([f9] . emms-next)
+ ([f10] . emms-pause)
+ ([f11] . emms-previous)
+ ([print] . desktop-environment-screenshot-part)
+ ([S-print] . desktop-environment-screenshot)
+ ([?\s-O] . insert-bookmark)
+ ([?\s-P] . password-store-copy)
+ ([?\s-r] . exwm-reset)
+ ([?\s-d] . toggle-current-window-dedication)
+ ([?\s-q] . kill-current-buffer)
+ ([?\s-x] . (lambda (command)
+ (interactive (list (read-shell-command "s-x ")))
+ (start-process-shell-command command nil command)))
+ ,@(mapcar (lambda (i)
+ `(,(kbd (format "s-%d" i)) .
+ (lambda ()
+ (interactive)
+ (exwm-workspace-switch-create ,i))))
+ (number-sequence 0 9))))
+ (exwm-input-simulation-keys
+ '(([?\C-b] . [left])
+ ([?\C-f] . [right])
+ ([?\C-p] . [up])
+ ([?\C-n] . [down])
+ ([?\C-a] . [home])
+ ([?\C-e] . [end])
+ ([?\M-v] . [prior])
+ ([?\C-v] . [next])
+ ([?\C-d] . [delete])
+ ([?\C-k] . [S-end delete])
+ ([?\M-w] . [C-c])
+ ([?\C-y] . [C-v])))
+
+ ;; ,@(mapcar (lambda (i)
+ ;; `(,(kbd (format "s-%s" (car i))) .
+ ;; (lambda ()
+ ;; (interactive
+ ;; (exwm-workspace-switch-create ,(car (cdr i)))))))
+ ;; '((! 0) (@ 1) (\# 2) ($ 3) (% 4) (^ 5) (& 6) (* 7) (\( 8) (\) 9)))))
+
+ (exwm-workspace-show-all-buffers t)
+ (exwm-layout-show-all-buffers t)
+ (exwm-randr-workspace-monitor-plist '(0 "HDMI-1" 6 "HDMI-1" 7 "HDMI-1" 8 "HDMI-1" 9 "HDMI-1")))
+
+
+(provide 'bd--exwm-windowing)
diff --git a/.config/emacs/modules/bd--image.el b/.config/emacs/modules/bd--image.el
new file mode 100644
index 0000000..3dd2526
--- /dev/null
+++ b/.config/emacs/modules/bd--image.el
@@ -0,0 +1,23 @@
+;; -*- lexical-binding: t; -*-
+
+
+(require 'image-mode)
+(defun toggle-mode-line ()
+ "If the mode line is displayed, toggle it off.
+If the mode line is off, set it to the default value."
+ (interactive)
+ (setq mode-line-format
+ (if mode-line-format
+ nil
+ (default-value 'mode-line-format))))
+
+
+;;;; hooks
+(add-hook 'image-mode-hook 'toggle-mode-line)
+
+
+;;;; binds
+(keymap-set image-mode-map "l" #'toggle-mode-line)
+
+
+(provide 'bd--image)
diff --git a/.config/emacs/modules/bd--minibuffer.el b/.config/emacs/modules/bd--minibuffer.el
new file mode 100644
index 0000000..83b0d08
--- /dev/null
+++ b/.config/emacs/modules/bd--minibuffer.el
@@ -0,0 +1,34 @@
+;; -*- lexical-binding: t; -*-
+
+
+(setopt use-short-answers t
+ vc-follow-symlinks t
+ ;; order to try completions
+ completion-styles '(substring
+ initials
+ flex
+ orderless)
+ ;; required for exwm (pass) but
+ ;; always useful
+ enable-recursive-minibuffers t)
+(minibuffer-depth-indicate-mode 1)
+
+
+(use-package vertico
+ :init
+ (vertico-mode)
+ :custom
+ (vertico-cycle t))
+
+(use-package marginalia
+ :init
+ (marginalia-mode))
+
+(use-package orderless
+ :custom
+ (setopt completion-styles '(orderless basic)
+ completion-category-defaults nil
+ completion-category-overrides '((file (styles partial-completion)))))
+
+
+(provide 'bd--minibuffer)
diff --git a/.config/emacs/modules/bd--modeline.el b/.config/emacs/modules/bd--modeline.el
new file mode 100644
index 0000000..b092081
--- /dev/null
+++ b/.config/emacs/modules/bd--modeline.el
@@ -0,0 +1,126 @@
+;; -*- lexical-binding: t; -*-
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Highly customized modeline. Note this currently requires ;;
+;; many of the previous modules to be loaded to function properly. ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun mode-line-fill (reserve)
+ "Return empty space, leaving RESERVE space on the right."
+ (unless reserve
+ (setq reserve 20))
+ (when (and window-system (eq 'right (get-scroll-bar-mode)))
+ (setq reserve (- reserve 3)))
+ (propertize " "
+ 'display `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))))
+
+
+;;;; remove mode-line-clutter
+(define-minor-mode minor-mode-blackout-mode
+ "Hides minor modes from the mode line."
+ t)
+
+(catch 'done
+ (mapc (lambda (x)
+ (when (and (consp x)
+ (equal (cadr x) '("" minor-mode-alist)))
+ (let ((original (copy-sequence x)))
+ (setcar x 'minor-mode-blackout-mode)
+ (setcdr x (list "" original)))
+ (throw 'done t)))
+ mode-line-modes))
+
+(global-set-key (kbd "C-c m") 'minor-mode-blackout-mode)
+
+
+;;;; time and date
+(setq display-time-format "%m/%d/%y %H:%M (%a)"
+ display-time-default-load-average nil)
+(display-time)
+
+(defvar-local bd/time-mode-line
+ '(:eval
+ (when (mode-line-window-selected-p)
+ display-time-string))
+ "displays current time and date in selected window.")
+
+
+;;;; notification-server
+(use-package ednc
+ :init
+ (defun get-num-notifications ()
+ "Return number of active notifcations as a string."
+ (format "%s" (length (ednc-notifications))))
+
+ (defvar-local bd/notify-mode-line
+ '(:eval (when (and (ednc-notifications) (mode-line-window-selected-p))
+ (format " %s %s" (all-the-icons-material "notifications_active")
+ (propertize (get-num-notifications) 'face 'error))))
+ "Formats the notification number.")
+ (ednc-mode))
+
+
+;;;; buffer name
+(defun modeline-buffer-name ()
+ "Return 'buffer-name' with proper spacing and icon."
+ (format " %s %s" (all-the-icons-icon-for-file (buffer-name)) (buffer-name)))
+
+(defvar-local bd/buffer-identification-mode-line
+ '(:eval (format "%s" (modeline-buffer-name)))
+ "Formats the modeline-buffer-name.")
+
+
+;;;; git
+(defun git-vc-modeline ()
+ (let ((branch (mapconcat 'concat (cdr (split-string vc-mode "[:-]")) "-")))
+ (concat
+ (propertize (format " %s" (all-the-icons-octicon "git-branch"))
+ 'face `(:height 1 :family ,(all-the-icons-octicon-family))
+ 'display '(raise 0))
+ (propertize (format " %s" branch))
+ (propertize " "))))
+
+(defvar-local bd/vc-mode-line
+ '(:eval (when (and vc-mode (not (eq major-mode 'magit-status-mode))) ; temp fix to avoid bug which occurs in magit buffer
+ (format "%s"
+ (propertize (git-vc-modeline) 'face 'shadow))))
+ "Formats the checked out git repository.")
+
+
+;;;; emms
+(defvar-local bd/emms-mode-line
+ '(:eval (when (and (mode-line-window-selected-p) emms-mode-line-string)
+ (format "%s %s" emms-mode-line-string
+ emms-playing-time-string)))
+ "Formats the currently playing emms track.")
+
+
+(dolist (construct '(bd/time-mode-line
+ bd/notify-mode-line
+ bd/buffer-identification-mode-line
+ bd/vc-mode-line
+ bd/emms-mode-line))
+ (put construct 'risky-local-variable t))
+
+
+(setq-default mode-line-format
+ (list
+ mode-line-front-space
+ ;; mode-line-mule-info
+ ;; mode-line-frame-identification
+ bd/buffer-identification-mode-line
+ " "
+ mode-line-modes
+ " "
+ ;; mode-line-position
+ mode-line-modified
+ bd/notify-mode-line
+ bd/vc-mode-line
+ " "
+ bd/emms-mode-line
+ (mode-line-fill 21)
+ bd/time-mode-line))
+
+
+(provide 'bd--modeline)
diff --git a/.config/emacs/modules/bd--org.el b/.config/emacs/modules/bd--org.el
new file mode 100644
index 0000000..c4ade63
--- /dev/null
+++ b/.config/emacs/modules/bd--org.el
@@ -0,0 +1,87 @@
+;; -*- lexical-binding: t; -*-
+
+
+(defvar-local agenda-file "~/Personal/roam/agenda/agenda_tasks.org")
+
+(defun bd/org-mode-setup-hook ()
+ "Sets up improved org-mode defaults upon
+each org file open."
+ (org-indent-mode)
+ (org-toggle-inline-images)
+ (org-toggle-pretty-entities))
+
+;; hooks
+(add-hook 'org-mode-hook 'bd/org-mode-setup-hook)
+
+;; binds
+(keymap-global-set "C-c n a" 'org-agenda)
+(keymap-global-set "C-c n c" 'org-capture)
+(keymap-global-set "C-c n s" 'org-schedule)
+(keymap-global-set "C-c n d" 'org-deadline)
+(keymap-global-set "C-c n r" 'org-refile)
+
+;; source blocks
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (python . t)
+ (shell . t)
+ (lisp . t)))
+
+;; standard
+(setopt org-startup-folded 'show2levels
+ org-ellipsis " ▾")
+
+;; agenda
+(advice-add 'org-refile :after 'org-save-all-org-buffers) ; after refiling tasks, save all buffers
+
+(setopt org-agenda-files
+ `(,agenda-file "~/Personal/roam/agenda/archived_tasks.org")
+
+ org-deadline-warning-days 7
+ org-log-done 'time
+ org-log-into-drawer "history"
+
+ org-todo-keywords
+ '((sequence "TODO(t)" "NEXT(n!)" "|" "DONE(d)" "CANC(c)"))
+
+ org-refile-targets ; refile into the headings of these files, not tags
+ '(("archived_tasks.org" :maxlevel . 1)
+ ("agenda_tasks.org" :maxlevel . 1))
+
+ org-capture-templates
+ `(("t" " Tasks")
+ ("ts" "Software Testing" entry (file+olp ,agenda-file "CS415")
+ "* TODO %?\n DEADLINE: %^t")
+ ("tm" "Machine Learning" entry (file+olp ,agenda-file "CS445")
+ "* TODO %?\n DEADLINE: %^t")
+ ("tp" "Programming Languages" entry (file+olp ,agenda-file "CS454")
+ "* TODO %?\n DEADLINE: %^t")
+ ("tc" "Creative Writing" entry (file+olp ,agenda-file "E210")
+ "* TODO %?\n DEADLINE: %^t")
+ ("s" " Self")
+ ("s" "Unsorted Task" entry (file+olp ,agenda-file "Self")
+ "* TODO %?\n %^t\n %a"))
+
+ org-agenda-custom-commands
+ '(("S" "Standard Block Agenda"
+ ((tags-todo "*"
+ ((org-agenda-skip-function '(org-agenda-skip-if nil '(timestamp)))
+ (org-agenda-block-separator nil)
+ (org-agenda-overriding-header "Undated Tasks\n")))
+ (agenda "" ((org-agenda-span 8)
+ (org-deadline-warning-days 0)
+ (org-agenda-block-separator nil)
+ (org-scheduled-past-days 4)
+ (org-agenda-overriding-header "\nUpcoming Tasks\n")))
+ (agenda "" ((org-agenda-time-grid nil)
+ (org-agenda-show-all-dates nil)
+ (org-agenda-span 21)
+ (org-deadline-warning-days 0)
+ (org-agenda-block-separator nil)
+ (org-agenda-entry-types '(:deadline))
+ (org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
+ (org-agenda-overriding-header "\nFuture Deadlines (+21d)\n")))))))
+
+
+(provide 'bd--org)
diff --git a/.config/emacs/modules/bd--roam.el b/.config/emacs/modules/bd--roam.el
new file mode 100644
index 0000000..21cf573
--- /dev/null
+++ b/.config/emacs/modules/bd--roam.el
@@ -0,0 +1,38 @@
+;; -*- lexical-binding: t; -*-
+
+
+(defun org-roam-node-insert-immediate (arg &rest args)
+ "Insert a new org mode link, but do not open the
+file."
+ (interactive "P")
+ (let ((args (cons arg args))
+ (org-roam-capture-templates (list (append (car org-roam-capture-templates)
+ '(:immediate-finish t)))))
+ (apply #'org-roam-node-insert args)))
+
+(use-package org-roam
+ :after org
+ :bind (("C-c n l" . 'org-roam-buffer-toggle)
+ ("C-c n f" . 'org-roam-node-find)
+ ("C-c n i" . 'org-roam-node-insert)
+ ("C-c n g" . 'org-roam-graph)
+ ("C-c n I" . 'org-roam-node-insert-immediate)
+ ("C-c n j" . 'org-roam-dailies-capture-today)
+ :map org-mode-map
+ ("C-M-i" . 'completion-at-point))
+ :config
+ (org-roam-db-autosync-mode)
+ :custom
+ (org-roam-directory (expand-file-name "~/Personal/roam/"))
+ (org-roam-dailies-directory "logs/")
+ (org-roam-complete-everywhere t)
+ (org-roam-capture-templates '(("e" "extend" plain
+ "#+AUTHOR: bdunahu\n#+DESCRIPTION: %^{Description}\n#+STARTUP: show3levels\n" :target
+ (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+TITLE: ${title}")
+ :unnarrowed t)
+ ("d" "default" plain "%?" :target
+ (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}")
+ :unnarrowed t))))
+
+
+(provide 'bd--roam)
diff --git a/.config/emacs/modules/bd--rss.el b/.config/emacs/modules/bd--rss.el
new file mode 100644
index 0000000..6cd8507
--- /dev/null
+++ b/.config/emacs/modules/bd--rss.el
@@ -0,0 +1,24 @@
+;; -*- lexical-binding: t; -*-
+
+
+(keymap-global-set "C-z C-n" 'newsticker-show-news)
+
+(setopt newsticker-url-list-defaults nil
+ newsticker-automatically-mark-items-as-old nil
+ newsticker-url-list '(("Ambrose and Elsewhere" "https://jamesenge.com/engeblog/feed" nil nil nil)
+ ("James Enge Mastodon" "https://mastodon.sdf.org/@jamesenge.rss" nil nil nil)
+ ("Tales From the Magician's Skull" "https://goodman-games.com/tftms/category/book-reviews/feed" nil nil nil)
+ ("Parabola GNU/Linux-libre" "https://www.parabola.nu/feeds/news/" nil nil nil)
+ ("suckless.org news" "https://suckless.org/atom.xml" nil nil nil)
+ ("Mental Outlaw" "https://vid.puffyan.us/feed/channel/UC7YOGHUfC1Tb6E4pudI9STA" nil nil nil)
+ ("Luke Smith" "https://vid.puffyan.us/feed/channel/UC2eYFnH61tmytImy1mTYvhA" nil nil nil)
+ ("Bugswriter" "https://yewtu.be/feed/channel/UCngn7SVujlvskHRvRKc1cTw" nil nil nil)
+ ("Protesilaos Stravrou" "https://yewtu.be/feed/playlist/PL8Bwba5vnQK14z96Gil86pLMDO2GnOhQ6" nil nil nil))
+ ;; may require ./newsticker/groups to be cleared
+ newsticker-groups '("Feeds"
+ ("READING" "James Enge Mastodon" "Tales From the Magician's Skull" "Ambrose and Elsewhere")
+ ("TECH" "Parabola GNU/Linux-libre" "suckless.org news")
+ ("VIDEO" "Mental Outlaw" "Luke Smith" "Bugswriter" "Protesilaos Stravrou")))
+
+
+(provide 'bd--rss)
diff --git a/.config/emacs/modules/bd--shells.el b/.config/emacs/modules/bd--shells.el
new file mode 100644
index 0000000..8bcd9c4
--- /dev/null
+++ b/.config/emacs/modules/bd--shells.el
@@ -0,0 +1,57 @@
+;; -*- lexical-binding: t; -*-
+
+
+(require 'all-the-icons)
+
+
+;;;; term
+(defalias 'term 'ansi-term)
+
+
+;;;; eshell
+(defun eshell-open-buffer ()
+ "Opens eshell in the bottom
+side window."
+ (interactive)
+ (let ((curr-buffer (current-buffer))
+ (eshell (eshell)))
+ (switch-to-buffer curr-buffer)
+ (display-buffer-in-side-window (get-buffer eshell) '((side . top)))
+ (switch-to-buffer-other-window eshell)))
+
+
+(defun bd/get-prompt-path ()
+ (abbreviate-file-name (eshell/pwd)))
+
+(defun bd/eshell-prompt ()
+ "Assemble a shell prompt including host, git
+status, and path."
+ (concat
+ "\n"
+ (propertize (system-name) 'face `(:foreground "#edb54b"))
+ (format " %s " (all-the-icons-fileicon "gn"))
+ (propertize (bd/get-prompt-path) 'face `(:foreground "#33859d"))
+ (propertize (format-time-string " %a, %R") 'face `(:foreground "#888ba5"))
+ (propertize "\n> " 'face `(:foreground "#c33027"))))
+
+
+(require 'esh-mode)
+(keymap-global-set "C-z C-e" 'eshell-open-buffer)
+(keymap-set eshell-mode-map "C-q" 'delete-window) ; mostly for side window
+(keymap-set eshell-mode-map "<tab>" 'completion-at-point) ; mostly for side window
+(setopt eshell-prompt-function 'bd/eshell-prompt
+ eshell-prompt-regexp "^> "
+ eshell-scroll-to-bottom-on-input 'this
+ eshell-banner-message (concat "\n" (propertize " " 'display (create-image (expand-file-name "~/.config/emacs/images/raven.png") 'png nil :scale 0.2 :align-to "center")) "\n"))
+
+
+;;;; shell
+(require 'shell)
+(keymap-set shell-mode-map "C-c C-k" #'comint-clear-buffer)
+(setopt shell-command-prompt-show-cwd t
+ shell-highlight-undef-enable t
+ shell-kill-buffer-on-exit t
+ comint-prompt-read-only t)
+
+
+(provide 'bd--shells)
diff --git a/.config/emacs/modules/bd--themes.el b/.config/emacs/modules/bd--themes.el
new file mode 100644
index 0000000..abf9887
--- /dev/null
+++ b/.config/emacs/modules/bd--themes.el
@@ -0,0 +1,40 @@
+;; -*- lexical-binding: t; -*-
+
+
+(defun modus-themes-custom-faces ()
+ (modus-themes-with-colors
+ (custom-set-faces
+ `(vertical-border ((,class :background ,bg-main
+ :foreground ,bg-main)))
+
+ `(mode-line-inactive ((,class :background ,bg-main
+ :foreground ,fg-active)))
+ `(mode-line-active ((,class :background ,bg-main
+ :foreground ,fg-active)))
+
+ `(hl-line ((,class :background ,magenta-nuanced-bg)))
+
+ `(emms-playlist-track-face ((,class :foreground ,blue-nuanced-fg)))
+ `(emms-playlist-selected-face ((,class :foreground ,fg-special-cold)))
+ `(emms-browser-track-face ((,class :foreground ,blue-nuanced-fg))))))
+
+(add-hook 'modus-themes-after-load-theme-hook #'modus-themes-custom-faces)
+
+(setopt modus-themes-italic-constructs t
+ modus-themes-bold-constructs t
+ modus-themes-hl-line '(accented)
+ modus-themes-subtle-line-numbers t
+ modus-themes-paren-match '(intense)
+ modus-themes-region '(bg-only)
+ modus-themes-syntax '(faint)
+ modus-themes-mode-line '(borderless)
+ modus-themes-org-blocks 'gray-background
+ modus-themes-headings '(
+ (1 . (rainbow overline))))
+
+(load-theme 'modus-vivendi t)
+
+(modus-themes-custom-faces)
+
+
+(provide 'bd--themes)