From 1ced565816120bfcc351daf9fc3a4e851162e3b7 Mon Sep 17 00:00:00 2001 From: bd Date: Wed, 10 Jan 2024 19:44:21 -0700 Subject: Initial commit of new repository structure --- .config/emacs/modules/bd--devel.el | 67 +++++++++ .config/emacs/modules/bd--dictionary.el | 9 ++ .config/emacs/modules/bd--dired.el | 21 +++ .config/emacs/modules/bd--emms.el | 47 +++++++ .config/emacs/modules/bd--erc.el | 12 ++ .config/emacs/modules/bd--essential-windowing.el | 30 ++++ .config/emacs/modules/bd--essentials.el | 62 +++++++++ .config/emacs/modules/bd--eww.el | 25 ++++ .config/emacs/modules/bd--exwm-windowing.el | 168 +++++++++++++++++++++++ .config/emacs/modules/bd--image.el | 23 ++++ .config/emacs/modules/bd--minibuffer.el | 34 +++++ .config/emacs/modules/bd--modeline.el | 126 +++++++++++++++++ .config/emacs/modules/bd--org.el | 87 ++++++++++++ .config/emacs/modules/bd--roam.el | 38 +++++ .config/emacs/modules/bd--rss.el | 24 ++++ .config/emacs/modules/bd--shells.el | 57 ++++++++ .config/emacs/modules/bd--themes.el | 40 ++++++ 17 files changed, 870 insertions(+) create mode 100644 .config/emacs/modules/bd--devel.el create mode 100644 .config/emacs/modules/bd--dictionary.el create mode 100644 .config/emacs/modules/bd--dired.el create mode 100644 .config/emacs/modules/bd--emms.el create mode 100644 .config/emacs/modules/bd--erc.el create mode 100644 .config/emacs/modules/bd--essential-windowing.el create mode 100644 .config/emacs/modules/bd--essentials.el create mode 100644 .config/emacs/modules/bd--eww.el create mode 100644 .config/emacs/modules/bd--exwm-windowing.el create mode 100644 .config/emacs/modules/bd--image.el create mode 100644 .config/emacs/modules/bd--minibuffer.el create mode 100644 .config/emacs/modules/bd--modeline.el create mode 100644 .config/emacs/modules/bd--org.el create mode 100644 .config/emacs/modules/bd--roam.el create mode 100644 .config/emacs/modules/bd--rss.el create mode 100644 .config/emacs/modules/bd--shells.el create mode 100644 .config/emacs/modules/bd--themes.el (limited to '.config/emacs/modules') 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 "" '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) -- cgit v1.2.3