From dbe3cf386dd7cb1b511396530e4223dc8a8e5029 Mon Sep 17 00:00:00 2001 From: Derek Taylor Date: Sun, 24 Aug 2025 09:25:22 -0500 Subject: [PATCH] Switching back to Doom Emacs for video content! --- .config/doom/bookmarks | 10 - .config/doom/config.el | 893 +------------- .config/doom/config.org | 1387 ---------------------- .config/doom/eshell/aliases | 29 - .config/doom/eshell/profile | 1 - .config/doom/images/doom-emacs-dash.png | Bin 28349 -> 0 bytes .config/doom/images/emacs-dash.png | Bin 36692 -> 0 bytes .config/doom/images/emacs-start-page.png | Bin 34520 -> 0 bytes .config/doom/init.el | 110 +- .config/doom/packages.el | 66 +- .config/doom/start.org | 45 - .config/emacs/agenda.org | 0 .config/emacs/config.el | 821 ------------- .config/emacs/config.org | 1164 ------------------ .config/emacs/early-init.el | 151 ++- .config/emacs/eshell/aliases | 23 - .config/emacs/eshell/profile | 1 - .config/emacs/images/dtmacs-logo.png | Bin 17056 -> 0 bytes .config/emacs/images/emacs-dash.png | Bin 36692 -> 0 bytes .config/emacs/init.el | 33 - .config/emacs/scripts/app-launchers.el | 56 - .config/emacs/scripts/buffer-move.el | 101 -- .config/emacs/scripts/elpaca-setup.el | 73 -- .config/emacs/scripts/eshell-prompt.el | 33 - .config/emacs/themes/dtmacs-theme.el | 317 ----- 25 files changed, 289 insertions(+), 5025 deletions(-) delete mode 100644 .config/doom/bookmarks delete mode 100644 .config/doom/config.org delete mode 100644 .config/doom/eshell/aliases delete mode 100644 .config/doom/eshell/profile delete mode 100644 .config/doom/images/doom-emacs-dash.png delete mode 100644 .config/doom/images/emacs-dash.png delete mode 100644 .config/doom/images/emacs-start-page.png delete mode 100644 .config/doom/start.org delete mode 100644 .config/emacs/agenda.org delete mode 100644 .config/emacs/config.el delete mode 100644 .config/emacs/config.org delete mode 100644 .config/emacs/eshell/aliases delete mode 100644 .config/emacs/eshell/profile delete mode 100644 .config/emacs/images/dtmacs-logo.png delete mode 100644 .config/emacs/images/emacs-dash.png delete mode 100644 .config/emacs/init.el delete mode 100644 .config/emacs/scripts/app-launchers.el delete mode 100644 .config/emacs/scripts/buffer-move.el delete mode 100644 .config/emacs/scripts/elpaca-setup.el delete mode 100644 .config/emacs/scripts/eshell-prompt.el delete mode 100644 .config/emacs/themes/dtmacs-theme.el diff --git a/.config/doom/bookmarks b/.config/doom/bookmarks deleted file mode 100644 index d6949fc..0000000 --- a/.config/doom/bookmarks +++ /dev/null @@ -1,10 +0,0 @@ -;;;; Emacs Bookmark Format Version 1;;;; -*- coding: utf-8-emacs; mode: lisp-data -*- -;;; This format is meant to be slightly human-readable; -;;; nevertheless, you probably don't want to edit it. -;;; -*- End Of Bookmark File Format Version Stamp -*- -(("org-capture-last-stored" - (filename . "~/nc/Org/roam/20230110120652-start.org") - (front-context-string) - (rear-context-string . "\n#+title: start\n") - (position . 83)) -) diff --git a/.config/doom/config.el b/.config/doom/config.el index 9f90658..d711a1e 100644 --- a/.config/doom/config.el +++ b/.config/doom/config.el @@ -1,838 +1,77 @@ -(beacon-mode 1) +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- -(setq bookmark-default-file "~/.config/doom/bookmarks") +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! -(map! :leader - (:prefix ("b". "buffer") - :desc "List bookmarks" "L" #'list-bookmarks - :desc "Set bookmark" "m" #'bookmark-set - :desc "Delete bookmark" "M" #'bookmark-set - :desc "Save current bookmarks to bookmark file" "w" #'bookmark-save)) -(global-auto-revert-mode 1) -(setq global-auto-revert-non-file-buffers t) +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +;; (setq user-full-name "John Doe" +;; user-mail-address "john@doe.com") -(evil-define-key 'normal ibuffer-mode-map - (kbd "f c") 'ibuffer-filter-by-content - (kbd "f d") 'ibuffer-filter-by-directory - (kbd "f f") 'ibuffer-filter-by-filename - (kbd "f m") 'ibuffer-filter-by-mode - (kbd "f n") 'ibuffer-filter-by-name - (kbd "f x") 'ibuffer-filter-disable - (kbd "g h") 'ibuffer-do-kill-lines - (kbd "g H") 'ibuffer-update) - -;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months -(defun dt/year-calendar (&optional year) - (interactive) - (require 'calendar) - (let* ( - (current-year (number-to-string (nth 5 (decode-time (current-time))))) - (month 0) - (year (if year year (string-to-number (format-time-string "%Y" (current-time)))))) - (switch-to-buffer (get-buffer-create calendar-buffer)) - (when (not (eq major-mode 'calendar-mode)) - (calendar-mode)) - (setq displayed-month month) - (setq displayed-year year) - (setq buffer-read-only nil) - (erase-buffer) - ;; horizontal rows - (dotimes (j 4) - ;; vertical columns - (dotimes (i 3) - (calendar-generate-month - (setq month (+ month 1)) - year - ;; indentation / spacing between months - (+ 5 (* 25 i)))) - (goto-char (point-max)) - (insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n)) - (widen) - (goto-char (point-max)) - (narrow-to-region (point-max) (point-max))) - (widen) - (goto-char (point-min)) - (setq buffer-read-only t))) - -(defun dt/scroll-year-calendar-forward (&optional arg event) - "Scroll the yearly calendar by year in a forward direction." - (interactive (list (prefix-numeric-value current-prefix-arg) - last-nonmenu-event)) - (unless arg (setq arg 0)) - (save-selected-window - (if (setq event (event-start event)) (select-window (posn-window event))) - (unless (zerop arg) - (let* ( - (year (+ displayed-year arg))) - (dt/year-calendar year))) - (goto-char (point-min)) - (run-hooks 'calendar-move-hook))) - -(defun dt/scroll-year-calendar-backward (&optional arg event) - "Scroll the yearly calendar by year in a backward direction." - (interactive (list (prefix-numeric-value current-prefix-arg) - last-nonmenu-event)) - (dt/scroll-year-calendar-forward (- (or arg 1)) event)) - -(map! :leader - :desc "Scroll year calendar backward" "" #'dt/scroll-year-calendar-backward - :desc "Scroll year calendar forward" "" #'dt/scroll-year-calendar-forward) - -(defalias 'year-calendar 'dt/year-calendar) - -(use-package! calfw) -(use-package! calfw-org) - -(setq centaur-tabs-set-bar 'over - centaur-tabs-set-icons t - centaur-tabs-gray-out-icons 'buffer - centaur-tabs-height 24 - centaur-tabs-set-modified-marker t - centaur-tabs-style "bar" - centaur-tabs-modified-marker "•") -(map! :leader - :desc "Toggle tabs globally" "t c" #'centaur-tabs-mode - :desc "Toggle tabs local display" "t C" #'centaur-tabs-local-mode) -(evil-define-key 'normal centaur-tabs-mode-map (kbd "g ") 'centaur-tabs-forward ; default Doom binding is 'g t' - (kbd "g ") 'centaur-tabs-backward ; default Doom binding is 'g T' - (kbd "g ") 'centaur-tabs-forward-group - (kbd "g ") 'centaur-tabs-backward-group) - -(map! :leader - (:prefix ("c h" . "Help info from Clippy") - :desc "Clippy describes function under point" "f" #'clippy-describe-function - :desc "Clippy describes variable under point" "v" #'clippy-describe-variable)) - -(map! :leader - (:prefix ("d" . "dired") - :desc "Open dired" "d" #'dired - :desc "Dired jump to current" "j" #'dired-jump) - (:after dired - (:map dired-mode-map - :desc "Peep-dired image previews" "d p" #'peep-dired - :desc "Dired view file" "d v" #'dired-view-file))) - -(evil-define-key 'normal dired-mode-map - (kbd "M-RET") 'dired-display-file - (kbd "h") 'dired-up-directory - (kbd "l") 'dired-open-file ; use dired-find-file instead of dired-open. - (kbd "m") 'dired-mark - (kbd "t") 'dired-toggle-marks - (kbd "u") 'dired-unmark - (kbd "C") 'dired-do-copy - (kbd "D") 'dired-do-delete - (kbd "J") 'dired-goto-file - (kbd "M") 'dired-do-chmod - (kbd "O") 'dired-do-chown - (kbd "P") 'dired-do-print - (kbd "R") 'dired-do-rename - (kbd "T") 'dired-do-touch - (kbd "Y") 'dired-copy-filenamecopy-filename-as-kill ; copies filename to kill ring. - (kbd "Z") 'dired-do-compress - (kbd "+") 'dired-create-directory - (kbd "-") 'dired-do-kill-lines - (kbd "% l") 'dired-downcase - (kbd "% m") 'dired-mark-files-regexp - (kbd "% u") 'dired-upcase - (kbd "* %") 'dired-mark-files-regexp - (kbd "* .") 'dired-mark-extension - (kbd "* /") 'dired-mark-directories - (kbd "; d") 'epa-dired-do-decrypt - (kbd "; e") 'epa-dired-do-encrypt) -;; Get file icons in dired -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) -;; With dired-open plugin, you can launch external programs for certain extensions -;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv' -(setq dired-open-extensions '(("gif" . "sxiv") - ("jpg" . "sxiv") - ("png" . "sxiv") - ("mkv" . "mpv") - ("mp4" . "mpv"))) - -(evil-define-key 'normal peep-dired-mode-map - (kbd "j") 'peep-dired-next-file - (kbd "k") 'peep-dired-prev-file) -(add-hook 'peep-dired-hook 'evil-normalize-keymaps) - -(setq delete-by-moving-to-trash t - trash-directory "~/.local/share/Trash/files/") +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-symbol-font' -- for symbols +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) +;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: (setq doom-theme 'doom-one) -(map! :leader - :desc "Load new theme" "h t" #'counsel-load-theme) - -(ednc-mode 1) - -(defun show-notification-in-buffer (old new) - (let ((name (format "Notification %d" (ednc-notification-id (or old new))))) - (with-current-buffer (get-buffer-create name) - (if new (let ((inhibit-read-only t)) - (if old (erase-buffer) (ednc-view-mode)) - (insert (ednc-format-notification new t)) - (pop-to-buffer (current-buffer))) - (kill-buffer))))) - -(add-hook 'ednc-notification-presentation-functions - #'show-notification-in-buffer) - -(evil-define-key 'normal ednc-view-mode-map - (kbd "d") 'ednc-dismiss-notification - (kbd "RET") 'ednc-invoke-action - (kbd "e") 'ednc-toggle-expanded-view) - -(setq elfeed-goodies/entry-pane-size 0.5) - -(evil-define-key 'normal elfeed-show-mode-map - (kbd "J") 'elfeed-goodies/split-show-next - (kbd "K") 'elfeed-goodies/split-show-prev) -(evil-define-key 'normal elfeed-search-mode-map - (kbd "J") 'elfeed-goodies/split-show-next - (kbd "K") 'elfeed-goodies/split-show-prev) -(setq elfeed-feeds (quote - (("https://www.reddit.com/r/linux.rss" reddit linux) - ("https://www.reddit.com/r/commandline.rss" reddit commandline) - ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) - ("https://www.reddit.com/r/emacs.rss" reddit emacs) - ("https://www.gamingonlinux.com/article_rss.php" gaming linux) - ("https://hackaday.com/blog/feed/" hackaday linux) - ("https://opensource.com/feed" opensource linux) - ("https://linux.softpedia.com/backend.xml" softpedia linux) - ("https://itsfoss.com/feed/" itsfoss linux) - ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) - ("https://www.phoronix.com/rss.php" phoronix linux) - ("http://feeds.feedburner.com/d0od" omgubuntu linux) - ("https://www.computerworld.com/index.rss" computerworld linux) - ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) - ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) - ("https://betanews.com/feed" betanews linux) - ("http://lxer.com/module/newswire/headlines.rss" lxer linux)))) - -(emms-all) -(emms-default-players) -(emms-mode-line 1) -(emms-playing-time 1) -(setq emms-source-file-default-directory "~/Music/" - emms-playlist-buffer-name "*Music*" - emms-info-asynchronously t - emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find) -(map! :leader - (:prefix ("a" . "EMMS audio player") - :desc "Go to emms playlist" "a" #'emms-playlist-mode-go - :desc "Emms pause track" "x" #'emms-pause - :desc "Emms stop track" "s" #'emms-stop - :desc "Emms play previous track" "p" #'emms-previous - :desc "Emms play next track" "n" #'emms-next)) - -(use-package emojify - :hook (after-init . global-emojify-mode)) - -(map! :leader - (:prefix ("e". "evaluate/ERC/EWW") - :desc "Launch ERC with TLS connection" "E" #'erc-tls)) - -(setq erc-prompt (lambda () (concat "[" (buffer-name) "]")) - erc-server "irc.libera.chat" - erc-nick "distrotube" - erc-user-full-name "Derek Taylor" - erc-track-shorten-start 24 - erc-autojoin-channels-alist '(("irc.libera.chat" "#archlinux" "#linux" "#emacs")) - erc-kill-buffer-on-part t - erc-fill-column 100 - erc-fill-function 'erc-fill-static - erc-fill-static-center 20 - ;; erc-auto-query 'bury - ) - -(map! :leader - (:prefix ("e". "evaluate/ERC/EWW") - :desc "Evaluate elisp in buffer" "b" #'eval-buffer - :desc "Evaluate defun" "d" #'eval-defun - :desc "Evaluate elisp expression" "e" #'eval-expression - :desc "Evaluate last sexpression" "l" #'eval-last-sexp - :desc "Evaluate elisp in region" "r" #'eval-region)) - -(setq browse-url-browser-function 'eww-browse-url) -(map! :leader - :desc "Search web for text between BEG/END" - "s w" #'eww-search-words - (:prefix ("e" . "evaluate/ERC/EWW") - :desc "Eww web browser" "w" #'eww - :desc "Eww reload page" "R" #'eww-reload)) - -(autoload 'exwm-enable "exwm-config.el") - -(setq doom-font (font-spec :family "JetBrains Mono" :size 15) - doom-variable-pitch-font (font-spec :family "Ubuntu" :size 15) - doom-big-font (font-spec :family "JetBrains Mono" :size 24)) -(after! doom-themes - (setq doom-themes-enable-bold t - doom-themes-enable-italic t)) -(custom-set-faces! - '(font-lock-comment-face :slant italic) - '(font-lock-keyword-face :slant italic)) - -(setq imenu-list-focus-after-activation t) - -(map! :leader - (:prefix ("s" . "Search") - :desc "Menu to jump to places in buffer" "i" #'counsel-imenu)) - -(map! :leader - (:prefix ("t" . "Toggle") - :desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle)) - -(defun dt/insert-todays-date (prefix) - (interactive "P") - (let ((format (cond - ((not prefix) "%A, %B %d, %Y") - ((equal prefix '(4)) "%m-%d-%Y") - ((equal prefix '(16)) "%Y-%m-%d")))) - (insert (format-time-string format)))) - -(require 'calendar) -(defun dt/insert-any-date (date) - "Insert DATE using the current locale." - (interactive (list (calendar-read-date))) - (insert (calendar-date-string date))) - -(map! :leader - (:prefix ("i d" . "Insert date") - :desc "Insert any date" "a" #'dt/insert-any-date - :desc "Insert todays date" "t" #'dt/insert-todays-date)) - -(setq ivy-posframe-display-functions-alist - '((swiper . ivy-posframe-display-at-point) - (complete-symbol . ivy-posframe-display-at-point) - (counsel-M-x . ivy-display-function-fallback) - (counsel-esh-history . ivy-posframe-display-at-window-center) - (counsel-describe-function . ivy-display-function-fallback) - (counsel-describe-variable . ivy-display-function-fallback) - (counsel-find-file . ivy-display-function-fallback) - (counsel-recentf . ivy-display-function-fallback) - (counsel-register . ivy-posframe-display-at-frame-bottom-window-center) - (dmenu . ivy-posframe-display-at-frame-top-center) - (nil . ivy-posframe-display)) - ivy-posframe-height-alist - '((swiper . 20) - (dmenu . 20) - (t . 10))) -(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it. - -(map! :leader - (:prefix ("v" . "Ivy") - :desc "Ivy push view" "v p" #'ivy-push-view - :desc "Ivy switch view" "v s" #'ivy-switch-view)) +(setq doom-font (font-spec :family "JetBrains Mono" :size 15)) +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. (setq display-line-numbers-type t) -(map! :leader - :desc "Comment or uncomment lines" "TAB TAB" #'comment-line - (:prefix ("t" . "toggle") - :desc "Toggle line numbers" "l" #'doom/toggle-line-numbers - :desc "Toggle line highlight in frame" "h" #'hl-line-mode - :desc "Toggle line highlight globally" "H" #'global-hl-line-mode - :desc "Toggle truncate lines" "t" #'toggle-truncate-lines)) -(custom-set-faces - '(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "variable-pitch")))) - '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7)))) - '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6)))) - '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5)))) - '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4)))) - '(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3)))) - '(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2))))) +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/org/") -(setq minimap-window-location 'right) -(map! :leader - (:prefix ("t" . "toggle") - :desc "Toggle minimap-mode" "m" #'minimap-mode)) -(set-face-attribute 'mode-line nil :font "Ubuntu Mono-13") -(setq doom-modeline-height 30 ;; sets modeline height - doom-modeline-bar-width 5 ;; sets right bar width - doom-modeline-persp-name t ;; adds perspective name to modeline - doom-modeline-persp-icon t) ;; adds folder icon next to persp name - -(xterm-mouse-mode 1) - -(after! neotree - (setq neo-smart-open t - neo-window-fixed-size nil)) -(after! doom-themes - (setq doom-neotree-enable-variable-pitch t)) -(map! :leader - :desc "Toggle neotree file viewer" "t n" #'neotree-toggle - :desc "Open directory in neotree" "d n" #'neotree-dir) - -(map! :leader - (:prefix ("=" . "open file") - :desc "Edit agenda file" "=" #'(lambda () (interactive) (find-file "~/.config/doom/start.org")) - :desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/nc/Org/agenda.org")) - :desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org")) - :desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el")) - :desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el")))) -(map! :leader - (:prefix ("= e" . "open eshell files") - :desc "Edit eshell aliases" "a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) - :desc "Edit eshell profile" "p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile")))) - -(map! :leader - :desc "Org babel tangle" "m B" #'org-babel-tangle) -(after! org - (setq org-directory "~/nc/Org/" - org-default-notes-file (expand-file-name "notes.org" org-directory) - org-ellipsis " ▼ " - org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆") - org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists - org-log-done 'time - org-hide-emphasis-markers t - ;; ex. of org-link-abbrev-alist in action - ;; [[arch-wiki:Name_of_Page][Description]] - org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list - '(("google" . "http://www.google.com/search?q=") - ("arch-wiki" . "https://wiki.archlinux.org/index.php/") - ("ddg" . "https://duckduckgo.com/?q=") - ("wiki" . "https://en.wikipedia.org/wiki/")) - org-table-convert-region-max-lines 20000 - org-todo-keywords ; This overwrites the default Doom org-todo-keywords - '((sequence - "TODO(t)" ; A task that is ready to be tackled - "BLOG(b)" ; Blog writing assignments - "GYM(g)" ; Things to accomplish at the gym - "PROJ(p)" ; A project that contains other tasks - "VIDEO(v)" ; Video assignments - "WAIT(w)" ; Something is holding up this task - "|" ; The pipe necessary to separate "active" states and "inactive" states - "DONE(d)" ; Task has been completed - "CANCELLED(c)" )))) ; Task has been cancelled - -(after! org - (setq org-agenda-files '("~/nc/Org/agenda.org"))) - -(setq - ;; org-fancy-priorities-list '("[A]" "[B]" "[C]") - ;; org-fancy-priorities-list '("❗" "[B]" "[C]") - org-fancy-priorities-list '("🟥" "🟧" "🟨") - org-priority-faces - '((?A :foreground "#ff6c6b" :weight bold) - (?B :foreground "#98be65" :weight bold) - (?C :foreground "#c678dd" :weight bold)) - org-agenda-block-separator 8411) - -(setq org-agenda-custom-commands - '(("v" "A better agenda view" - ((tags "PRIORITY=\"A\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "High-priority unfinished tasks:"))) - (tags "PRIORITY=\"B\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Medium-priority unfinished tasks:"))) - (tags "PRIORITY=\"C\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Low-priority unfinished tasks:"))) - (tags "customtag" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Tasks marked with customtag:"))) - - (agenda "") - (alltodo ""))))) - -(use-package! org-auto-tangle - :defer t - :hook (org-mode . org-auto-tangle-mode) - :config - (setq org-auto-tangle-default t)) - -(defun dt/insert-auto-tangle-tag () - "Insert auto-tangle tag in a literate config." - (interactive) - (evil-org-open-below 1) - (insert "#+auto_tangle: t ") - (evil-force-normal-state)) - -(map! :leader - :desc "Insert auto_tangle tag" "i a" #'dt/insert-auto-tangle-tag) - -(defun dt/org-colors-doom-one () - "Enable Doom One colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#51afef" ultra-bold) - (org-level-2 1.6 "#c678dd" extra-bold) - (org-level-3 1.5 "#98be65" bold) - (org-level-4 1.4 "#da8548" semi-bold) - (org-level-5 1.3 "#5699af" normal) - (org-level-6 1.2 "#a9a1e1" normal) - (org-level-7 1.1 "#46d9ff" normal) - (org-level-8 1.0 "#ff6c6b" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-dracula () - "Enable Dracula colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#8be9fd" ultra-bold) - (org-level-2 1.6 "#bd93f9" extra-bold) - (org-level-3 1.5 "#50fa7b" bold) - (org-level-4 1.4 "#ff79c6" semi-bold) - (org-level-5 1.3 "#9aedfe" normal) - (org-level-6 1.2 "#caa9fa" normal) - (org-level-7 1.1 "#5af78e" normal) - (org-level-8 1.0 "#ff92d0" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-gruvbox-dark () - "Enable Gruvbox Dark colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#458588" ultra-bold) - (org-level-2 1.6 "#b16286" extra-bold) - (org-level-3 1.5 "#98971a" bold) - (org-level-4 1.4 "#fb4934" semi-bold) - (org-level-5 1.3 "#83a598" normal) - (org-level-6 1.2 "#d3869b" normal) - (org-level-7 1.1 "#d79921" normal) - (org-level-8 1.0 "#8ec07c" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-monokai-pro () - "Enable Monokai Pro colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#78dce8" ultra-bold) - (org-level-2 1.6 "#ab9df2" extra-bold) - (org-level-3 1.5 "#a9dc76" bold) - (org-level-4 1.4 "#fc9867" semi-bold) - (org-level-5 1.3 "#ff6188" normal) - (org-level-6 1.2 "#ffd866" normal) - (org-level-7 1.1 "#78dce8" normal) - (org-level-8 1.0 "#ab9df2" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-nord () - "Enable Nord colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#81a1c1" ultra-bold) - (org-level-2 1.6 "#b48ead" extra-bold) - (org-level-3 1.5 "#a3be8c" bold) - (org-level-4 1.4 "#ebcb8b" semi-bold) - (org-level-5 1.3 "#bf616a" normal) - (org-level-6 1.2 "#88c0d0" normal) - (org-level-7 1.1 "#81a1c1" normal) - (org-level-8 1.0 "#b48ead" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-oceanic-next () - "Enable Oceanic Next colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#6699cc" ultra-bold) - (org-level-2 1.6 "#c594c5" extra-bold) - (org-level-3 1.5 "#99c794" bold) - (org-level-4 1.4 "#fac863" semi-bold) - (org-level-5 1.3 "#5fb3b3" normal) - (org-level-6 1.2 "#ec5f67" normal) - (org-level-7 1.1 "#6699cc" normal) - (org-level-8 1.0 "#c594c5" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-palenight () - "Enable Palenight colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#82aaff" ultra-bold) - (org-level-2 1.6 "#c792ea" extra-bold) - (org-level-3 1.5 "#c3e88d" bold) - (org-level-4 1.4 "#ffcb6b" semi-bold) - (org-level-5 1.3 "#a3f7ff" normal) - (org-level-6 1.2 "#e1acff" normal) - (org-level-7 1.1 "#f07178" normal) - (org-level-8 1.0 "#ddffa7" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-solarized-dark () - "Enable Solarized Dark colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#268bd2" ultra-bold) - (org-level-2 1.6 "#d33682" extra-bold) - (org-level-3 1.5 "#859900" bold) - (org-level-4 1.4 "#b58900" semi-bold) - (org-level-5 1.3 "#cb4b16" normal) - (org-level-6 1.2 "#6c71c4" normal) - (org-level-7 1.1 "#2aa198" normal) - (org-level-8 1.0 "#657b83" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-solarized-light () - "Enable Solarized Light colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#268bd2" ultra-bold) - (org-level-2 1.6 "#d33682" extra-bold) - (org-level-3 1.5 "#859900" bold) - (org-level-4 1.4 "#b58900" semi-bold) - (org-level-5 1.3 "#cb4b16" normal) - (org-level-6 1.2 "#6c71c4" normal) - (org-level-7 1.1 "#2aa198" normal) - (org-level-8 1.0 "#657b83" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-tomorrow-night () - "Enable Tomorrow Night colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#81a2be" ultra-bold) - (org-level-2 1.6 "#b294bb" extra-bold) - (org-level-3 1.5 "#b5bd68" bold) - (org-level-4 1.4 "#e6c547" semi-bold) - (org-level-5 1.3 "#cc6666" normal) - (org-level-6 1.2 "#70c0ba" normal) - (org-level-7 1.1 "#b77ee0" normal) - (org-level-8 1.0 "#9ec400" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -;; Load our desired dt/org-colors-* theme on startup -(dt/org-colors-doom-one) - -(use-package ox-man) -(use-package ox-gemini) - -(setq org-journal-dir "~/nc/Org/journal/" - org-journal-date-prefix "* " - org-journal-time-prefix "** " - org-journal-date-format "%B %d, %Y (%A) " - org-journal-file-format "%Y-%m-%d.org") - -(setq org-publish-use-timestamps-flag nil) -(setq org-export-with-broken-links t) -(setq org-publish-project-alist - '(("distro.tube without manpages" - :base-directory "~/nc/gitlab-repos/distro.tube/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/" - :recursive t - :exclude "org-html-themes/.*\\|man-org/man*" - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man0p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man0p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man0p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man1" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man1p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man2" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man2/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man2/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man3" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man3p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man4" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man4/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man4/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man5" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man5/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man5/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man6" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man6/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man6/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man7" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man7/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man7/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man8" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man8/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man8/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("org-static" - :base-directory "~/Org/website" - :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" - :publishing-directory "~/public_html/" - :recursive t - :exclude ".*/org-html-themes/.*" - :publishing-function org-publish-attachment) - ("dtos.dev" - :base-directory "~/nc/gitlab-repos/dtos.dev/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/dtos.dev/html/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - - )) - -(after! org - (setq org-roam-directory "~/nc/Org/roam/" - org-roam-graph-viewer "/usr/bin/brave")) - -(map! :leader - (:prefix ("n r" . "org-roam") - :desc "Completion at point" "c" #'completion-at-point - :desc "Find node" "f" #'org-roam-node-find - :desc "Show graph" "g" #'org-roam-graph - :desc "Insert node" "i" #'org-roam-node-insert - :desc "Capture to node" "n" #'org-roam-capture - :desc "Toggle roam buffer" "r" #'org-roam-buffer-toggle)) - -(use-package! password-store) - -(map! :leader - :desc "Switch to perspective NAME" "DEL" #'persp-switch - :desc "Switch to buffer in perspective" "," #'persp-switch-to-buffer - :desc "Switch to next perspective" "]" #'persp-next - :desc "Switch to previous perspective" "[" #'persp-prev - :desc "Add a buffer current perspective" "+" #'persp-add-buffer - :desc "Remove perspective by name" "-" #'persp-remove-by-name) - -(define-globalized-minor-mode global-rainbow-mode rainbow-mode - (lambda () - (when (not (memq major-mode - (list 'org-agenda-mode))) - (rainbow-mode 1)))) -(global-rainbow-mode 1 ) - -(map! :leader - (:prefix ("r" . "registers") - :desc "Copy to register" "c" #'copy-to-register - :desc "Frameset to register" "f" #'frameset-to-register - :desc "Insert contents of register" "i" #'insert-register - :desc "Jump to register" "j" #'jump-to-register - :desc "List registers" "l" #'list-registers - :desc "Number to register" "n" #'number-to-register - :desc "Interactively choose a register" "r" #'counsel-register - :desc "View a register" "v" #'view-register - :desc "Window configuration to register" "w" #'window-configuration-to-register - :desc "Increment register" "+" #'increment-register - :desc "Point to register" "SPC" #'point-to-register)) - -(setq shell-file-name "/bin/fish" - vterm-max-scrollback 5000) -(setq eshell-rc-script "~/.config/doom/eshell/profile" - eshell-aliases-file "~/.config/doom/eshell/aliases" - eshell-history-size 5000 - eshell-buffer-maximum-lines 5000 - eshell-hist-ignoredups t - eshell-scroll-to-bottom-on-input t - eshell-destroy-buffer-when-process-dies t - eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh")) -(map! :leader - :desc "Eshell" "e s" #'eshell - :desc "Eshell popup toggle" "e t" #'+eshell/toggle - :desc "Counsel eshell history" "e h" #'counsel-esh-history - :desc "Vterm popup toggle" "v t" #'+vterm/toggle) - -(defun prefer-horizontal-split () - (set-variable 'split-height-threshold nil t) - (set-variable 'split-width-threshold 40 t)) ; make this as low as needed -(add-hook 'markdown-mode-hook 'prefer-horizontal-split) -(map! :leader - :desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window) - -(setq initial-buffer-choice "~/.config/doom/start.org") - -(define-minor-mode start-mode - "Provide functions for custom start page." - :lighter " start" - :keymap (let ((map (make-sparse-keymap))) - ;;(define-key map (kbd "M-z") 'eshell) - (evil-define-key 'normal start-mode-map - (kbd "1") '(lambda () (interactive) (find-file "~/.config/doom/config.org")) - (kbd "2") '(lambda () (interactive) (find-file "~/.config/doom/init.el")) - (kbd "3") '(lambda () (interactive) (find-file "~/.config/doom/packages.el")) - (kbd "4") '(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) - (kbd "5") '(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))) - map)) - -(add-hook 'start-mode-hook 'read-only-mode) ;; make start.org read-only; use 'SPC t r' to toggle off read-only. -(provide 'start-mode) - -(map! :leader - (:prefix ("w" . "window") - :desc "Winner redo" "" #'winner-redo - :desc "Winner undo" "" #'winner-undo)) - -(map! :leader - :desc "Zap to char" "z" #'zap-to-char - :desc "Zap up to char" "Z" #'zap-up-to-char) +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `after!' block, otherwise Doom's defaults may override your settings. E.g. +;; +;; (after! PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. diff --git a/.config/doom/config.org b/.config/doom/config.org deleted file mode 100644 index 7ad6f82..0000000 --- a/.config/doom/config.org +++ /dev/null @@ -1,1387 +0,0 @@ -#+TITLE: DT's Doom Emacs Config -#+AUTHOR: Derek Taylor (DT) -#+DESCRIPTION: DT's personal Doom Emacs config. -#+STARTUP: showeverything - -* TABLE OF CONTENTS :toc: -- [[#about-this-config][ABOUT THIS CONFIG]] -- [[#beacon][BEACON]] -- [[#bookmarks-and-buffers][BOOKMARKS AND BUFFERS]] - - [[#bookmarks][Bookmarks]] - - [[#buffers][Buffers]] - - [[#global-auto-revert][Global Auto Revert]] - - [[#keybindings-within-ibuffer-mode][Keybindings within ibuffer mode]] -- [[#calendar][CALENDAR]] -- [[#centaur-tabs][CENTAUR-TABS]] -- [[#clippy][CLIPPY]] -- [[#dired][DIRED]] - - [[#keybindings-to-open-dired][Keybindings To Open Dired]] - - [[#keybindings-within-dired][Keybindings Within Dired]] - - [[#keybindings-within-dired-with-peep-dired-mode-enabled][Keybindings Within Dired With Peep-Dired-Mode Enabled]] - - [[#making-deleted-files-go-to-trash-can][Making deleted files go to trash can]] -- [[#doom-theme][DOOM THEME]] -- [[#ednc-notifications][EDNC (Notifications)]] -- [[#elfeed][ELFEED]] -- [[#emms][EMMS]] -- [[#emojis][EMOJIS]] -- [[#erc][ERC]] -- [[#evaluate-elisp-expressions][EVALUATE ELISP EXPRESSIONS]] -- [[#eww][EWW]] -- [[#exwm][EXWM]] -- [[#fonts][FONTS]] -- [[#imenu][IMENU]] -- [[#insert-date][INSERT DATE]] -- [[#ivy][IVY]] - - [[#ivy-posframe][IVY-POSFRAME]] - - [[#ivy-keybindings][IVY KEYBINDINGS]] -- [[#line-settings][LINE SETTINGS]] -- [[#markdown][MARKDOWN]] -- [[#minimap][MINIMAP]] -- [[#modeline][MODELINE]] -- [[#mouse-support][MOUSE SUPPORT]] -- [[#neotree][NEOTREE]] -- [[#open-specific-files][OPEN SPECIFIC FILES]] -- [[#org-mode][ORG MODE]] - - [[#org-agenda][Org-agenda]] - - [[#org-auto-tangle][Org-auto-tangle]] - - [[#org-fonts][Org fonts]] - - [[#org-export][Org-export]] - - [[#org-journal][Org-journal]] - - [[#org-publish][Org-publish]] - - [[#org-roam][Org-roam]] -- [[#password-store][PASSWORD STORE]] -- [[#perspective][PERSPECTIVE]] -- [[#rainbow-mode][RAINBOW MODE]] -- [[#registers][REGISTERS]] -- [[#shells][SHELLS]] -- [[#splits][SPLITS]] -- [[#start-page][START PAGE]] -- [[#winner-mode][WINNER MODE]] -- [[#zap-to-char][ZAP TO CHAR]] - -* ABOUT THIS CONFIG -This is my personal Doom Emacs config. Doom Emacs is a distribution of Emacs that uses the "evil" keybindings (Vim keybindings) and includes a number of nice extensions and a bit of configuration out of the box. I am maintaining this config not just for myself, but also for those that want to explore some of what is possible with Emacs. I will add a lot of examples of plugins and settings, some of them I may not even use personally. I do this because many people following me on YouTube look at my configs as "documentation". - -* BEACON -Never lose your cursor. When you scroll, your cursor will shine! This is a global minor-mode. Turn it on everywhere with: - -#+begin_src emacs-lisp -(beacon-mode 1) -#+end_src - -* BOOKMARKS AND BUFFERS -Doom Emacs uses 'SPC b' for keybindings related to bookmarks and buffers. - -** Bookmarks -Bookmarks are somewhat like registers in that they record positions you can jump to. Unlike registers, they have long names, and they persist automatically from one Emacs session to the next. The prototypical use of bookmarks is to record where you were reading in various files. - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------+----------------------------------------+------------| -| list-bookmarks | /List bookmarks/ | SPC b L | -| bookmark-set | /Set bookmark/ | SPC b m | -| bookmark-delete | /Delete bookmark/ | SPC b M | -| bookmark-save | /Save current bookmark to bookmark file/ | SPC b w | - -#+BEGIN_SRC emacs-lisp -(setq bookmark-default-file "~/.config/doom/bookmarks") - -(map! :leader - (:prefix ("b". "buffer") - :desc "List bookmarks" "L" #'list-bookmarks - :desc "Set bookmark" "m" #'bookmark-set - :desc "Delete bookmark" "M" #'bookmark-set - :desc "Save current bookmarks to bookmark file" "w" #'bookmark-save)) -#+END_SRC - -** Buffers -Regarding /buffers/, the text you are editing in Emacs resides in an object called a /buffer/. Each time you visit a file, a buffer is used to hold the file’s text. Each time you invoke Dired, a buffer is used to hold the directory listing. /Ibuffer/ is a program that lists all of your Emacs /buffers/, allowing you to navigate between them and filter them. - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------+----------------------+------------| -| ibuffer | /Launch ibuffer/ | SPC b i | -| kill-buffer | /Kill current buffer/ | SPC b k | -| next-buffer | /Goto next buffer/ | SPC b n | -| previous-buffer | /Goto previous buffer/ | SPC b p | -| save-buffer | /Save current buffer/ | SPC b s | - -** Global Auto Revert -A buffer can get out of sync with respect to its visited file on disk if that file is changed by another program. To keep it up to date, you can enable Auto Revert mode by typing M-x auto-revert-mode, or you can set it to be turned on globally with 'global-auto-revert-mode'. I have also turned on Global Auto Revert on non-file buffers, which is especially useful for 'dired' buffers. - -#+begin_src emacs-lisp -(global-auto-revert-mode 1) -(setq global-auto-revert-non-file-buffers t) -#+end_src - -** Keybindings within ibuffer mode -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------------------------+----------------------------------------+------------| -| ibuffer-mark-forward | /Mark the buffer/ | m | -| ibuffer-unmark-forward | /Unmark the buffer/ | u | -| ibuffer-do-kill-on-deletion-marks | /Kill the marked buffers/ | x | -| ibuffer-filter-by-content | /Ibuffer filter by content/ | f c | -| ibuffer-filter-by-directory | /Ibuffer filter by directory/ | f d | -| ibuffer-filter-by-filename | /Ibuffer filter by filename (full path)/ | f f | -| ibuffer-filter-by-mode | /Ibuffer filter by mode/ | f m | -| ibuffer-filter-by-name | /Ibuffer filter by name/ | f n | -| ibuffer-filter-disable | /Disable ibuffer filter/ | f x | -| ibuffer-do-kill-lines | /Hide marked buffers/ | g h | -| ibuffer-update | /Restore hidden buffers/ | g H | - -#+begin_src emacs-lisp -(evil-define-key 'normal ibuffer-mode-map - (kbd "f c") 'ibuffer-filter-by-content - (kbd "f d") 'ibuffer-filter-by-directory - (kbd "f f") 'ibuffer-filter-by-filename - (kbd "f m") 'ibuffer-filter-by-mode - (kbd "f n") 'ibuffer-filter-by-name - (kbd "f x") 'ibuffer-filter-disable - (kbd "g h") 'ibuffer-do-kill-lines - (kbd "g H") 'ibuffer-update) -#+end_src - -* CALENDAR -Let's make a 12-month calendar available so we can have a calendar app that, when we click on time/date in xmobar, we get a nice 12-month calendar to view. - -This is a modification of: http://homepage3.nifty.com/oatu/emacs/calendar.html -See also: https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months - -#+begin_src emacs-lisp -;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months -(defun dt/year-calendar (&optional year) - (interactive) - (require 'calendar) - (let* ( - (current-year (number-to-string (nth 5 (decode-time (current-time))))) - (month 0) - (year (if year year (string-to-number (format-time-string "%Y" (current-time)))))) - (switch-to-buffer (get-buffer-create calendar-buffer)) - (when (not (eq major-mode 'calendar-mode)) - (calendar-mode)) - (setq displayed-month month) - (setq displayed-year year) - (setq buffer-read-only nil) - (erase-buffer) - ;; horizontal rows - (dotimes (j 4) - ;; vertical columns - (dotimes (i 3) - (calendar-generate-month - (setq month (+ month 1)) - year - ;; indentation / spacing between months - (+ 5 (* 25 i)))) - (goto-char (point-max)) - (insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n)) - (widen) - (goto-char (point-max)) - (narrow-to-region (point-max) (point-max))) - (widen) - (goto-char (point-min)) - (setq buffer-read-only t))) - -(defun dt/scroll-year-calendar-forward (&optional arg event) - "Scroll the yearly calendar by year in a forward direction." - (interactive (list (prefix-numeric-value current-prefix-arg) - last-nonmenu-event)) - (unless arg (setq arg 0)) - (save-selected-window - (if (setq event (event-start event)) (select-window (posn-window event))) - (unless (zerop arg) - (let* ( - (year (+ displayed-year arg))) - (dt/year-calendar year))) - (goto-char (point-min)) - (run-hooks 'calendar-move-hook))) - -(defun dt/scroll-year-calendar-backward (&optional arg event) - "Scroll the yearly calendar by year in a backward direction." - (interactive (list (prefix-numeric-value current-prefix-arg) - last-nonmenu-event)) - (dt/scroll-year-calendar-forward (- (or arg 1)) event)) - -(map! :leader - :desc "Scroll year calendar backward" "" #'dt/scroll-year-calendar-backward - :desc "Scroll year calendar forward" "" #'dt/scroll-year-calendar-forward) - -(defalias 'year-calendar 'dt/year-calendar) -#+end_src - -Let's also play around with calfw. -#+begin_src emacs-lisp -(use-package! calfw) -(use-package! calfw-org) -#+end_src - -* CENTAUR-TABS -To use tabs in Doom Emacs, be sure to uncomment "tabs" in Doom's init.el. Displays tabs at the top of the window similar to tabbed web browsers such as Firefox. I don't actually use tabs in Emacs. I placed this in my config to help others who may want tabs. In the default configuration of Doom Emacs, 'SPC t' is used for "toggle" keybindings, so I choose 'SPC t c' to toggle centaur-tabs. The "g" prefix for keybindings is used for a bunch of evil keybindings in Doom, but "g" plus the arrow keys were not used, so I thought I would bind those for tab navigation. But I did leave the default "g t" and "g T" intact if you prefer to use those for centaur-tabs-forward/backward. - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------------------+---------------------------+------------------| -| centaur-tabs-mode | /Toggle tabs globally/ | SPC t c | -| centaur-tabs-local-mode | /Toggle tabs local display/ | SPC t C | -| centaur-tabs-forward | /Next tab/ | g or g t | -| centaur-tabs-backward | /Previous tab/ | g or g T | -| centaur-tabs-forward-group | /Next tab group/ | g | -| centaur-tabs-backward-group | /Previous tab group/ | g | - -#+BEGIN_SRC emacs-lisp -(setq centaur-tabs-set-bar 'over - centaur-tabs-set-icons t - centaur-tabs-gray-out-icons 'buffer - centaur-tabs-height 24 - centaur-tabs-set-modified-marker t - centaur-tabs-style "bar" - centaur-tabs-modified-marker "•") -(map! :leader - :desc "Toggle tabs globally" "t c" #'centaur-tabs-mode - :desc "Toggle tabs local display" "t C" #'centaur-tabs-local-mode) -(evil-define-key 'normal centaur-tabs-mode-map (kbd "g ") 'centaur-tabs-forward ; default Doom binding is 'g t' - (kbd "g ") 'centaur-tabs-backward ; default Doom binding is 'g T' - (kbd "g ") 'centaur-tabs-forward-group - (kbd "g ") 'centaur-tabs-backward-group) -#+END_SRC - -* CLIPPY -Gives us a popup box with "Clippy, the paper clip". You can make him say various things by calling 'clippy-say' function. But the more useful functions of clippy are the two describe functions provided: 'clippy-describe-function' and 'clippy-describe-variable'. Hit the appropriate keybinding while the point is over a function/variable to call it. A popup with helpful clippy will appear, telling you about the function/variable (using describe-function and describe-variable respectively). - -| COMMAND | DESCRIPTION | KEYBINDING | -|--------------------------+---------------------------------------+------------| -| clippy-describe-function | /Clippy describes function under point/ | SPC c h f | -| clippy-describe-variable | /Clippy describes variable under point/ | SPC c h v | - -#+begin_src emacs-lisp -(map! :leader - (:prefix ("c h" . "Help info from Clippy") - :desc "Clippy describes function under point" "f" #'clippy-describe-function - :desc "Clippy describes variable under point" "v" #'clippy-describe-variable)) - -#+end_src - -* DIRED -Dired is the file manager within Emacs. Below, I setup keybindings for image previews (peep-dired). Doom Emacs does not use 'SPC d' for any of its keybindings, so I've chosen the format of 'SPC d' plus 'key'. - -** Keybindings To Open Dired - -| COMMAND | DESCRIPTION | KEYBINDING | -|------------+------------------------------------+------------| -| dired | /Open dired file manager/ | SPC d d | -| dired-jump | /Jump to current directory in dired/ | SPC d j | - -** Keybindings Within Dired -*** Basic dired commands - -| COMMAND | DESCRIPTION | KEYBINDING | -|------------------------+---------------------------------------------+------------| -| dired-view-file | /View file in dired/ | SPC d v | -| dired-up-directory | /Go up in directory tree/ | h | -| dired-find-file | /Go down in directory tree (or open if file)/ | l | -| dired-next-line | /Move down to next line/ | j | -| dired-previous-line | /Move up to previous line/ | k | -| dired-mark | /Mark file at point/ | m | -| dired-unmark | /Unmark file at point/ | u | -| dired-do-copy | /Copy current file or marked files/ | C | -| dired-do-rename | /Rename current file or marked files/ | R | -| dired-hide-details | /Toggle detailed listings on/off/ | ( | -| dired-git-info-mode | /Toggle git information on/off/ | ) | -| dired-create-directory | /Create new empty directory/ | + | -| dired-diff | /Compare file at point with another/ | = | -| dired-subtree-toggle | /Toggle viewing subtree at point/ | TAB | - -*** Dired commands using regex - -| COMMAND | DESCRIPTION | KEYBINDING | -|-------------------------+----------------------------+------------| -| dired-mark-files-regexp | /Mark files using regex/ | % m | -| dired-do-copy-regexp | /Copy files using regex/ | % C | -| dired-do-rename-regexp | /Rename files using regex/ | % R | -| dired-mark-files-regexp | /Mark all files using regex/ | * % | - -*** File permissions and ownership - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------+----------------------------------+------------| -| dired-do-chgrp | /Change the group of marked files/ | g G | -| dired-do-chmod | /Change the mode of marked files/ | M | -| dired-do-chown | /Change the owner of marked files/ | O | -| dired-do-rename | /Rename file or all marked files/ | R | - -#+begin_src emacs-lisp -(map! :leader - (:prefix ("d" . "dired") - :desc "Open dired" "d" #'dired - :desc "Dired jump to current" "j" #'dired-jump) - (:after dired - (:map dired-mode-map - :desc "Peep-dired image previews" "d p" #'peep-dired - :desc "Dired view file" "d v" #'dired-view-file))) - -(evil-define-key 'normal dired-mode-map - (kbd "M-RET") 'dired-display-file - (kbd "h") 'dired-up-directory - (kbd "l") 'dired-open-file ; use dired-find-file instead of dired-open. - (kbd "m") 'dired-mark - (kbd "t") 'dired-toggle-marks - (kbd "u") 'dired-unmark - (kbd "C") 'dired-do-copy - (kbd "D") 'dired-do-delete - (kbd "J") 'dired-goto-file - (kbd "M") 'dired-do-chmod - (kbd "O") 'dired-do-chown - (kbd "P") 'dired-do-print - (kbd "R") 'dired-do-rename - (kbd "T") 'dired-do-touch - (kbd "Y") 'dired-copy-filenamecopy-filename-as-kill ; copies filename to kill ring. - (kbd "Z") 'dired-do-compress - (kbd "+") 'dired-create-directory - (kbd "-") 'dired-do-kill-lines - (kbd "% l") 'dired-downcase - (kbd "% m") 'dired-mark-files-regexp - (kbd "% u") 'dired-upcase - (kbd "* %") 'dired-mark-files-regexp - (kbd "* .") 'dired-mark-extension - (kbd "* /") 'dired-mark-directories - (kbd "; d") 'epa-dired-do-decrypt - (kbd "; e") 'epa-dired-do-encrypt) -;; Get file icons in dired -(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) -;; With dired-open plugin, you can launch external programs for certain extensions -;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv' -(setq dired-open-extensions '(("gif" . "sxiv") - ("jpg" . "sxiv") - ("png" . "sxiv") - ("mkv" . "mpv") - ("mp4" . "mpv"))) -#+end_src - -** Keybindings Within Dired With Peep-Dired-Mode Enabled -If peep-dired is enabled, you will get image previews as you go up/down with 'j' and 'k' - -| COMMAND | DESCRIPTION | KEYBINDING | -|----------------------+------------------------------------------+------------| -| peep-dired | /Toggle previews within dired/ | SPC d p | -| peep-dired-next-file | /Move to next file in peep-dired-mode/ | j | -| peep-dired-prev-file | /Move to previous file in peep-dired-mode/ | k | - -#+BEGIN_SRC emacs-lisp -(evil-define-key 'normal peep-dired-mode-map - (kbd "j") 'peep-dired-next-file - (kbd "k") 'peep-dired-prev-file) -(add-hook 'peep-dired-hook 'evil-normalize-keymaps) -#+END_SRC - -** Making deleted files go to trash can -#+begin_src emacs-lisp -(setq delete-by-moving-to-trash t - trash-directory "~/.local/share/Trash/files/") -#+end_src - -=NOTE=: For convenience, you may want to create a symlink to 'local/share/Trash' in your home directory: -#+begin_example -cd ~/ -ln -s ~/.local/share/Trash . -#+end_example - -* DOOM THEME -Setting the theme to doom-one. To try out new themes, I set a keybinding for counsel-load-theme with 'SPC h t'. - -#+BEGIN_SRC emacs-lisp -(setq doom-theme 'doom-one) -(map! :leader - :desc "Load new theme" "h t" #'counsel-load-theme) -#+END_SRC - -* EDNC (Notifications) -The Emacs Desktop Notification Center (EDNC) is an Emacs package written in pure Lisp that implements a desktop notifications service according to the freedesktop.org specification. EDNC aspires to be a small, but flexible drop-in replacement of standalone daemons like dunst. - -=NOTE=: Ensure that no other notification daemon (such as dunst) is active to use EDNC. - -#+begin_src emacs-lisp -(ednc-mode 1) - -(defun show-notification-in-buffer (old new) - (let ((name (format "Notification %d" (ednc-notification-id (or old new))))) - (with-current-buffer (get-buffer-create name) - (if new (let ((inhibit-read-only t)) - (if old (erase-buffer) (ednc-view-mode)) - (insert (ednc-format-notification new t)) - (pop-to-buffer (current-buffer))) - (kill-buffer))))) - -(add-hook 'ednc-notification-presentation-functions - #'show-notification-in-buffer) - -(evil-define-key 'normal ednc-view-mode-map - (kbd "d") 'ednc-dismiss-notification - (kbd "RET") 'ednc-invoke-action - (kbd "e") 'ednc-toggle-expanded-view) -#+end_src - -* ELFEED -An RSS newsfeed reader for Emacs. - -#+BEGIN_SRC emacs-lisp -(setq elfeed-goodies/entry-pane-size 0.5) - -(evil-define-key 'normal elfeed-show-mode-map - (kbd "J") 'elfeed-goodies/split-show-next - (kbd "K") 'elfeed-goodies/split-show-prev) -(evil-define-key 'normal elfeed-search-mode-map - (kbd "J") 'elfeed-goodies/split-show-next - (kbd "K") 'elfeed-goodies/split-show-prev) -(setq elfeed-feeds (quote - (("https://www.reddit.com/r/linux.rss" reddit linux) - ("https://www.reddit.com/r/commandline.rss" reddit commandline) - ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) - ("https://www.reddit.com/r/emacs.rss" reddit emacs) - ("https://www.gamingonlinux.com/article_rss.php" gaming linux) - ("https://hackaday.com/blog/feed/" hackaday linux) - ("https://opensource.com/feed" opensource linux) - ("https://linux.softpedia.com/backend.xml" softpedia linux) - ("https://itsfoss.com/feed/" itsfoss linux) - ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) - ("https://www.phoronix.com/rss.php" phoronix linux) - ("http://feeds.feedburner.com/d0od" omgubuntu linux) - ("https://www.computerworld.com/index.rss" computerworld linux) - ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) - ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) - ("https://betanews.com/feed" betanews linux) - ("http://lxer.com/module/newswire/headlines.rss" lxer linux)))) -#+END_SRC - -* EMMS -One of the media players available for Emacs is emms, which stands for Emacs Multimedia System. By default, Doom Emacs does not use 'SPC a',' so the format I use for these bindings is 'SPC a' plus 'key'. - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------------+-----------------------------------+------------| -| emms-playlist-mode-go | /Switch to the playlist buffer/ | SPC a a | -| emms-pause | /Pause the track/ | SPC a x | -| emms-stop | /Stop the track/ | SPC a s | -| emms-previous | /Play previous track in playlist/ | SPC a p | -| emms-next | /Play next track in playlist/ | SPC a n | - -#+BEGIN_SRC emacs-lisp -(emms-all) -(emms-default-players) -(emms-mode-line 1) -(emms-playing-time 1) -(setq emms-source-file-default-directory "~/Music/" - emms-playlist-buffer-name "*Music*" - emms-info-asynchronously t - emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find) -(map! :leader - (:prefix ("a" . "EMMS audio player") - :desc "Go to emms playlist" "a" #'emms-playlist-mode-go - :desc "Emms pause track" "x" #'emms-pause - :desc "Emms stop track" "s" #'emms-stop - :desc "Emms play previous track" "p" #'emms-previous - :desc "Emms play next track" "n" #'emms-next)) -#+END_SRC - -* EMOJIS -Emojify is an Emacs extension to display emojis. It can display github style emojis like :smile: or plain ascii ones like :). - -#+begin_src emacs-lisp -(use-package emojify - :hook (after-init . global-emojify-mode)) -#+end_src - -* ERC -ERC is a built-in Emacs IRC client. - -| COMMAND | DESCRIPTION | KEYBINDING | -|---------+---------------------------------------------+------------| -| erc-tls | /Launch ERC using more secure TLS connection/ | SPC e E | - -#+begin_src emacs-lisp -(map! :leader - (:prefix ("e". "evaluate/ERC/EWW") - :desc "Launch ERC with TLS connection" "E" #'erc-tls)) - -(setq erc-prompt (lambda () (concat "[" (buffer-name) "]")) - erc-server "irc.libera.chat" - erc-nick "distrotube" - erc-user-full-name "Derek Taylor" - erc-track-shorten-start 24 - erc-autojoin-channels-alist '(("irc.libera.chat" "#archlinux" "#linux" "#emacs")) - erc-kill-buffer-on-part t - erc-fill-column 100 - erc-fill-function 'erc-fill-static - erc-fill-static-center 20 - ;; erc-auto-query 'bury - ) -#+end_src - -* EVALUATE ELISP EXPRESSIONS -Changing some keybindings from their defaults to better fit with Doom Emacs, and to avoid conflicts with my window managers which sometimes use the control key in their keybindings. By default, Doom Emacs does not use 'SPC e' for anything, so I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e' for 'eww' keybindings). - -| COMMAND | DESCRIPTION | KEYBINDING | -|-----------------+----------------------------------------------+------------| -| eval-buffer | /Evaluate elisp in buffer/ | SPC e b | -| eval-defun | /Evaluate the defun containing or after point/ | SPC e d | -| eval-expression | /Evaluate an elisp expression/ | SPC e e | -| eval-last-sexp | /Evaluate elisp expression before point/ | SPC e l | -| eval-region | /Evaluate elisp in region/ | SPC e r | - -#+Begin_src emacs-lisp -(map! :leader - (:prefix ("e". "evaluate/ERC/EWW") - :desc "Evaluate elisp in buffer" "b" #'eval-buffer - :desc "Evaluate defun" "d" #'eval-defun - :desc "Evaluate elisp expression" "e" #'eval-expression - :desc "Evaluate last sexpression" "l" #'eval-last-sexp - :desc "Evaluate elisp in region" "r" #'eval-region)) -#+END_SRC - -* EWW -EWW is the Emacs Web Wowser, the builtin browser in Emacs. Below I set urls to open in a specific browser (eww) with browse-url-browser-function. By default, Doom Emacs does not use 'SPC e' for anything, so I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e' for 'eval' keybindings). I chose to use 'SPC s w' for eww-search-words because Doom Emacs uses 'SPC s' for 'search' commands. - -#+BEGIN_SRC emacs-lisp -(setq browse-url-browser-function 'eww-browse-url) -(map! :leader - :desc "Search web for text between BEG/END" - "s w" #'eww-search-words - (:prefix ("e" . "evaluate/ERC/EWW") - :desc "Eww web browser" "w" #'eww - :desc "Eww reload page" "R" #'eww-reload)) -#+END_SRC - -* EXWM -#+begin_src emacs-lisp -(autoload 'exwm-enable "exwm-config.el") -#+end_src - -* FONTS -Settings related to fonts within Doom Emacs: -+ 'doom-font' -- standard monospace font that is used for most things in Emacs. -+ 'doom-variable-pitch-font' -- variable font which is useful in some Emacs plugins. -+ 'doom-big-font' -- used in doom-big-font-mode; useful for presentations. -+ 'font-lock-comment-face' -- for comments. -+ 'font-lock-keyword-face' -- for keywords with special significance like 'setq' in elisp. - -#+BEGIN_SRC emacs-lisp -(setq doom-font (font-spec :family "JetBrains Mono" :size 15) - doom-variable-pitch-font (font-spec :family "Ubuntu" :size 15) - doom-big-font (font-spec :family "JetBrains Mono" :size 24)) -(after! doom-themes - (setq doom-themes-enable-bold t - doom-themes-enable-italic t)) -(custom-set-faces! - '(font-lock-comment-face :slant italic) - '(font-lock-keyword-face :slant italic)) -#+END_SRC - -* IMENU -Imenu produces menus for accessing locations in documents, typically in the current buffer. You can access the locations using an ordinary menu (menu bar or other) or using minibuffer completion, or you can install 'imenu-list' and have the imenu displayed as a vertical split that you can toggle show/hide. - -| COMMAND | DESCRIPTION | KEYBINDING | -|-------------------------+----------------------------------+------------| -| counsel-imenu | /Menu to jump to places in buffer/ | SPC s i | -| imenu-list-smart-toggle | /Toggle imenu shown in a sidebar/ | SPC t i | - -#+BEGIN_SRC emacs-lisp -(setq imenu-list-focus-after-activation t) - -(map! :leader - (:prefix ("s" . "Search") - :desc "Menu to jump to places in buffer" "i" #'counsel-imenu)) - -(map! :leader - (:prefix ("t" . "Toggle") - :desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle)) - -#+END_SRC - -* INSERT DATE -Some custom functions to insert the date. The function 'insert-todays-date' can be used one of three different ways: (1) just the keybinding without the universal argument prefix, (2) with one universal argument prefix, or (3) with two universal argument prefixes. The universal argument prefix is 'SPC-u' in Doom Emacs (C-u in standard GNU Emacs). The function 'insert-any-date' only outputs to one format, which is the same format as 'insert-todays-date' without a prefix. - -| COMMAND | EXAMPLE OUTPUT | KEYBINDING | -|-----------------------+---------------------------+-----------------------| -| dt/insert-todays-date | /Friday, November 19, 2021/ | SPC i d t | -| dt/insert-todays-date | /11-19-2021/ | SPC u SPC i d t | -| dt/insert-todays-date | /2021-11-19/ | SPC u SPC u SPC i d t | -| dt/insert-any-date | /Friday, November 19, 2021/ | SPC i d a | - -#+begin_src emacs-lisp -(defun dt/insert-todays-date (prefix) - (interactive "P") - (let ((format (cond - ((not prefix) "%A, %B %d, %Y") - ((equal prefix '(4)) "%m-%d-%Y") - ((equal prefix '(16)) "%Y-%m-%d")))) - (insert (format-time-string format)))) - -(require 'calendar) -(defun dt/insert-any-date (date) - "Insert DATE using the current locale." - (interactive (list (calendar-read-date))) - (insert (calendar-date-string date))) - -(map! :leader - (:prefix ("i d" . "Insert date") - :desc "Insert any date" "a" #'dt/insert-any-date - :desc "Insert todays date" "t" #'dt/insert-todays-date)) -#+end_src - -* IVY -Ivy is a generic completion mechanism for Emacs. - -** IVY-POSFRAME -Ivy-posframe is an ivy extension, which lets ivy use posframe to show its candidate menu. Some of the settings below involve: -+ ivy-posframe-display-functions-alist -- sets the display position for specific programs -+ ivy-posframe-height-alist -- sets the height of the list displayed for specific programs - -Available functions (positions) for 'ivy-posframe-display-functions-alist' -+ ivy-posframe-display-at-frame-center -+ ivy-posframe-display-at-window-center -+ ivy-posframe-display-at-frame-bottom-left -+ ivy-posframe-display-at-window-bottom-left -+ ivy-posframe-display-at-frame-bottom-window-center -+ ivy-posframe-display-at-point -+ ivy-posframe-display-at-frame-top-center - -=NOTE:= If the setting for 'ivy-posframe-display' is set to 'nil' (false), anything that is set to 'ivy-display-function-fallback' will just default to their normal position in Doom Emacs (usually a bottom split). However, if this is set to 't' (true), then the fallback position will be centered in the window. - -#+BEGIN_SRC emacs-lisp -(setq ivy-posframe-display-functions-alist - '((swiper . ivy-posframe-display-at-point) - (complete-symbol . ivy-posframe-display-at-point) - (counsel-M-x . ivy-display-function-fallback) - (counsel-esh-history . ivy-posframe-display-at-window-center) - (counsel-describe-function . ivy-display-function-fallback) - (counsel-describe-variable . ivy-display-function-fallback) - (counsel-find-file . ivy-display-function-fallback) - (counsel-recentf . ivy-display-function-fallback) - (counsel-register . ivy-posframe-display-at-frame-bottom-window-center) - (dmenu . ivy-posframe-display-at-frame-top-center) - (nil . ivy-posframe-display)) - ivy-posframe-height-alist - '((swiper . 20) - (dmenu . 20) - (t . 10))) -(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it. -#+END_SRC - -** IVY KEYBINDINGS -By default, Doom Emacs does not use 'SPC v', so the format I use for these bindings is 'SPC v' plus 'key'. - -#+BEGIN_SRC emacs-lisp -(map! :leader - (:prefix ("v" . "Ivy") - :desc "Ivy push view" "v p" #'ivy-push-view - :desc "Ivy switch view" "v s" #'ivy-switch-view)) -#+END_SRC - -* LINE SETTINGS -I set comment-line to 'SPC TAB TAB' which is a rather comfortable keybinding for me on my ZSA Moonlander keyboard. The standard Emacs keybinding for comment-line is 'C-x C-;'. The other keybindings are for commands that toggle on/off various line-related settings. Doom Emacs uses 'SPC t' for "toggle" commands, so I choose 'SPC t' plus 'key' for those bindings. - -| COMMAND | DESCRIPTION | KEYBINDING | -|--------------------------+-------------------------------------------+-------------| -| comment-line | /Comment or uncomment lines/ | SPC TAB TAB | -| hl-line-mode | /Toggle line highlighting in current frame/ | SPC t h | -| global-hl-line-mode | /Toggle line highlighting globally/ | SPC t H | -| doom/toggle-line-numbers | /Toggle line numbers/ | SPC t l | -| toggle-truncate-lines | /Toggle truncate lines/ | SPC t t | - -#+BEGIN_SRC emacs-lisp -(setq display-line-numbers-type t) -(map! :leader - :desc "Comment or uncomment lines" "TAB TAB" #'comment-line - (:prefix ("t" . "toggle") - :desc "Toggle line numbers" "l" #'doom/toggle-line-numbers - :desc "Toggle line highlight in frame" "h" #'hl-line-mode - :desc "Toggle line highlight globally" "H" #'global-hl-line-mode - :desc "Toggle truncate lines" "t" #'toggle-truncate-lines)) -#+END_SRC - -* MARKDOWN - -#+begin_src emacs-lisp -(custom-set-faces - '(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "variable-pitch")))) - '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7)))) - '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6)))) - '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5)))) - '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4)))) - '(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3)))) - '(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2))))) - -#+end_src - -* MINIMAP -A minimap sidebar displaying a smaller version of the current buffer on either the left or right side. It highlights the currently shown region and updates its position automatically. Be aware that this minimap program does not work in Org documents. This is not unusual though because I have tried several minimap programs and none of them can handle Org. - -| COMMAND | DESCRIPTION | KEYBINDING | -|--------------+-------------------------------------------+------------| -| minimap-mode | /Toggle minimap-mode/ | SPC t m | - -#+begin_src emacs-lisp -(setq minimap-window-location 'right) -(map! :leader - (:prefix ("t" . "toggle") - :desc "Toggle minimap-mode" "m" #'minimap-mode)) -#+end_src - -* MODELINE -The modeline is the bottom status bar that appears in Emacs windows. For more information on what is available to configure in the Doom modeline, check out: -https://github.com/seagle0128/doom-modeline - -#+begin_src emacs-lisp -(set-face-attribute 'mode-line nil :font "Ubuntu Mono-13") -(setq doom-modeline-height 30 ;; sets modeline height - doom-modeline-bar-width 5 ;; sets right bar width - doom-modeline-persp-name t ;; adds perspective name to modeline - doom-modeline-persp-icon t) ;; adds folder icon next to persp name -#+end_src - -* MOUSE SUPPORT -Adding mouse support in the terminal version of Emacs. - -#+begin_src emacs-lisp -(xterm-mouse-mode 1) -#+end_src - -* NEOTREE -Neotree is a file tree viewer. When you open neotree, it jumps to the current file thanks to neo-smart-open. The neo-window-fixed-size setting makes the neotree width be adjustable. Doom Emacs had no keybindings set for neotree. Since Doom Emacs uses 'SPC t' for 'toggle' keybindings, I used 'SPC t n' for toggle-neotree. - -| COMMAND | DESCRIPTION | KEYBINDING | -|----------------+---------------------------+------------| -| neotree-toggle | /Toggle neotree/ | SPC t n | -| neotree- dir | /Open directory in neotree/ | SPC d n | - -#+BEGIN_SRC emacs-lisp -(after! neotree - (setq neo-smart-open t - neo-window-fixed-size nil)) -(after! doom-themes - (setq doom-neotree-enable-variable-pitch t)) -(map! :leader - :desc "Toggle neotree file viewer" "t n" #'neotree-toggle - :desc "Open directory in neotree" "d n" #'neotree-dir) -#+END_SRC - -* OPEN SPECIFIC FILES -Keybindings to open files that I work with all the time using the find-file command, which is the interactive file search that opens with 'C-x C-f' in GNU Emacs or 'SPC f f' in Doom Emacs. These keybindings use find-file non-interactively since we specify exactly what file to open. The format I use for these bindings is 'SPC =' plus 'key' since Doom Emacs does not use 'SPC ='. - -=NOTE=: Doom Emacs already has a function 'doom/open-private-config' set to the keybinding 'SPC f p'. This allows you to open any file in your HOME/.config/doom directory, so the following keybindings that I created are not really necessary, but I created this section as an example of how to to create bindings that open specific files on your system. - -| PATH TO FILE | DESCRIPTION | KEYBINDING | -|-------------------------------+-----------------------------+------------| -| ~/.config/doom/start.org | /Edit start.org (start page)/ | SPC = = | -| ~/nc/Org/agenda.org | /Edit agenda file/ | SPC = a | -| ~/.config/doom/config.org | /Edit doom config.org/ | SPC = c | -| ~/.config/doom/init.el | /Edit doom init.el/ | SPC = i | -| ~/.config/doom/packages.el | /Edit doom packages.el/ | SPC = p | -| ~/.config/doom/eshell/aliases | /Edit eshell aliases/ | SPC = e a | -| ~/.config/doom/eshell/profile | /Edit eshell profile/ | SPC = e p | - -#+BEGIN_SRC emacs-lisp -(map! :leader - (:prefix ("=" . "open file") - :desc "Edit agenda file" "=" #'(lambda () (interactive) (find-file "~/.config/doom/start.org")) - :desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/nc/Org/agenda.org")) - :desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org")) - :desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el")) - :desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el")))) -(map! :leader - (:prefix ("= e" . "open eshell files") - :desc "Edit eshell aliases" "a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) - :desc "Edit eshell profile" "p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile")))) -#+END_SRC - -* ORG MODE -I wrapped most of this block in (after! org). Without this, my settings might be evaluated too early, which will result in my settings being overwritten by Doom's defaults. I have also enabled org-journal, org-superstar and org-roam by adding (+journal +pretty +roam2) to the org section of my Doom Emacs init.el. - -=NOTE=: I have the location of my Org directory and Roam directory in $HOME/nc/ which is a Nextcloud folder that allows me to instantly sync all of my Org work between my home computer and my office computer. - -#+BEGIN_SRC emacs-lisp -(map! :leader - :desc "Org babel tangle" "m B" #'org-babel-tangle) -(after! org - (setq org-directory "~/nc/Org/" - org-default-notes-file (expand-file-name "notes.org" org-directory) - org-ellipsis " ▼ " - org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆") - org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists - org-log-done 'time - org-hide-emphasis-markers t - ;; ex. of org-link-abbrev-alist in action - ;; [[arch-wiki:Name_of_Page][Description]] - org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list - '(("google" . "http://www.google.com/search?q=") - ("arch-wiki" . "https://wiki.archlinux.org/index.php/") - ("ddg" . "https://duckduckgo.com/?q=") - ("wiki" . "https://en.wikipedia.org/wiki/")) - org-table-convert-region-max-lines 20000 - org-todo-keywords ; This overwrites the default Doom org-todo-keywords - '((sequence - "TODO(t)" ; A task that is ready to be tackled - "BLOG(b)" ; Blog writing assignments - "GYM(g)" ; Things to accomplish at the gym - "PROJ(p)" ; A project that contains other tasks - "VIDEO(v)" ; Video assignments - "WAIT(w)" ; Something is holding up this task - "|" ; The pipe necessary to separate "active" states and "inactive" states - "DONE(d)" ; Task has been completed - "CANCELLED(c)" )))) ; Task has been cancelled -#+END_SRC - -** Org-agenda -#+begin_src emacs-lisp -(after! org - (setq org-agenda-files '("~/nc/Org/agenda.org"))) - -(setq - ;; org-fancy-priorities-list '("[A]" "[B]" "[C]") - ;; org-fancy-priorities-list '("❗" "[B]" "[C]") - org-fancy-priorities-list '("🟥" "🟧" "🟨") - org-priority-faces - '((?A :foreground "#ff6c6b" :weight bold) - (?B :foreground "#98be65" :weight bold) - (?C :foreground "#c678dd" :weight bold)) - org-agenda-block-separator 8411) - -(setq org-agenda-custom-commands - '(("v" "A better agenda view" - ((tags "PRIORITY=\"A\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "High-priority unfinished tasks:"))) - (tags "PRIORITY=\"B\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Medium-priority unfinished tasks:"))) - (tags "PRIORITY=\"C\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Low-priority unfinished tasks:"))) - (tags "customtag" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Tasks marked with customtag:"))) - - (agenda "") - (alltodo ""))))) -#+end_src - -** Org-auto-tangle -=org-auto-tangle= allows you to add the option =#+auto_tangle: t= in your Org file so that it automatically tangles when you save the document. I have made adding this to your file even easier by creating a function 'dt/insert-auto-tangle-tag' and setting it to a keybinding 'SPC i a'. - -#+begin_src emacs-lisp -(use-package! org-auto-tangle - :defer t - :hook (org-mode . org-auto-tangle-mode) - :config - (setq org-auto-tangle-default t)) - -(defun dt/insert-auto-tangle-tag () - "Insert auto-tangle tag in a literate config." - (interactive) - (evil-org-open-below 1) - (insert "#+auto_tangle: t ") - (evil-force-normal-state)) - -(map! :leader - :desc "Insert auto_tangle tag" "i a" #'dt/insert-auto-tangle-tag) -#+end_src - -** Org fonts -I have created an interactive function for each color scheme (M-x dt/org-colors-*). These functions will set appropriate colors and font attributes for org-level fonts and the org-table font. - -#+begin_src emacs-lisp -(defun dt/org-colors-doom-one () - "Enable Doom One colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#51afef" ultra-bold) - (org-level-2 1.6 "#c678dd" extra-bold) - (org-level-3 1.5 "#98be65" bold) - (org-level-4 1.4 "#da8548" semi-bold) - (org-level-5 1.3 "#5699af" normal) - (org-level-6 1.2 "#a9a1e1" normal) - (org-level-7 1.1 "#46d9ff" normal) - (org-level-8 1.0 "#ff6c6b" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-dracula () - "Enable Dracula colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#8be9fd" ultra-bold) - (org-level-2 1.6 "#bd93f9" extra-bold) - (org-level-3 1.5 "#50fa7b" bold) - (org-level-4 1.4 "#ff79c6" semi-bold) - (org-level-5 1.3 "#9aedfe" normal) - (org-level-6 1.2 "#caa9fa" normal) - (org-level-7 1.1 "#5af78e" normal) - (org-level-8 1.0 "#ff92d0" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-gruvbox-dark () - "Enable Gruvbox Dark colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#458588" ultra-bold) - (org-level-2 1.6 "#b16286" extra-bold) - (org-level-3 1.5 "#98971a" bold) - (org-level-4 1.4 "#fb4934" semi-bold) - (org-level-5 1.3 "#83a598" normal) - (org-level-6 1.2 "#d3869b" normal) - (org-level-7 1.1 "#d79921" normal) - (org-level-8 1.0 "#8ec07c" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-monokai-pro () - "Enable Monokai Pro colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#78dce8" ultra-bold) - (org-level-2 1.6 "#ab9df2" extra-bold) - (org-level-3 1.5 "#a9dc76" bold) - (org-level-4 1.4 "#fc9867" semi-bold) - (org-level-5 1.3 "#ff6188" normal) - (org-level-6 1.2 "#ffd866" normal) - (org-level-7 1.1 "#78dce8" normal) - (org-level-8 1.0 "#ab9df2" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-nord () - "Enable Nord colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#81a1c1" ultra-bold) - (org-level-2 1.6 "#b48ead" extra-bold) - (org-level-3 1.5 "#a3be8c" bold) - (org-level-4 1.4 "#ebcb8b" semi-bold) - (org-level-5 1.3 "#bf616a" normal) - (org-level-6 1.2 "#88c0d0" normal) - (org-level-7 1.1 "#81a1c1" normal) - (org-level-8 1.0 "#b48ead" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-oceanic-next () - "Enable Oceanic Next colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#6699cc" ultra-bold) - (org-level-2 1.6 "#c594c5" extra-bold) - (org-level-3 1.5 "#99c794" bold) - (org-level-4 1.4 "#fac863" semi-bold) - (org-level-5 1.3 "#5fb3b3" normal) - (org-level-6 1.2 "#ec5f67" normal) - (org-level-7 1.1 "#6699cc" normal) - (org-level-8 1.0 "#c594c5" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-palenight () - "Enable Palenight colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#82aaff" ultra-bold) - (org-level-2 1.6 "#c792ea" extra-bold) - (org-level-3 1.5 "#c3e88d" bold) - (org-level-4 1.4 "#ffcb6b" semi-bold) - (org-level-5 1.3 "#a3f7ff" normal) - (org-level-6 1.2 "#e1acff" normal) - (org-level-7 1.1 "#f07178" normal) - (org-level-8 1.0 "#ddffa7" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-solarized-dark () - "Enable Solarized Dark colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#268bd2" ultra-bold) - (org-level-2 1.6 "#d33682" extra-bold) - (org-level-3 1.5 "#859900" bold) - (org-level-4 1.4 "#b58900" semi-bold) - (org-level-5 1.3 "#cb4b16" normal) - (org-level-6 1.2 "#6c71c4" normal) - (org-level-7 1.1 "#2aa198" normal) - (org-level-8 1.0 "#657b83" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-solarized-light () - "Enable Solarized Light colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#268bd2" ultra-bold) - (org-level-2 1.6 "#d33682" extra-bold) - (org-level-3 1.5 "#859900" bold) - (org-level-4 1.4 "#b58900" semi-bold) - (org-level-5 1.3 "#cb4b16" normal) - (org-level-6 1.2 "#6c71c4" normal) - (org-level-7 1.1 "#2aa198" normal) - (org-level-8 1.0 "#657b83" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -(defun dt/org-colors-tomorrow-night () - "Enable Tomorrow Night colors for Org headers." - (interactive) - (dolist - (face - '((org-level-1 1.7 "#81a2be" ultra-bold) - (org-level-2 1.6 "#b294bb" extra-bold) - (org-level-3 1.5 "#b5bd68" bold) - (org-level-4 1.4 "#e6c547" semi-bold) - (org-level-5 1.3 "#cc6666" normal) - (org-level-6 1.2 "#70c0ba" normal) - (org-level-7 1.1 "#b77ee0" normal) - (org-level-8 1.0 "#9ec400" normal))) - (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) - (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) - -;; Load our desired dt/org-colors-* theme on startup -(dt/org-colors-doom-one) -#+end_src - -** Org-export -We need ox-man for "Org eXporting" to manpage format and ox-gemini for exporting to gemtext (for the gemini protocol). - -=NOTE=: I also enable ox-publish for converting an Org site into an HTML site, but that is done in init.el (org +publish). - -#+BEGIN_SRC emacs-lisp -(use-package ox-man) -(use-package ox-gemini) -#+END_SRC - -** Org-journal -#+begin_src emacs-lisp -(setq org-journal-dir "~/nc/Org/journal/" - org-journal-date-prefix "* " - org-journal-time-prefix "** " - org-journal-date-format "%B %d, %Y (%A) " - org-journal-file-format "%Y-%m-%d.org") -#+end_src - -** Org-publish -#+begin_src emacs-lisp -(setq org-publish-use-timestamps-flag nil) -(setq org-export-with-broken-links t) -(setq org-publish-project-alist - '(("distro.tube without manpages" - :base-directory "~/nc/gitlab-repos/distro.tube/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/" - :recursive t - :exclude "org-html-themes/.*\\|man-org/man*" - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man0p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man0p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man0p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man1" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man1p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man2" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man2/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man2/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man3" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man3p" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3p/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3p/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man4" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man4/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man4/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man5" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man5/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man5/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man6" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man6/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man6/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man7" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man7/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man7/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("man8" - :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man8/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man8/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - ("org-static" - :base-directory "~/Org/website" - :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" - :publishing-directory "~/public_html/" - :recursive t - :exclude ".*/org-html-themes/.*" - :publishing-function org-publish-attachment) - ("dtos.dev" - :base-directory "~/nc/gitlab-repos/dtos.dev/" - :base-extension "org" - :publishing-directory "~/nc/gitlab-repos/dtos.dev/html/" - :recursive t - :publishing-function org-html-publish-to-html - :headline-levels 4 ; Just the default for this project. - :auto-preamble t) - - )) -#+end_src - -** Org-roam -[[https://github.com/org-roam/org-roam][Org-roam]] is a plain-text knowledge management system. Org-roam borrows principles from the =Zettelkasten= method, providing a solution for non-hierarchical note-taking. It should also work as a plug-and-play solution for anyone already using Org-mode for their personal wiki. - -| COMMAND | DESCRIPTION | KEYBINDING | -|------------------------+------------------------------------+------------| -| completion-at-point | /Completion of node-insert at point/ | SPC n r c | -| org-roam-node-find | /Find node or create a new one/ | SPC n r f | -| org-roam-graph | /Show graph of all nodes/ | SPC n r g | -| org-roam-node-insert | /Insert link to a node/ | SPC n r i | -| org-roam-capture | /Capture to node/ | SPC n r n | -| org-roam-buffer-toggle | /Toggle roam buffer/ | SPC n r r | - -#+begin_src emacs-lisp -(after! org - (setq org-roam-directory "~/nc/Org/roam/" - org-roam-graph-viewer "/usr/bin/brave")) - -(map! :leader - (:prefix ("n r" . "org-roam") - :desc "Completion at point" "c" #'completion-at-point - :desc "Find node" "f" #'org-roam-node-find - :desc "Show graph" "g" #'org-roam-graph - :desc "Insert node" "i" #'org-roam-node-insert - :desc "Capture to node" "n" #'org-roam-capture - :desc "Toggle roam buffer" "r" #'org-roam-buffer-toggle)) -#+end_src - -* PASSWORD STORE -Uses the standard Unix password store "pass". - -#+begin_src emacs-lisp -(use-package! password-store) -#+end_src - -* PERSPECTIVE -Perspective provides multiple named workspaces (or "perspectives") in Emacs, similar to having multiple desktops in window managers like Awesome and XMonad. Each perspective has its own buffer list and its own window layout, making it easy to work on many separate projects without getting lost in all the buffers. Switching to a perspective activates its window configuration, and when in a perspective, only its buffers are available (by default). Doom Emacs uses 'SPC some_key' for binding some of the perspective commands, so I used this binging format for the perspective bindings that I created.. - -| COMMAND | DESCRIPTION | KEYBINDING | -|----------------------------+-------------------------------------+------------| -| persp-switch | /Switch to perspective NAME/ | SPC DEL | -| persp-switch-to-buffer | /Switch to buffer in perspective/ | SPC , | -| persp-next | /Switch to next perspective/ | SPC ] | -| persp-prev | /Switch to previous perspective/ | SPC [ | -| persp-add-buffer | /Add a buffer to current perspective/ | SPC + | -| persp-remove-by-name | /Remove perspective by name/ | SPC - | -| +workspace/switch-to-{0-9} | /Switch to workspace n/ | SPC 0-9 | - -#+begin_src emacs-lisp -(map! :leader - :desc "Switch to perspective NAME" "DEL" #'persp-switch - :desc "Switch to buffer in perspective" "," #'persp-switch-to-buffer - :desc "Switch to next perspective" "]" #'persp-next - :desc "Switch to previous perspective" "[" #'persp-prev - :desc "Add a buffer current perspective" "+" #'persp-add-buffer - :desc "Remove perspective by name" "-" #'persp-remove-by-name) -#+end_src - -* RAINBOW MODE -Rainbox mode displays the actual color for any hex value color. It's such a nice feature that I wanted it turned on all the time, regardless of what mode I am in. The following creates a global minor mode for rainbow-mode and enables it (exception: org-agenda-mode since rainbow-mode destroys all highlighting in org-agenda). - -#+begin_src emacs-lisp -(define-globalized-minor-mode global-rainbow-mode rainbow-mode - (lambda () - (when (not (memq major-mode - (list 'org-agenda-mode))) - (rainbow-mode 1)))) -(global-rainbow-mode 1 ) -#+end_src - -* REGISTERS -Emacs registers are compartments where you can save text, rectangles and positions for later use. Once you save text or a rectangle in a register, you can copy it into the buffer once or many times; once you save a position in a register, you can jump back to that position once or many times. The default GNU Emacs keybindings for these commands (with the exception of counsel-register) involves 'C-x r' followed by one or more other keys. I wanted to make this a little more user friendly, and since I am using Doom Emacs, I choose to replace the 'C-x r' part of the key chords with 'SPC r'. - -| COMMAND | DESCRIPTION | KEYBINDING | -|----------------------------------+----------------------------------+------------| -| copy-to-register | /Copy to register/ | SPC r c | -| frameset-to-register | /Frameset to register/ | SPC r f | -| insert-register | /Insert contents of register/ | SPC r i | -| jump-to-register | /Jump to register/ | SPC r j | -| list-registers | /List registers/ | SPC r l | -| number-to-register | /Number to register/ | SPC r n | -| counsel-register | /Interactively choose a register/ | SPC r r | -| view-register | /View a register/ | SPC r v | -| window-configuration-to-register | /Window configuration to register/ | SPC r w | -| increment-register | /Increment register/ | SPC r + | -| point-to-register | /Point to register/ | SPC r SPC | - -#+BEGIN_SRC emacs-lisp -(map! :leader - (:prefix ("r" . "registers") - :desc "Copy to register" "c" #'copy-to-register - :desc "Frameset to register" "f" #'frameset-to-register - :desc "Insert contents of register" "i" #'insert-register - :desc "Jump to register" "j" #'jump-to-register - :desc "List registers" "l" #'list-registers - :desc "Number to register" "n" #'number-to-register - :desc "Interactively choose a register" "r" #'counsel-register - :desc "View a register" "v" #'view-register - :desc "Window configuration to register" "w" #'window-configuration-to-register - :desc "Increment register" "+" #'increment-register - :desc "Point to register" "SPC" #'point-to-register)) -#+END_SRC - -* SHELLS -Settings for the various shells and terminal emulators within Emacs. - -| COMMAND | DESCRIPTION | KEYBINDING | -|---------------------+----------------------------+------------| -| eshell | /Launch the eshell/ | SPC e s | -| +eshell/toggle | /Toggle eshell popup window/ | SPC e t | -| counsel-esh-history | /Browse the eshell history/ | SPC e h | -| +vterm/toggle | /Toggle vterm popup window/ | SPC v t | - -#+BEGIN_SRC emacs-lisp -(setq shell-file-name "/bin/fish" - vterm-max-scrollback 5000) -(setq eshell-rc-script "~/.config/doom/eshell/profile" - eshell-aliases-file "~/.config/doom/eshell/aliases" - eshell-history-size 5000 - eshell-buffer-maximum-lines 5000 - eshell-hist-ignoredups t - eshell-scroll-to-bottom-on-input t - eshell-destroy-buffer-when-process-dies t - eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh")) -(map! :leader - :desc "Eshell" "e s" #'eshell - :desc "Eshell popup toggle" "e t" #'+eshell/toggle - :desc "Counsel eshell history" "e h" #'counsel-esh-history - :desc "Vterm popup toggle" "v t" #'+vterm/toggle) -#+END_SRC - -* SPLITS -I set splits to default to opening on the right using 'prefer-horizontal-split'. I set a keybinding for 'clone-indirect-buffer-other-window' for when I want to have the same document in two splits. The text of the indirect buffer is always identical to the text of its base buffer; changes made by editing either one are visible immediately in the other. But in all other respects, the indirect buffer and its base buffer are completely separate. For example, I can fold one split but other will be unfolded. - -#+BEGIN_SRC emacs-lisp -(defun prefer-horizontal-split () - (set-variable 'split-height-threshold nil t) - (set-variable 'split-width-threshold 40 t)) ; make this as low as needed -(add-hook 'markdown-mode-hook 'prefer-horizontal-split) -(map! :leader - :desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window) -#+END_SRC - -* START PAGE -Instead of using Doom's Dashboard or the Emacs Dashboard program, I have decided to just set an custom start file as my "dashboard" since it allows me more customization options. I have added to the 'start-mode-hook' the argument 'read-only-mode'. This is to prevent accidental editing of the start file, and to prevent clashes with the 'start-mode' specific keybindings. You can toggle on/off read-only-mode with 'SPC t r'. - -#+begin_src emacs-lisp -(setq initial-buffer-choice "~/.config/doom/start.org") - -(define-minor-mode start-mode - "Provide functions for custom start page." - :lighter " start" - :keymap (let ((map (make-sparse-keymap))) - ;;(define-key map (kbd "M-z") 'eshell) - (evil-define-key 'normal start-mode-map - (kbd "1") '(lambda () (interactive) (find-file "~/.config/doom/config.org")) - (kbd "2") '(lambda () (interactive) (find-file "~/.config/doom/init.el")) - (kbd "3") '(lambda () (interactive) (find-file "~/.config/doom/packages.el")) - (kbd "4") '(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) - (kbd "5") '(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))) - map)) - -(add-hook 'start-mode-hook 'read-only-mode) ;; make start.org read-only; use 'SPC t r' to toggle off read-only. -(provide 'start-mode) -#+end_src - -* WINNER MODE -Winner mode has been included with GNU Emacs since version 20. This is a global minor mode and, when activated, it allows you to “undo” (and “redo”) changes in the window configuration with the key commands 'SCP w ' and 'SPC w '. - -#+BEGIN_SRC emacs-lisp -(map! :leader - (:prefix ("w" . "window") - :desc "Winner redo" "" #'winner-redo - :desc "Winner undo" "" #'winner-undo)) -#+END_SRC - -* ZAP TO CHAR -Emacs provides a 'zap-to-char' command that kills from the current point to a character. It is bound to 'M-z' in standard GNU Emacs but since Doom Emacs uses 'SPC' as its leader key and does not have 'SPC z' binded to anything, it just makes since to use it for 'zap-to-char'. Note that 'zap-to-char' can be used with the universal argument 'SPC u' to modify its behavior. Examples of 'zap-to-char' usage are listed in the table below: - -| KEYBINDING | WHAT IS DOES | -|---------------------------+------------------------------------------------------------| -| SPC z e | /deletes all chars to the next occurrence of 'e'/ | -| SPC u 2 SPC z e | /deletes all chars to the second occurrence of 'e'/ | -| SPC u - SPC z e | /deletes all chars to the previous occurrence of 'e'/ | -| SPC u - 2 SPC z e | /deletes all chars to the second previous occurrence of 'e'/ | -| SPC u 1 0 0 SPC u SPC z e | /deletes all chars to the 100th occurrence of 'e'/ | - -=TIP=: The universal argument (SPC u) can only take a single integer by default. If you need to use a multi-digit number (like 100 in the last example in the table above), then you must terminate the universal argument with another 'SPC u' after typing the number. - -'zap-up-to-char' is an alternative command that does not zap the char specified. It is binded to 'SPC Z'. It can also be used in conjunction with the universal argument 'SPC u' in similar fashion to the the 'zap-to-char' examples above. - -=NOTE=: Vim (evil mode) has similar functionality builtin. You can delete to the next occurrence of 'e' by using 'dte' in normal. To delete to the next occurrence of 'e' including the 'e', then you would use 'dfe'. And you can modify 'dt' and 'df' by prefixing them with numbers, so '2dte' would delete to the second occurrence of 'e'. - -#+BEGIN_SRC emacs-lisp -(map! :leader - :desc "Zap to char" "z" #'zap-to-char - :desc "Zap up to char" "Z" #'zap-up-to-char) -#+END_SRC diff --git a/.config/doom/eshell/aliases b/.config/doom/eshell/aliases deleted file mode 100644 index ba389dc..0000000 --- a/.config/doom/eshell/aliases +++ /dev/null @@ -1,29 +0,0 @@ -# Aliases for emacs commands -alias ff find-file $1 - -# Aliasing standard shell commands to better emacs alternatives -alias less view-file $1 - -# Changing "ls" to "exa" -alias ls exa -al --color=always --group-directories-first $* # my preferred listing -alias la exa -a --color=always --group-directories-first $* # all files and dirs -alias ll exa -l --color=always --group-directories-first $* # long format -alias lt exa -aT --color=always --group-directories-first $* # tree listing -alias l. exa -a1 $* | grep "^\." # list hidden files - -# Merge Xresources -alias merge xrdb -merge ~/.Xresources - -# Aliases for doom emacs utilties -alias doomsync ~/.emacs.d/bin/doom sync -alias doomdoctor ~/.emacs.d/bin/doom doctor -alias doomupgrade ~/.emacs.d/bin/doom upgrade -alias doompurge ~/.emacs.d/bin/doom purge - -# Confirm before overwriting something -alias cp cp -i $1 -alias mv mv -i $1 -alias rm rm -i $1 - -# Bare git repo alias for dotfiles -alias config /usr/bin/git --git-dir=$HOME/dotfiles --work-tree=$HOME $* diff --git a/.config/doom/eshell/profile b/.config/doom/eshell/profile deleted file mode 100644 index 3c871d6..0000000 --- a/.config/doom/eshell/profile +++ /dev/null @@ -1 +0,0 @@ -colorscript random \ No newline at end of file diff --git a/.config/doom/images/doom-emacs-dash.png b/.config/doom/images/doom-emacs-dash.png deleted file mode 100644 index 53141eeef884abc6070c9dacaa265d897d1a8d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28349 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 Y1I6cR)As`}rT_o{07*qoM6N<$f--9{CIA2c diff --git a/.config/doom/images/emacs-dash.png b/.config/doom/images/emacs-dash.png deleted file mode 100644 index 931758fcdf779bc7371bff1ae4e1c2c34d82e139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36692 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 P00000NkvXXu0mjfJI177 diff --git a/.config/doom/images/emacs-start-page.png b/.config/doom/images/emacs-start-page.png deleted file mode 100644 index 8e6441ea1c52e1bb885ea161631fc80a5385123d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34520 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 UA9zzZg#idWUHx3vIVCg!0KI C++ == 1 ;;clojure ; java with a lisp ;;common-lisp ; if you've seen one lisp, you've seen them all ;;coq ; proofs-as-programs @@ -119,62 +123,63 @@ ;;csharp ; unity, .NET, and mono shenanigans ;;data ; config/data formats ;;(dart +flutter) ; paint ui and not much else + ;;dhall ;;elixir ; erlang done right ;;elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses ;;erlang ; an elegant language for a more civilized age ;;ess ; emacs speaks statistics + ;;factor ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) ;;fsharp ; ML stands for Microsoft's Language ;;fstar ; (dependent) types and (monadic) effects and Z3 ;;gdscript ; the language you waited for ;;(go +lsp) ; the hipster dialect - (haskell +dante) ; a language that's lazier than I am + ;;(graphql +lsp) ; Give queries a REST + (haskell +lsp) ; a language that's lazier than I am ;;hy ; readability of scheme w/ speed of python ;;idris ; a language you can depend on - json ; At least it ain't XML - ;;(java +meghanada) ; the poster child for carpal tunnel syndrome - javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;json ; At least it ain't XML + ;;janet ; Fun fact: Janet is me! + ;;(java +lsp) ; the poster child for carpal tunnel syndrome + ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;julia ; a better, faster MATLAB ;;kotlin ; a better, slicker Java(Script) - latex ; writing papers in Emacs has never been so fun - ;;lean - ;;factor - ;;ledger ; an accounting system in Emacs - lua ; one-based indices? one-based indices + ;;latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ;;ledger ; be audit you can be + ;;lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore ;;nim ; python + lisp at the speed of c ;;nix ; I hereby declare "nix geht mehr!" ;;ocaml ; an objective camel - (org - +journal ; enable org journal - +roam2 ; create a personal wiki - +pretty ; replace asterisks with pretty org bullets - +publish) ; create static websites with org - php ; perl's insecure younger brother + org ; organize your plain life in plain text + ;;php ; perl's insecure younger brother ;;plantuml ; diagrams for confusing people more + ;;graphviz ; diagrams for confusing yourself even more ;;purescript ; javascript, but functional - python ; beautiful is better than ugly + python ; beautiful is better than ugly ;;qt ; the 'cutest' gui framework ever ;;racket ; a DSL for DSLs ;;raku ; the artist formerly known as perl6 ;;rest ; Emacs as a REST client ;;rst ; ReST in peace ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() ;;scala ; java, but good - ;;scheme ; a fully conniving family of lisps - sh ; she sells {ba,z,fi}sh shells on the C xor + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor ;;sml ;;solidity ; do you need a blockchain? No. ;;swift ; who asked for emoji variables? ;;terra ; Earth and Moon in alignment for performance. - web ; the tubes - yaml ; JSON, but readable + ;;web ; the tubes + ;;yaml ; JSON, but readable + ;;zig ; C, but simpler :email - ;;mu4e - ;;smtpmail + ;;(mu4e +org +gmail) ;;notmuch ;;(wanderlust +gmail) @@ -183,9 +188,8 @@ emms ;;everywhere ; *leave* Emacs!? You must be joking ;;irc ; how neckbeards socialize - rss ; emacs as an RSS reader - ;;twitter ; twitter client https://twitter.com/vnought + (rss +org) ; emacs as an RSS reader :config - literate + ;;literate (default +bindings +smartparens)) diff --git a/.config/doom/packages.el b/.config/doom/packages.el index 9e00b28..b09ecb5 100644 --- a/.config/doom/packages.el +++ b/.config/doom/packages.el @@ -3,83 +3,49 @@ ;; To install a package with Doom you must declare them here and run 'doom sync' ;; on the command line, then restart Emacs for the changes to take effect -- or -;; use 'M-x doom/reload'. ;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: -;(package! some-package) +;; (package! some-package) ;; To install a package directly from a remote git repo, you must specify a ;; `:recipe'. You'll find documentation on what `:recipe' accepts here: -;; https://github.com/raxod502/straight.el#the-recipe-format -;(package! another-package -; :recipe (:host github :repo "username/repo")) +;; https://github.com/radian-software/straight.el#the-recipe-format +;; (package! another-package +;; :recipe (:host github :repo "username/repo")) ;; If the package you are trying to install does not contain a PACKAGENAME.el ;; file, or is located in a subdirectory of the repo, you'll need to specify ;; `:files' in the `:recipe': -;(package! this-package -; :recipe (:host github :repo "username/repo" -; :files ("some-file.el" "src/lisp/*.el"))) +;; (package! this-package +;; :recipe (:host github :repo "username/repo" +;; :files ("some-file.el" "src/lisp/*.el"))) ;; If you'd like to disable a package included with Doom, you can do so here ;; with the `:disable' property: -;(package! builtin-package :disable t) +;; (package! builtin-package :disable t) ;; You can override the recipe of a built in package without having to specify ;; all the properties for `:recipe'. These will inherit the rest of its recipe ;; from Doom or MELPA/ELPA/Emacsmirror: -;(package! builtin-package :recipe (:nonrecursive t)) -;(package! builtin-package-2 :recipe (:repo "myfork/package")) +;; (package! builtin-package :recipe (:nonrecursive t)) +;; (package! builtin-package-2 :recipe (:repo "myfork/package")) ;; Specify a `:branch' to install a package from a particular branch or tag. ;; This is required for some packages whose default branch isn't 'master' (which -;; our package manager can't deal with; see raxod502/straight.el#279) -;(package! builtin-package :recipe (:branch "develop")) +;; our package manager can't deal with; see radian-software/straight.el#279) +;; (package! builtin-package :recipe (:branch "develop")) ;; Use `:pin' to specify a particular commit to install. -;(package! builtin-package :pin "1a2b3c4d5e") +;; (package! builtin-package :pin "1a2b3c4d5e") ;; Doom's packages are pinned to a specific commit and updated from release to ;; release. The `unpin!' macro allows you to unpin single packages... -;(unpin! pinned-package) +;; (unpin! pinned-package) ;; ...or multiple packages -;(unpin! pinned-package another-pinned-package) +;; (unpin! pinned-package another-pinned-package) ;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) -;(unpin! t) +;; (unpin! t) -;; (package! gitconfig-mode -;; :recipe (:host github :repo "magit/git-modes" -;; :files ("gitconfig-mode.el"))) -;; (package! gitignore-mode -;; :recipe (:host github :repo "magit/git-modes" -;; :files ("gitignore-mode.el"))) -(package! flycheck-aspell) -(package! calfw) -(package! calfw-org) -;;(package! dashboard) -(package! dired-open) -(package! dired-subtree) -(package! dirvish) -(package! dmenu) -(package! ednc) -(package! emojify) -(package! evil-tutor) -(package! exwm) -(package! imenu-list) -(package! ivy-posframe) -(package! mw-thesaurus) -(package! org-auto-tangle) -(package! org-web-tools) -(package! ox-gemini) -(package! peep-dired) -(package! password-store) -(package! rainbow-mode) -(package! resize-window) (package! tldr) -(package! wc-mode) -(package! beacon) -(package! clippy) -(package! minimap) -(package! olivetti) diff --git a/.config/doom/start.org b/.config/doom/start.org deleted file mode 100644 index be79fb1..0000000 --- a/.config/doom/start.org +++ /dev/null @@ -1,45 +0,0 @@ -#+STARTUP: inlineimages - -[[file:./images/emacs-start-page.png]] - -⦿ *IMPORTANT KEYBINDINGS* -|------------+---------------------+------------------------------------| -| M-x | [[elisp:(counsel-M-x)][counsel-M-x]] | Prompt for Emacs programs | -| SPC . | [[elisp:(counsel-find-file)][counsel-find-file]] | Find a file | -| SPC f r | [[elisp:(counsel-recentf)][counsel-recentf]] | Find a recent file | -| SPC d d | [[elisp:(dired (getenv "HOME"))][dired]] | Dired file manager | -| SPC h r r | [[elisp:(doom/reload)][doom/reload]] | Reload Doom Emacs | -| SPC f u | [[elisp:(doom/sudo-find-file nil)][doom/sudo-find-file]] | Find file and open as root | -| SPC f U | /doom/sudo-this-file/ | Open current file as root | -| SPC e t | [[elisp:(+eshell/toggle nil)][+eshell/toggle]] | Toggle the eshell | -| SPC v t | [[elisp:(+vterm/toggle nil)][+vterm/toggle]] | Toggle the vterm terminal emulator | -|------------+---------------------+------------------------------------| - -⦿ *BUFFERS AND SPLITS* -|------------------------------+------------------------------+-----------------------------| -| (SPC b i) [[elisp:(ibuffer)][ibuffer]] | (SPC b p) [[elisp:(previous-buffer)][previous-buffer]] | (SPC b n) [[elisp:(next-buffer)][next-buffer]] | -| (SPC b k) [[elisp:(kill-buffer)][kill-buffer]] | (SPC b s) [[elisp:(save-buffer)][save-buffer]] | (SPC b u) /sudo-save-buffer/ | -| (SPC w s) [[elisp:(evil-window-split)][evil-window-split]] | (SPC w v) [[elisp:(evil-window-vsplit)][evil-window-vsplit]] | (SPC w w) [[elisp:(evil-window-next)][evil-window-next]] | -| (SPC w c) [[elisp:(evil-window-delete)][evil-window-delete]] | (SPC w l) [[elisp:(evil-window-left 1)][evil-window-left]] | (SPC w h) [[elisp:(evil-window-right 1)][evil-window-right]] | -|------------------------------+------------------------------+-----------------------------| - -⦿ *HELP INFORMATION* -|-----------------------------+-----------------------------+-------------------------------| -| (SPC h d h) [[elisp:(doom/help)][doom/help]] | (SPC h d f) [[elisp:(doom/help-faq)][doom/help-faq]] | (SPC h i) [[elisp:(info)][info]] | -| (SPC h f) [[elisp:(counsel-describe-function)][describe-function]] | (SPC h v) [[elisp:(counsel-describe-variable)][describe-variable]] | (SPC h b b) [[elisp:(counsel-descbinds)][describe-bindings]] | -|-----------------------------+-----------------------------+-------------------------------| - -⦿ *DOOM EMACS CONFIGS* (Press =1-5= to immediately open a file) -|---+----------------+------------------------------------------------------------| -| =1= | [[elisp:(find-file (concat (getenv "HOME") "/.config/doom/config.org"))][config.org]] | This is the main user configuration file for Doom Emacs. | -| =2= | [[elisp:(find-file (concat (getenv "HOME") "/.config/doom/init.el"))][init.el]] | Allows you to turn on/off the standard Doom modules. | -| =3= | [[elisp:(find-file (concat (getenv "HOME") "/.config/doom/packages.el"))][packages.el]] | Easily install extra packages by adding them to this file. | -| =4= | [[elisp:(find-file (concat (getenv "HOME") "/.config/doom/eshell/aliases"))][eshell/aliases]] | Aliases file for the eshell. | -| =5= | [[elisp:(find-file (concat (getenv "HOME") "/.config/doom/eshell/profile"))][eshell/profile]] | Profile for the eshell. | -|---+----------------+------------------------------------------------------------| - -=NOTE=: 'SPC f p' [[elisp:(doom/find-file-in-private-config)][doom/find-file-in-private-config]]) - -;; Local Variables: -;; eval: (start-mode) -;; End: diff --git a/.config/emacs/agenda.org b/.config/emacs/agenda.org deleted file mode 100644 index e69de29..0000000 diff --git a/.config/emacs/config.el b/.config/emacs/config.el deleted file mode 100644 index c5e59b0..0000000 --- a/.config/emacs/config.el +++ /dev/null @@ -1,821 +0,0 @@ -(add-to-list 'load-path "~/.config/emacs/scripts/") - -(require 'elpaca-setup) ;; The Elpaca Package Manager -(require 'app-launchers) ;; Use emacs as a run launcher like dmenu (experimental) -(require 'buffer-move) ;; Buffer-move for better window management -(require 'eshell-prompt) ;; A fancy prompt for eshell - -(use-package all-the-icons - :ensure t - :if (display-graphic-p)) - -(use-package all-the-icons-dired - :hook (dired-mode . (lambda () (all-the-icons-dired-mode t)))) - -(setq backup-directory-alist '((".*" . "~/.local/share/Trash/files"))) - -(use-package company - :defer 2 - :diminish - :custom - (company-begin-commands '(self-insert-command)) - (company-idle-delay .1) - (company-minimum-prefix-length 2) - (company-show-numbers t) - (company-tooltip-align-annotations 't) - (global-company-mode t)) - -(use-package company-box - :after company - :diminish - :hook (company-mode . company-box-mode)) - -(use-package dashboard - :ensure t - :init - (setq initial-buffer-choice 'dashboard-open) - (setq dashboard-set-heading-icons t) - (setq dashboard-set-file-icons t) - (setq dashboard-banner-logo-title "Emacs Is More Than A Text Editor!") - ;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner - (setq dashboard-startup-banner "~/.config/emacs/images/dtmacs-logo.png") ;; use custom image as banner - (setq dashboard-center-content nil) ;; set to 't' for centered content - (setq dashboard-items '((recents . 5) - (agenda . 5 ) - (bookmarks . 3) - (projects . 3))) - :custom - (dashboard-modify-heading-icons '((recents . "file-text") - (bookmarks . "book"))) - :config - (dashboard-setup-startup-hook)) - -(use-package diminish) - -(use-package dired-open - :config - (setq dired-open-extensions '(("gif" . "sxiv") - ("jpg" . "sxiv") - ("png" . "sxiv") - ("mkv" . "mpv") - ("mp4" . "mpv")))) - -(use-package peep-dired - :after dired - :hook (evil-normalize-keymaps . peep-dired-hook) - :config - (evil-define-key 'normal dired-mode-map (kbd "h") 'dired-up-directory) - (evil-define-key 'normal dired-mode-map (kbd "l") 'dired-open-file) ; use dired-find-file instead if not using dired-open package - (evil-define-key 'normal peep-dired-mode-map (kbd "j") 'peep-dired-next-file) - (evil-define-key 'normal peep-dired-mode-map (kbd "k") 'peep-dired-prev-file) -) - -(use-package drag-stuff - :init - (drag-stuff-global-mode 1) - (drag-stuff-define-keys)) - -(setq ediff-split-window-function 'split-window-horizontally - ediff-window-setup-function 'ediff-setup-windows-plain) - -(defun dt-ediff-hook () - (ediff-setup-keymap) - (define-key ediff-mode-map "j" 'ediff-next-difference) - (define-key ediff-mode-map "k" 'ediff-previous-difference)) - -(add-hook 'ediff-mode-hook 'dt-ediff-hook) - -(use-package elfeed - :config - (setq elfeed-search-feed-face ":foreground #ffffff :weight bold" - elfeed-feeds (quote - (("https://www.reddit.com/r/linux.rss" reddit linux) - ("https://www.reddit.com/r/commandline.rss" reddit commandline) - ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) - ("https://www.reddit.com/r/emacs.rss" reddit emacs) - ("https://www.gamingonlinux.com/article_rss.php" gaming linux) - ("https://hackaday.com/blog/feed/" hackaday linux) - ("https://opensource.com/feed" opensource linux) - ("https://linux.softpedia.com/backend.xml" softpedia linux) - ("https://itsfoss.com/feed/" itsfoss linux) - ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) - ("https://www.phoronix.com/rss.php" phoronix linux) - ("http://feeds.feedburner.com/d0od" omgubuntu linux) - ("https://www.computerworld.com/index.rss" computerworld linux) - ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) - ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) - ("https://betanews.com/feed" betanews linux) - ("http://lxer.com/module/newswire/headlines.rss" lxer linux) - ("https://distrowatch.com/news/dwd.xml" distrowatch linux))))) - - -(use-package elfeed-goodies - :init - (elfeed-goodies/setup) - :config - (setq elfeed-goodies/entry-pane-size 0.5)) - -(use-package ellama - :init - (setopt ellama-keymap-prefix "C-c e") ;; keymap for all ellama functions - (setopt ellama-language "English") ;; language ellama should translate to - (require 'llm-ollama) - (setopt ellama-provider - (make-llm-ollama - ;; this model should be pulled to use it - ;; value should be the same as you print in terminal during pull - :chat-model "llama3.1" - :embedding-model "nomic-embed-text" - :default-chat-non-standard-params '(("num_ctx" . 8192)))) - ;; Predefined llm providers for interactive switching. - (setopt ellama-providers - '(("zephyr" . (make-llm-ollama - :chat-model "zephyr" - :embedding-model "zephyr")) - - ("llama3.1" . (make-llm-ollama - :chat-model "llama3.1" - :embedding-model "llama3.1")) - ("mixtral" . (make-llm-ollama - :chat-model "mixtral" - :embedding-model "mixtral")))) - (setopt ellama-naming-scheme 'ellama-generate-name-by-llm) - ;; Translation llm provider - (setopt ellama-translation-provider (make-llm-ollama - :chat-model "mixtral" - :embedding-model "nomic-embed-text")) - :config - (setq ellama-sessions-directory "~/.config/emacs/ellama-sessions/" - ellama-sessions-auto-save t)) - -(use-package eradio - :init - (setq eradio-player '("mpv" "--no-video" "--no-terminal")) - :config - (setq eradio-channels '(("Totally 80s FM" . "https://zeno.fm/radio/totally-80s-fm/") - ("Oldies Radio 50s-60s" . "https://zeno.fm/radio/oldies-radio-50s-60s/") - ("Oldies Radio 70s" . "https://zeno.fm/radio/oldies-radio-70s/") - ("Unlimited 80s" . "https://zeno.fm/radio/unlimited80s/") - ("80s Hits" . "https://zeno.fm/radio/80shits/") - ("90s Hits" . "https://zeno.fm/radio/90s_HITS/") - ("2000s Pop" . "https://zeno.fm/radio/2000s-pop/") - ("The 2000s" . "https://zeno.fm/radio/the-2000s/") - ("Hits 2010s" . "https://zeno.fm/radio/helia-hits-2010/") - ("Classical Radio" . "https://zeno.fm/radio/classical-radio/") - ("Classical Relaxation" . "https://zeno.fm/radio/radio-christmas-non-stop-classical/") - ("Classic Rock" . "https://zeno.fm/radio/classic-rockdnb2sav8qs8uv/") - ("Gangsta49" . "https://zeno.fm/radio/gangsta49/") - ("HipHop49" . "https://zeno.fm/radio/hiphop49/") - ("Madhouse Country Radio" . "https://zeno.fm/radio/madhouse-country-radio/") - ("PopMusic" . "https://zeno.fm/radio/popmusic74vyurvmug0uv/") - ("PopStars" . "https://zeno.fm/radio/popstars/") - ("RadioMetal" . "https://zeno.fm/radio/radio-metal/") - ("RocknRoll Radio" . "https://zeno.fm/radio/rocknroll-radio994c7517qs8uv/")))) - -;; Expands to: (elpaca evil (use-package evil :demand t)) -(use-package evil - :init ;; tweak evil's configuration before loading it - (setq evil-want-integration t ;; This is optional since it's already set to t by default. - evil-want-keybinding nil - evil-vsplit-window-right t - evil-split-window-below t - evil-undo-system 'undo-redo) ;; Adds vim-like C-r redo functionality - (evil-mode)) - -(use-package evil-collection - :after evil - :config - ;; Do not uncomment this unless you want to specify each and every mode - ;; that evil-collection should works with. The following line is here - ;; for documentation purposes in case you need it. - ;; (setq evil-collection-mode-list '(calendar dashboard dired ediff info magit ibuffer)) - (add-to-list 'evil-collection-mode-list 'help) ;; evilify help mode - (evil-collection-init)) - -(use-package evil-tutor) - -;; Using RETURN to follow links in Org/Evil -;; Unmap keys in 'evil-maps if not done, (setq org-return-follows-link t) will not work -(with-eval-after-load 'evil-maps - (define-key evil-motion-state-map (kbd "SPC") nil) - (define-key evil-motion-state-map (kbd "RET") nil) - (define-key evil-motion-state-map (kbd "TAB") nil)) -;; Setting RETURN key in org-mode to follow links - (setq org-return-follows-link t) - -(use-package flycheck - :ensure t - :defer t - :diminish - :init (global-flycheck-mode)) - -(set-face-attribute 'default nil - :font "JetBrains Mono" - :height 110 - :weight 'medium) -(set-face-attribute 'variable-pitch nil - :font "Ubuntu" - :height 120 - :weight 'medium) -(set-face-attribute 'fixed-pitch nil - :font "JetBrains Mono" - :height 110 - :weight 'medium) -;; Makes commented text and keywords italics. -;; This is working in emacsclient but not emacs. -;; Your font must have an italic face available. -(set-face-attribute 'font-lock-comment-face nil - :slant 'italic) -(set-face-attribute 'font-lock-keyword-face nil - :slant 'italic) - -;; This sets the default font on all graphical frames created after restarting Emacs. -;; Does the same thing as 'set-face-attribute default' above, but emacsclient fonts -;; are not right unless I also add this method of setting the default font. -(add-to-list 'default-frame-alist '(font . "JetBrains Mono-11")) - -;; Uncomment the following line if line spacing needs adjusting. -(setq-default line-spacing 0.12) -(set-face-background 'mouse "#ffffff") - -(global-set-key (kbd "C-=") 'text-scale-increase) -(global-set-key (kbd "C--") 'text-scale-decrease) -(global-set-key (kbd "") 'text-scale-increase) -(global-set-key (kbd "") 'text-scale-decrease) - -(use-package nerd-icons - ;; :custom - ;; The Nerd Font you want to use in GUI - ;; "Symbols Nerd Font Mono" is the default and is recommended - ;; but you can use any other Nerd Font if you want - ;; (nerd-icons-font-family "Symbols Nerd Font Mono") - ) - -(use-package general - :config - (general-evil-setup) - - ;; set up 'SPC' as the global leader key - (general-create-definer dt/leader-keys - :states '(normal insert visual emacs) - :keymaps 'override - :prefix "SPC" ;; set leader - :global-prefix "M-SPC") ;; access leader in insert mode - - (dt/leader-keys - "SPC" '(counsel-M-x :wk "Counsel M-x") - "." '(find-file :wk "Find file") - "=" '(perspective-map :wk "Perspective") ;; Lists all the perspective keybindings - "TAB TAB" '(comment-line :wk "Comment lines") - "u" '(universal-argument :wk "Universal argument")) - - (dt/leader-keys - "a" '(:ignore t :wk "A.I.") - "a a" '(ellama-ask-about :wk "Ask ellama about region") - "a e" '(:ignore t :wk "Ellama enhance") - "a e g" '(ellama-improve-grammar :wk "Ellama enhance wording") - "a e w" '(ellama-improve-wording :wk "Ellama enhance grammar") - "a i" '(ellama-chat :wk "Ask ellama") - "a p" '(ellama-provider-select :wk "Ellama provider select") - "a s" '(ellama-summarize :wk "Ellama summarize region") - "a t" '(ellama-translate :wk "Ellama translate region")) - - (dt/leader-keys - "b" '(:ignore t :wk "Bookmarks/Buffers") - "b b" '(switch-to-buffer :wk "Switch to buffer") - "b c" '(clone-indirect-buffer :wk "Create indirect buffer copy in a split") - "b C" '(clone-indirect-buffer-other-window :wk "Clone indirect buffer in new window") - "b d" '(bookmark-delete :wk "Delete bookmark") - "b i" '(ibuffer :wk "Ibuffer") - "b k" '(kill-current-buffer :wk "Kill current buffer") - "b K" '(kill-some-buffers :wk "Kill multiple buffers") - "b l" '(list-bookmarks :wk "List bookmarks") - "b m" '(bookmark-set :wk "Set bookmark") - "b n" '(next-buffer :wk "Next buffer") - "b p" '(previous-buffer :wk "Previous buffer") - "b r" '(revert-buffer :wk "Reload buffer") - "b R" '(rename-buffer :wk "Rename buffer") - "b s" '(basic-save-buffer :wk "Save buffer") - "b S" '(save-some-buffers :wk "Save multiple buffers") - "b w" '(bookmark-save :wk "Save current bookmarks to bookmark file")) - - (dt/leader-keys - "d" '(:ignore t :wk "Dired") - "d d" '(dired :wk "Open dired") - "d f" '(wdired-finish-edit :wk "Writable dired finish edit") - "d j" '(dired-jump :wk "Dired jump to current") - "d n" '(neotree-dir :wk "Open directory in neotree") - "d p" '(peep-dired :wk "Peep-dired") - "d w" '(wdired-change-to-wdired-mode :wk "Writable dired")) - - (dt/leader-keys - "e" '(:ignore t :wk "Ediff/Eshell/Eval/EWW") - "e b" '(eval-buffer :wk "Evaluate elisp in buffer") - "e d" '(eval-defun :wk "Evaluate defun containing or after point") - "e e" '(eval-expression :wk "Evaluate and elisp expression") - "e f" '(ediff-files :wk "Run ediff on a pair of files") - "e F" '(ediff-files3 :wk "Run ediff on three files") - "e h" '(counsel-esh-history :which-key "Eshell history") - "e l" '(eval-last-sexp :wk "Evaluate elisp expression before point") - "e n" '(eshell-new :wk "Create new eshell buffer") - "e r" '(eval-region :wk "Evaluate elisp in region") - "e R" '(eww-reload :which-key "Reload current page in EWW") - "e s" '(eshell :which-key "Eshell") - "e w" '(eww :which-key "EWW emacs web wowser")) - - (dt/leader-keys - "f" '(:ignore t :wk "Files") - "f c" '((lambda () (interactive) - (find-file "~/.config/emacs/config.org")) - :wk "Open emacs config.org") - "f e" '((lambda () (interactive) - (dired "~/.config/emacs/")) - :wk "Open user-emacs-directory in dired") - "f d" '(find-grep-dired :wk "Search for string in files in DIR") - "f g" '(counsel-grep-or-swiper :wk "Search for string current file") - "f i" '((lambda () (interactive) - (find-file "~/.config/emacs/init.el")) - :wk "Open emacs init.el") - "f j" '(counsel-file-jump :wk "Jump to a file below current directory") - "f l" '(counsel-locate :wk "Locate a file") - "f r" '(counsel-recentf :wk "Find recent files") - "f u" '(sudo-edit-find-file :wk "Sudo find file") - "f U" '(sudo-edit :wk "Sudo edit file")) - - (dt/leader-keys - "g" '(:ignore t :wk "Git") - "g /" '(magit-displatch :wk "Magit dispatch") - "g ." '(magit-file-displatch :wk "Magit file dispatch") - "g b" '(magit-branch-checkout :wk "Switch branch") - "g c" '(:ignore t :wk "Create") - "g c b" '(magit-branch-and-checkout :wk "Create branch and checkout") - "g c c" '(magit-commit-create :wk "Create commit") - "g c f" '(magit-commit-fixup :wk "Create fixup commit") - "g C" '(magit-clone :wk "Clone repo") - "g f" '(:ignore t :wk "Find") - "g f c" '(magit-show-commit :wk "Show commit") - "g f f" '(magit-find-file :wk "Magit find file") - "g f g" '(magit-find-git-config-file :wk "Find gitconfig file") - "g F" '(magit-fetch :wk "Git fetch") - "g g" '(magit-status :wk "Magit status") - "g i" '(magit-init :wk "Initialize git repo") - "g l" '(magit-log-buffer-file :wk "Magit buffer log") - "g r" '(vc-revert :wk "Git revert file") - "g s" '(magit-stage-file :wk "Git stage file") - "g t" '(git-timemachine :wk "Git time machine") - "g u" '(magit-stage-file :wk "Git unstage file")) - - (dt/leader-keys - "h" '(:ignore t :wk "Help") - "h a" '(counsel-apropos :wk "Apropos") - "h b" '(describe-bindings :wk "Describe bindings") - "h c" '(describe-char :wk "Describe character under cursor") - "h d" '(:ignore t :wk "Emacs documentation") - "h d a" '(about-emacs :wk "About Emacs") - "h d d" '(view-emacs-debugging :wk "View Emacs debugging") - "h d f" '(view-emacs-FAQ :wk "View Emacs FAQ") - "h d m" '(info-emacs-manual :wk "The Emacs manual") - "h d n" '(view-emacs-news :wk "View Emacs news") - "h d o" '(describe-distribution :wk "How to obtain Emacs") - "h d p" '(view-emacs-problems :wk "View Emacs problems") - "h d t" '(view-emacs-todo :wk "View Emacs todo") - "h d w" '(describe-no-warranty :wk "Describe no warranty") - "h e" '(view-echo-area-messages :wk "View echo area messages") - "h f" '(describe-function :wk "Describe function") - "h F" '(describe-face :wk "Describe face") - "h g" '(describe-gnu-project :wk "Describe GNU Project") - "h i" '(info :wk "Info") - "h I" '(describe-input-method :wk "Describe input method") - "h k" '(describe-key :wk "Describe key") - "h l" '(view-lossage :wk "Display recent keystrokes and the commands run") - "h L" '(describe-language-environment :wk "Describe language environment") - "h m" '(describe-mode :wk "Describe mode") - "h r" '(:ignore t :wk "Reload") - "h r r" '((lambda () (interactive) - (load-file "~/.config/emacs/init.el") - (ignore (elpaca-process-queues))) - :wk "Reload emacs config") - "h t" '(load-theme :wk "Load theme") - "h v" '(describe-variable :wk "Describe variable") - "h w" '(where-is :wk "Prints keybinding for command if set") - "h x" '(describe-command :wk "Display full documentation for command")) - - (dt/leader-keys - "m" '(:ignore t :wk "Org") - "m a" '(org-agenda :wk "Org agenda") - "m e" '(org-export-dispatch :wk "Org export dispatch") - "m i" '(org-toggle-item :wk "Org toggle item") - "m t" '(org-todo :wk "Org todo") - "m B" '(org-babel-tangle :wk "Org babel tangle") - "m T" '(org-todo-list :wk "Org todo list")) - - (dt/leader-keys - "m b" '(:ignore t :wk "Tables") - "m b -" '(org-table-insert-hline :wk "Insert hline in table")) - - (dt/leader-keys - "m d" '(:ignore t :wk "Date/deadline") - "m d t" '(org-time-stamp :wk "Org time stamp")) - - (dt/leader-keys - "o" '(:ignore t :wk "Open") - "o d" '(dashboard-open :wk "Dashboard") - "o e" '(elfeed :wk "Elfeed RSS") - "o f" '(make-frame :wk "Open buffer in new frame") - "o F" '(select-frame-by-name :wk "Select frame by name")) - - ;; projectile-command-map already has a ton of bindings - ;; set for us, so no need to specify each individually. - (dt/leader-keys - "p" '(projectile-command-map :wk "Projectile")) - - (dt/leader-keys - "r" '(:ignore t :wk "Radio") - "r p" '(eradio-play :wk "Eradio play") - "r s" '(eradio-stop :wk "Eradio stop") - "r t" '(eradio-toggle :wk "Eradio toggle")) - - - (dt/leader-keys - "s" '(:ignore t :wk "Search") - "s d" '(dictionary-search :wk "Search dictionary") - "s m" '(man :wk "Man pages") - "s o" '(pdf-occur :wk "Pdf search lines matching STRING") - "s t" '(tldr :wk "Lookup TLDR docs for a command") - "s w" '(woman :wk "Similar to man but doesn't require man")) - - (dt/leader-keys - "t" '(:ignore t :wk "Toggle") - "t e" '(eshell-toggle :wk "Toggle eshell") - "t f" '(flycheck-mode :wk "Toggle flycheck") - "t l" '(display-line-numbers-mode :wk "Toggle line numbers") - "t n" '(neotree-toggle :wk "Toggle neotree file viewer") - "t o" '(org-mode :wk "Toggle org mode") - "t r" '(rainbow-mode :wk "Toggle rainbow mode") - "t t" '(visual-line-mode :wk "Toggle truncated lines") - "t v" '(vterm-toggle :wk "Toggle vterm")) - - (dt/leader-keys - "w" '(:ignore t :wk "Windows/Words") - ;; Window splits - "w c" '(evil-window-delete :wk "Close window") - "w n" '(evil-window-new :wk "New window") - "w s" '(evil-window-split :wk "Horizontal split window") - "w v" '(evil-window-vsplit :wk "Vertical split window") - ;; Window motions - "w h" '(evil-window-left :wk "Window left") - "w j" '(evil-window-down :wk "Window down") - "w k" '(evil-window-up :wk "Window up") - "w l" '(evil-window-right :wk "Window right") - "w w" '(evil-window-next :wk "Goto next window") - ;; Move Windows - "w H" '(buf-move-left :wk "Buffer move left") - "w J" '(buf-move-down :wk "Buffer move down") - "w K" '(buf-move-up :wk "Buffer move up") - "w L" '(buf-move-right :wk "Buffer move right") - ;; Words - "w d" '(downcase-word :wk "Downcase word") - "w u" '(upcase-word :wk "Upcase word") - "w =" '(count-words :wk "Count words/lines for buffer")) -) - -(use-package git-timemachine - :after git-timemachine - :hook (evil-normalize-keymaps . git-timemachine-hook) - :config - (evil-define-key 'normal git-timemachine-mode-map (kbd "C-j") 'git-timemachine-show-previous-revision) - (evil-define-key 'normal git-timemachine-mode-map (kbd "C-k") 'git-timemachine-show-next-revision) -) - -(use-package hl-todo - :hook ((org-mode . hl-todo-mode) - (prog-mode . hl-todo-mode)) - :config - (setq hl-todo-highlight-punctuation ":" - hl-todo-keyword-faces - `(("TODO" warning bold) - ("FIXME" error bold) - ("HACK" font-lock-constant-face bold) - ("REVIEW" font-lock-keyword-face bold) - ("NOTE" success bold) - ("DEPRECATED" font-lock-doc-face bold)))) - -(use-package counsel - :after ivy - :diminish - :config - (counsel-mode) - (setq ivy-initial-inputs-alist nil)) ;; removes starting ^ regex in M-x - -(use-package ivy - :bind - ;; ivy-resume resumes the last Ivy-based completion. - (("C-c C-r" . ivy-resume) - ("C-x B" . ivy-switch-buffer-other-window)) - :diminish - :custom - (setq ivy-use-virtual-buffers t) - (setq ivy-count-format "(%d/%d) ") - (setq enable-recursive-minibuffers t) - :config - (ivy-mode)) - -(use-package all-the-icons-ivy-rich - :ensure t - :init (all-the-icons-ivy-rich-mode 1)) - -(use-package ivy-rich - :after ivy - :ensure t - :init (ivy-rich-mode 1) ;; this gets us descriptions in M-x. - :custom - (ivy-virtual-abbreviate 'full - ivy-rich-switch-buffer-align-virtual-buffer t - ivy-rich-path-style 'abbrev) - :config - (ivy-set-display-transformer 'ivy-switch-buffer - 'ivy-rich-switch-buffer-transformer)) - -(use-package dart-mode) -(use-package haskell-mode) -(use-package lua-mode) -(use-package php-mode) - -(global-set-key [escape] 'keyboard-escape-quit) - -(use-package doom-modeline - :ensure t - :init (doom-modeline-mode 1) - :config - (setq doom-modeline-height 35 ;; sets modeline height - doom-modeline-bar-width 5 ;; sets right bar width - doom-modeline-persp-name t ;; adds perspective name to modeline - doom-modeline-persp-icon t)) ;; adds folder icon next to persp name - -(use-package neotree - :config - (setq neo-smart-open t - neo-show-hidden-files t - neo-window-width 55 - neo-window-fixed-size nil - inhibit-compacting-font-caches t - projectile-switch-project-action 'neotree-projectile-action) - ;; truncate long file names in neotree - (add-hook 'neo-after-create-hook - #'(lambda (_) - (with-current-buffer (get-buffer neo-buffer-name) - (setq truncate-lines t) - (setq word-wrap nil) - (make-local-variable 'auto-hscroll-mode) - (setq auto-hscroll-mode nil))))) - -(setq org-agenda-files '("~/.config/emacs/agenda.org")) - -(add-hook 'org-mode-hook 'org-indent-mode) -(use-package org-bullets) -(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) - -(eval-after-load 'org-indent '(diminish 'org-indent-mode)) - - (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))))) - -(require 'org-tempo) - -(setq org-src-preserve-indentation t) - -(use-package toc-org - :commands toc-org-enable - :init (add-hook 'org-mode-hook 'toc-org-enable)) - -(use-package ox-hugo - :ensure t ;Auto-install the package from Melpa - :after ox) - -(use-package pdf-tools - :defer t - :commands (pdf-loader-install) - :mode "\\.pdf\\'" - :bind (:map pdf-view-mode-map - ("j" . pdf-view-next-line-or-next-page) - ("k" . pdf-view-previous-line-or-previous-page) - ("C-=" . pdf-view-enlarge) - ("C--" . pdf-view-shrink)) - :init (pdf-loader-install) - :config (add-to-list 'revert-without-query ".pdf")) - -(add-hook 'pdf-view-mode-hook #'(lambda () (interactive) (display-line-numbers-mode -1) - (blink-cursor-mode -1) - (doom-modeline-mode -1))) - -(use-package perspective - :custom - ;; NOTE! I have also set 'SCP =' to open the perspective menu. - ;; I'm only setting the additional binding because setting it - ;; helps suppress an annoying warning message. - (persp-mode-prefix-key (kbd "C-c M-p")) - :init - (persp-mode) - :config - ;; Sets a file to write to when we save states - (setq persp-state-default-file "~/.config/emacs/sessions")) - -;; This will group buffers by persp-name in ibuffer. -(add-hook 'ibuffer-hook - (lambda () - (persp-ibuffer-set-filter-groups) - (unless (eq ibuffer-sorting-mode 'alphabetic) - (ibuffer-do-sort-by-alphabetic)))) - -;; Automatically save perspective states to file when Emacs exits. -(add-hook 'kill-emacs-hook #'persp-state-save) - -(use-package projectile - :config - (projectile-mode 1)) - -(use-package rainbow-delimiters - :hook ((emacs-lisp-mode . rainbow-delimiters-mode) - (clojure-mode . rainbow-delimiters-mode))) - -(use-package rainbow-mode - :diminish - :hook org-mode prog-mode) - -(delete-selection-mode 1) ;; You can select text and delete it by typing. -(electric-indent-mode -1) ;; Turn off the weird indenting that Emacs does by default. -(electric-pair-mode 1) ;; Turns on automatic parens pairing -;; The following prevents <> from auto-pairing when electric-pair-mode is on. -;; Otherwise, org-tempo is broken when you try to ") #'pcomplete-list))) - -;; A function for easily creating multiple buffers of 'eshell'. -;; NOTE: `C-u M-x eshell` would also create new 'eshell' buffers. -(defun eshell-new (name) - "Create new eshell buffer named NAME." - (interactive "sName: ") - (setq name (concat "$" name)) - (eshell) - (rename-buffer name)) - -(use-package eshell-toggle - :custom - (eshell-toggle-size-fraction 3) - (eshell-toggle-use-projectile-root t) - (eshell-toggle-run-command nil) - (eshell-toggle-init-function #'eshell-toggle-init-ansi-term)) - - (use-package eshell-syntax-highlighting - :after esh-mode - :config - (eshell-syntax-highlighting-global-mode +1)) - - ;; eshell-syntax-highlighting -- adds fish/zsh-like syntax highlighting. - ;; eshell-rc-script -- your profile for eshell; like a bashrc for eshell. - ;; eshell-aliases-file -- sets an aliases file for the eshell. - - (setq eshell-rc-script (concat user-emacs-directory "eshell/profile") - eshell-aliases-file (concat user-emacs-directory "eshell/aliases") - eshell-history-size 5000 - eshell-buffer-maximum-lines 5000 - eshell-hist-ignoredups t - eshell-scroll-to-bottom-on-input t - eshell-destroy-buffer-when-process-dies t - eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh")) - -(use-package vterm - :ensure t - :config - (setq shell-file-name "/bin/sh" - vterm-max-scrollback 5000)) - -(use-package vterm-toggle - :ensure t - :after vterm - :config - ;; When running programs in Vterm and in 'normal' mode, make sure that ESC - ;; kills the program as it would in most standard terminal programs. - (evil-define-key 'normal vterm-mode-map (kbd "") 'vterm--self-insert) - (setq vterm-toggle-fullscreen-p nil) - (setq vterm-toggle-scope 'project) - (add-to-list 'display-buffer-alist - '((lambda (buffer-or-name _) - (let ((buffer (get-buffer buffer-or-name))) - (with-current-buffer buffer - (or (equal major-mode 'vterm-mode) - (string-prefix-p vterm-buffer-name (buffer-name buffer)))))) - (display-buffer-reuse-window display-buffer-at-bottom) - ;;(display-buffer-reuse-window display-buffer-in-direction) - ;;display-buffer-in-direction/direction/dedicated is added in emacs27 - ;;(direction . bottom) - ;;(dedicated . t) ;dedicated is supported in emacs27 - (reusable-frames . visible) - (window-height . 0.4)))) - -(use-package sudo-edit) - -(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/") - -(use-package doom-themes - :config - (setq doom-themes-enable-bold t ; if nil, bold is universally disabled - doom-themes-enable-italic t) ; if nil, italics is universally disabled - ;; Sets the default theme to load!!! - (load-theme 'doom-one t) - ;; Enable custom neotree theme (all-the-icons must be installed!) - (doom-themes-neotree-config) - ;; Corrects (and improves) org-mode's native fontification. - (doom-themes-org-config)) - -(use-package tldr) - -(add-to-list 'default-frame-alist '(alpha-background . 100)) ; For all new frames henceforth - -(use-package which-key - :init - (which-key-mode 1) - :diminish - :config - (setq which-key-side-window-location 'bottom - which-key-sort-order #'which-key-key-order-alpha - which-key-allow-imprecise-window-fit nil - which-key-sort-uppercase-first nil - which-key-add-column-padding 1 - which-key-max-display-columns nil - which-key-min-display-lines 6 - which-key-side-window-slot -10 - which-key-side-window-max-height 0.25 - which-key-idle-delay 0.8 - which-key-max-description-length 25 - which-key-allow-imprecise-window-fit nil - which-key-separator " → " )) - -(defun reader () - (interactive) - (let ((choices '(("First" . "Hi!") - ("Second" . 'second-choice) - ("Third" . 'third-choice)))) - (alist-get - (completing-read "Choose: " choices) - choices nil nil 'message))) - -(defun github-code-search () - "Search code on github for a given language." - (interactive) - (let ((language (completing-read - "Language: " - '("Emacs Lisp" "Python" "Clojure" "R"))) - (code (read-string "Code: "))) - (browse-url - (concat "https://github.com/search?l=" language - "&type=code&q=" code)))) - -(defun dm-search () - "Search various search engines." - (interactive) - (let ((engine (completing-read - "Search Engine: " - '("Arch Wiki" - "Bing" - "Google" - "Wikipedia"))) - (query (read-string "Query: "))) - (if (equal engine "Google") - (browse-url - (concat "https://www.google.com/search?q=" query))))) - -(defun dt/key-value-completing (choice) - (interactive - (list - (let ((completions '(("1" "One") - ("2" "Two") - ("3" "Three")))) - (cadr (assoc (completing-read "Choose: " completions) completions))))) - (message "You choose `%s'" choice)) diff --git a/.config/emacs/config.org b/.config/emacs/config.org deleted file mode 100644 index aafc1bd..0000000 --- a/.config/emacs/config.org +++ /dev/null @@ -1,1164 +0,0 @@ -#+TITLE: DT's GNU Emacs Config -#+AUTHOR: Derek Taylor (DT) -#+DESCRIPTION: DT's personal Emacs config. -#+STARTUP: showeverything -#+OPTIONS: toc:2 - -* TABLE OF CONTENTS :toc: -- [[#important-programs-to-load-first][IMPORTANT PROGRAMS TO LOAD FIRST]] - - [[#adding-the-scripts-directory-to-path][Adding the scripts directory to path]] - - [[#sourcing-the-scripts][Sourcing the scripts]] -- [[#all-the-icons][ALL THE ICONS]] -- [[#backup][BACKUP]] -- [[#company][COMPANY]] -- [[#dashboard][DASHBOARD]] -- [[#diminish][DIMINISH]] -- [[#dired][DIRED]] -- [[#drag-stuff][DRAG-STUFF]] -- [[#ediff][EDIFF]] -- [[#elfeed][ELFEED]] -- [[#ellama][ELLAMA]] -- [[#eradio][ERADIO]] -- [[#evil][EVIL]] -- [[#flycheck][FLYCHECK]] -- [[#fonts][FONTS]] - - [[#setting-the-font-face][Setting the Font Face]] - - [[#zooming-inout][Zooming In/Out]] - - [[#nerd-fonts-for-modeline][Nerd Fonts For Modeline]] -- [[#general-keybindings][GENERAL KEYBINDINGS]] -- [[#git-programs][GIT PROGRAMS]] - - [[#git-time-machine][Git Time Machine]] -- [[#highlight-todo][HIGHLIGHT TODO]] -- [[#ivy-counsel][IVY (COUNSEL)]] -- [[#language-support][LANGUAGE SUPPORT]] -- [[#minibuffer-escape][MINIBUFFER ESCAPE]] -- [[#modeline][MODELINE]] -- [[#neotree][NEOTREE]] -- [[#org-mode][ORG MODE]] - - [[#agenda][Agenda]] - - [[#bullets][Bullets]] - - [[#diminish-org-indent-mode][Diminish Org Indent Mode]] - - [[#org-level-headers][Org Level Headers]] - - [[#org-tempo][Org-Tempo]] - - [[#preserve-indentation-on-org-babel-tangle][Preserve Indentation On Org-Babel-Tangle]] - - [[#toc-org][Toc-Org]] - - [[#ox-hugo][Ox-Hugo]] -- [[#pdfs][PDFs]] -- [[#perspective][PERSPECTIVE]] -- [[#projectile][PROJECTILE]] -- [[#rainbow-delimiters][RAINBOW DELIMITERS]] -- [[#rainbow-mode][RAINBOW MODE]] -- [[#sane-defaults][SANE DEFAULTS]] -- [[#shells-and-terminals][SHELLS AND TERMINALS]] - - [[#eshell][Eshell]] - - [[#vterm][Vterm]] - - [[#vterm-toggle][Vterm-Toggle]] -- [[#sudo-edit][SUDO EDIT]] -- [[#theme][THEME]] -- [[#tldr][TLDR]] -- [[#transparency][TRANSPARENCY]] -- [[#which-key][WHICH-KEY]] -- [[#test][TEST]] - -* IMPORTANT PROGRAMS TO LOAD FIRST -To keep this =config.org= a reasonable length, I have moved a lot of code to individual scripts that will be sourced by this config. These scripts are found in "~/.config/emacs/scripts" and do not contain any code that most people are likely to need to edit. - -** Adding the scripts directory to path -#+begin_src emacs-lisp -(add-to-list 'load-path "~/.config/emacs/scripts/") -#+end_src - -** Sourcing the scripts -#+begin_src emacs-lisp -(require 'elpaca-setup) ;; The Elpaca Package Manager -(require 'app-launchers) ;; Use emacs as a run launcher like dmenu (experimental) -(require 'buffer-move) ;; Buffer-move for better window management -(require 'eshell-prompt) ;; A fancy prompt for eshell -#+end_src - -* ALL THE ICONS -This is an icon set that can be used with dashboard, dired, ibuffer and other Emacs programs. - -#+begin_src emacs-lisp -(use-package all-the-icons - :ensure t - :if (display-graphic-p)) - -(use-package all-the-icons-dired - :hook (dired-mode . (lambda () (all-the-icons-dired-mode t)))) -#+end_src - -* BACKUP -By default, Emacs creates automatic backups of files in their original directories, such "file.el" and the backup "file.el~". This leads to a lot of clutter, so let's tell Emacs to put all backups that it creates in the =TRASH= directory. - -#+begin_src emacs-lisp -(setq backup-directory-alist '((".*" . "~/.local/share/Trash/files"))) - -#+end_src - -* COMPANY -[[https://company-mode.github.io/][Company]] is a text completion framework for Emacs. The name stands for "complete anything". Completion will start automatically after you type a few letters. Use M-n and M-p to select, to complete or to complete the common part. - -#+begin_src emacs-lisp -(use-package company - :defer 2 - :diminish - :custom - (company-begin-commands '(self-insert-command)) - (company-idle-delay .1) - (company-minimum-prefix-length 2) - (company-show-numbers t) - (company-tooltip-align-annotations 't) - (global-company-mode t)) - -(use-package company-box - :after company - :diminish - :hook (company-mode . company-box-mode)) -#+end_src - -* DASHBOARD -Emacs Dashboard is an extensible startup screen showing you recent files, bookmarks, agenda items and an Emacs banner. - -#+begin_src emacs-lisp -(use-package dashboard - :ensure t - :init - (setq initial-buffer-choice 'dashboard-open) - (setq dashboard-set-heading-icons t) - (setq dashboard-set-file-icons t) - (setq dashboard-banner-logo-title "Emacs Is More Than A Text Editor!") - ;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner - (setq dashboard-startup-banner "~/.config/emacs/images/dtmacs-logo.png") ;; use custom image as banner - (setq dashboard-center-content nil) ;; set to 't' for centered content - (setq dashboard-items '((recents . 5) - (agenda . 5 ) - (bookmarks . 3) - (projects . 3))) - :custom - (dashboard-modify-heading-icons '((recents . "file-text") - (bookmarks . "book"))) - :config - (dashboard-setup-startup-hook)) - -#+end_src - -* DIMINISH -This package implements hiding or abbreviation of the modeline displays (lighters) of minor-modes. With this package installed, you can add ':diminish' to any use-package block to hide that particular mode in the modeline. - -#+begin_src emacs-lisp -(use-package diminish) - -#+end_src - -* DIRED -#+begin_src emacs-lisp -(use-package dired-open - :config - (setq dired-open-extensions '(("gif" . "sxiv") - ("jpg" . "sxiv") - ("png" . "sxiv") - ("mkv" . "mpv") - ("mp4" . "mpv")))) - -(use-package peep-dired - :after dired - :hook (evil-normalize-keymaps . peep-dired-hook) - :config - (evil-define-key 'normal dired-mode-map (kbd "h") 'dired-up-directory) - (evil-define-key 'normal dired-mode-map (kbd "l") 'dired-open-file) ; use dired-find-file instead if not using dired-open package - (evil-define-key 'normal peep-dired-mode-map (kbd "j") 'peep-dired-next-file) - (evil-define-key 'normal peep-dired-mode-map (kbd "k") 'peep-dired-prev-file) -) - -#+end_src - -* DRAG-STUFF -[[https://github.com/rejeep/drag-stuff.el][Drag Stuff]] is a minor mode for Emacs that makes it possible to drag stuff (words, region, lines) around in Emacs. When 'drag-stuff-define-keys' is enabled, then the following keybindings are set: M-up, M-down, M-left, and M-right. - -#+begin_src emacs-lisp -(use-package drag-stuff - :init - (drag-stuff-global-mode 1) - (drag-stuff-define-keys)) - -#+end_src - -* EDIFF -'ediff' is a diff program that is built into Emacs. By default, 'ediff' splits files vertically and places the 'help' frame in its own window. I have changed this so the two files are split horizontally and the 'help' frame appears as a lower split within the existing window. Also, I create my own 'dt-ediff-hook' where I add 'j/k' for moving to next/prev diffs. By default, this is set to 'n/p'. - -#+begin_src emacs-lisp -(setq ediff-split-window-function 'split-window-horizontally - ediff-window-setup-function 'ediff-setup-windows-plain) - -(defun dt-ediff-hook () - (ediff-setup-keymap) - (define-key ediff-mode-map "j" 'ediff-next-difference) - (define-key ediff-mode-map "k" 'ediff-previous-difference)) - -(add-hook 'ediff-mode-hook 'dt-ediff-hook) -#+end_src - -* ELFEED -An RSS newsfeed reader for Emacs. Move through the articles with 'j/k'. Move through the stories with 'CTRL j/k' when in other frame. - -#+begin_src emacs-lisp -(use-package elfeed - :config - (setq elfeed-search-feed-face ":foreground #ffffff :weight bold" - elfeed-feeds (quote - (("https://www.reddit.com/r/linux.rss" reddit linux) - ("https://www.reddit.com/r/commandline.rss" reddit commandline) - ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) - ("https://www.reddit.com/r/emacs.rss" reddit emacs) - ("https://www.gamingonlinux.com/article_rss.php" gaming linux) - ("https://hackaday.com/blog/feed/" hackaday linux) - ("https://opensource.com/feed" opensource linux) - ("https://linux.softpedia.com/backend.xml" softpedia linux) - ("https://itsfoss.com/feed/" itsfoss linux) - ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) - ("https://www.phoronix.com/rss.php" phoronix linux) - ("http://feeds.feedburner.com/d0od" omgubuntu linux) - ("https://www.computerworld.com/index.rss" computerworld linux) - ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) - ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) - ("https://betanews.com/feed" betanews linux) - ("http://lxer.com/module/newswire/headlines.rss" lxer linux) - ("https://distrowatch.com/news/dwd.xml" distrowatch linux))))) - - -(use-package elfeed-goodies - :init - (elfeed-goodies/setup) - :config - (setq elfeed-goodies/entry-pane-size 0.5)) - -#+end_src - -* ELLAMA -[[https://github.com/s-kostyaev/ellama][Ellama]] is a tool for interacting with large language models from Emacs. You need to have 'ollama' installed on your computer to use 'ellama' in Emacs. You need to pull in any LLMs that you want to have available for use. For example, if you want to be able to use Llama 3.1, then you need to run 'ollama pull llama3.1'. - -#+begin_src emacs-lisp -(use-package ellama - :init - (setopt ellama-keymap-prefix "C-c e") ;; keymap for all ellama functions - (setopt ellama-language "English") ;; language ellama should translate to - (require 'llm-ollama) - (setopt ellama-provider - (make-llm-ollama - ;; this model should be pulled to use it - ;; value should be the same as you print in terminal during pull - :chat-model "llama3.1" - :embedding-model "nomic-embed-text" - :default-chat-non-standard-params '(("num_ctx" . 8192)))) - ;; Predefined llm providers for interactive switching. - (setopt ellama-providers - '(("zephyr" . (make-llm-ollama - :chat-model "zephyr" - :embedding-model "zephyr")) - - ("llama3.1" . (make-llm-ollama - :chat-model "llama3.1" - :embedding-model "llama3.1")) - ("mixtral" . (make-llm-ollama - :chat-model "mixtral" - :embedding-model "mixtral")))) - (setopt ellama-naming-scheme 'ellama-generate-name-by-llm) - ;; Translation llm provider - (setopt ellama-translation-provider (make-llm-ollama - :chat-model "mixtral" - :embedding-model "nomic-embed-text")) - :config - (setq ellama-sessions-directory "~/.config/emacs/ellama-sessions/" - ellama-sessions-auto-save t)) - -#+end_src - -* ERADIO -[[https://github.com/olavfosse/eradio][eradio]] is a simple Internet radio player for Emacs. It uses 'vlc as its backend by default, but you can change the =eradio-player= variable to use another multimedia player. I have set eradio to use 'mpv' instead of 'vlc' because it supports more types of Internet radio streams. - -#+begin_src emacs-lisp -(use-package eradio - :init - (setq eradio-player '("mpv" "--no-video" "--no-terminal")) - :config - (setq eradio-channels '(("Totally 80s FM" . "https://zeno.fm/radio/totally-80s-fm/") - ("Oldies Radio 50s-60s" . "https://zeno.fm/radio/oldies-radio-50s-60s/") - ("Oldies Radio 70s" . "https://zeno.fm/radio/oldies-radio-70s/") - ("Unlimited 80s" . "https://zeno.fm/radio/unlimited80s/") - ("80s Hits" . "https://zeno.fm/radio/80shits/") - ("90s Hits" . "https://zeno.fm/radio/90s_HITS/") - ("2000s Pop" . "https://zeno.fm/radio/2000s-pop/") - ("The 2000s" . "https://zeno.fm/radio/the-2000s/") - ("Hits 2010s" . "https://zeno.fm/radio/helia-hits-2010/") - ("Classical Radio" . "https://zeno.fm/radio/classical-radio/") - ("Classical Relaxation" . "https://zeno.fm/radio/radio-christmas-non-stop-classical/") - ("Classic Rock" . "https://zeno.fm/radio/classic-rockdnb2sav8qs8uv/") - ("Gangsta49" . "https://zeno.fm/radio/gangsta49/") - ("HipHop49" . "https://zeno.fm/radio/hiphop49/") - ("Madhouse Country Radio" . "https://zeno.fm/radio/madhouse-country-radio/") - ("PopMusic" . "https://zeno.fm/radio/popmusic74vyurvmug0uv/") - ("PopStars" . "https://zeno.fm/radio/popstars/") - ("RadioMetal" . "https://zeno.fm/radio/radio-metal/") - ("RocknRoll Radio" . "https://zeno.fm/radio/rocknroll-radio994c7517qs8uv/")))) -#+end_src - -* EVIL -[[https://github.com/emacs-evil/evil][Evil]] is an extensible vi/vim layer for Emacs. Because...let's face it. The Vim keybindings are just plain better. - -#+begin_src emacs-lisp -;; Expands to: (elpaca evil (use-package evil :demand t)) -(use-package evil - :init ;; tweak evil's configuration before loading it - (setq evil-want-integration t ;; This is optional since it's already set to t by default. - evil-want-keybinding nil - evil-vsplit-window-right t - evil-split-window-below t - evil-undo-system 'undo-redo) ;; Adds vim-like C-r redo functionality - (evil-mode)) - -(use-package evil-collection - :after evil - :config - ;; Do not uncomment this unless you want to specify each and every mode - ;; that evil-collection should works with. The following line is here - ;; for documentation purposes in case you need it. - ;; (setq evil-collection-mode-list '(calendar dashboard dired ediff info magit ibuffer)) - (add-to-list 'evil-collection-mode-list 'help) ;; evilify help mode - (evil-collection-init)) - -(use-package evil-tutor) - -;; Using RETURN to follow links in Org/Evil -;; Unmap keys in 'evil-maps if not done, (setq org-return-follows-link t) will not work -(with-eval-after-load 'evil-maps - (define-key evil-motion-state-map (kbd "SPC") nil) - (define-key evil-motion-state-map (kbd "RET") nil) - (define-key evil-motion-state-map (kbd "TAB") nil)) -;; Setting RETURN key in org-mode to follow links - (setq org-return-follows-link t) - -#+end_src - -* FLYCHECK -Install =luacheck= from your Linux distro's repositories for flycheck to work correctly with lua files. Install =python-pylint= for flycheck to work with python files. Haskell works with flycheck as long as =haskell-ghc= or =haskell-stack-ghc= is installed. For more information on language support for flycheck, [[https://www.flycheck.org/en/latest/languages.html][read this]]. - -#+begin_src emacs-lisp -(use-package flycheck - :ensure t - :defer t - :diminish - :init (global-flycheck-mode)) - -#+end_src - -* FONTS -Defining the various fonts that Emacs will use. - -** Setting the Font Face -#+begin_src emacs-lisp -(set-face-attribute 'default nil - :font "JetBrains Mono" - :height 110 - :weight 'medium) -(set-face-attribute 'variable-pitch nil - :font "Ubuntu" - :height 120 - :weight 'medium) -(set-face-attribute 'fixed-pitch nil - :font "JetBrains Mono" - :height 110 - :weight 'medium) -;; Makes commented text and keywords italics. -;; This is working in emacsclient but not emacs. -;; Your font must have an italic face available. -(set-face-attribute 'font-lock-comment-face nil - :slant 'italic) -(set-face-attribute 'font-lock-keyword-face nil - :slant 'italic) - -;; This sets the default font on all graphical frames created after restarting Emacs. -;; Does the same thing as 'set-face-attribute default' above, but emacsclient fonts -;; are not right unless I also add this method of setting the default font. -(add-to-list 'default-frame-alist '(font . "JetBrains Mono-11")) - -;; Uncomment the following line if line spacing needs adjusting. -(setq-default line-spacing 0.12) -(set-face-background 'mouse "#ffffff") - -#+end_src - -** Zooming In/Out -You can use the bindings CTRL plus =/- for zooming in/out. You can also use CTRL plus the -mouse wheel for zooming in/out. - -#+begin_src emacs-lisp -(global-set-key (kbd "C-=") 'text-scale-increase) -(global-set-key (kbd "C--") 'text-scale-decrease) -(global-set-key (kbd "") 'text-scale-increase) -(global-set-key (kbd "") 'text-scale-decrease) -#+end_src - -** Nerd Fonts For Modeline -#+begin_src emacs-lisp -(use-package nerd-icons - ;; :custom - ;; The Nerd Font you want to use in GUI - ;; "Symbols Nerd Font Mono" is the default and is recommended - ;; but you can use any other Nerd Font if you want - ;; (nerd-icons-font-family "Symbols Nerd Font Mono") - ) -#+end_src - -* GENERAL KEYBINDINGS -#+begin_src emacs-lisp -(use-package general - :config - (general-evil-setup) - - ;; set up 'SPC' as the global leader key - (general-create-definer dt/leader-keys - :states '(normal insert visual emacs) - :keymaps 'override - :prefix "SPC" ;; set leader - :global-prefix "M-SPC") ;; access leader in insert mode - - (dt/leader-keys - "SPC" '(counsel-M-x :wk "Counsel M-x") - "." '(find-file :wk "Find file") - "=" '(perspective-map :wk "Perspective") ;; Lists all the perspective keybindings - "TAB TAB" '(comment-line :wk "Comment lines") - "u" '(universal-argument :wk "Universal argument")) - - (dt/leader-keys - "a" '(:ignore t :wk "A.I.") - "a a" '(ellama-ask-about :wk "Ask ellama about region") - "a e" '(:ignore t :wk "Ellama enhance") - "a e g" '(ellama-improve-grammar :wk "Ellama enhance wording") - "a e w" '(ellama-improve-wording :wk "Ellama enhance grammar") - "a i" '(ellama-chat :wk "Ask ellama") - "a p" '(ellama-provider-select :wk "Ellama provider select") - "a s" '(ellama-summarize :wk "Ellama summarize region") - "a t" '(ellama-translate :wk "Ellama translate region")) - - (dt/leader-keys - "b" '(:ignore t :wk "Bookmarks/Buffers") - "b b" '(switch-to-buffer :wk "Switch to buffer") - "b c" '(clone-indirect-buffer :wk "Create indirect buffer copy in a split") - "b C" '(clone-indirect-buffer-other-window :wk "Clone indirect buffer in new window") - "b d" '(bookmark-delete :wk "Delete bookmark") - "b i" '(ibuffer :wk "Ibuffer") - "b k" '(kill-current-buffer :wk "Kill current buffer") - "b K" '(kill-some-buffers :wk "Kill multiple buffers") - "b l" '(list-bookmarks :wk "List bookmarks") - "b m" '(bookmark-set :wk "Set bookmark") - "b n" '(next-buffer :wk "Next buffer") - "b p" '(previous-buffer :wk "Previous buffer") - "b r" '(revert-buffer :wk "Reload buffer") - "b R" '(rename-buffer :wk "Rename buffer") - "b s" '(basic-save-buffer :wk "Save buffer") - "b S" '(save-some-buffers :wk "Save multiple buffers") - "b w" '(bookmark-save :wk "Save current bookmarks to bookmark file")) - - (dt/leader-keys - "d" '(:ignore t :wk "Dired") - "d d" '(dired :wk "Open dired") - "d f" '(wdired-finish-edit :wk "Writable dired finish edit") - "d j" '(dired-jump :wk "Dired jump to current") - "d n" '(neotree-dir :wk "Open directory in neotree") - "d p" '(peep-dired :wk "Peep-dired") - "d w" '(wdired-change-to-wdired-mode :wk "Writable dired")) - - (dt/leader-keys - "e" '(:ignore t :wk "Ediff/Eshell/Eval/EWW") - "e b" '(eval-buffer :wk "Evaluate elisp in buffer") - "e d" '(eval-defun :wk "Evaluate defun containing or after point") - "e e" '(eval-expression :wk "Evaluate and elisp expression") - "e f" '(ediff-files :wk "Run ediff on a pair of files") - "e F" '(ediff-files3 :wk "Run ediff on three files") - "e h" '(counsel-esh-history :which-key "Eshell history") - "e l" '(eval-last-sexp :wk "Evaluate elisp expression before point") - "e n" '(eshell-new :wk "Create new eshell buffer") - "e r" '(eval-region :wk "Evaluate elisp in region") - "e R" '(eww-reload :which-key "Reload current page in EWW") - "e s" '(eshell :which-key "Eshell") - "e w" '(eww :which-key "EWW emacs web wowser")) - - (dt/leader-keys - "f" '(:ignore t :wk "Files") - "f c" '((lambda () (interactive) - (find-file "~/.config/emacs/config.org")) - :wk "Open emacs config.org") - "f e" '((lambda () (interactive) - (dired "~/.config/emacs/")) - :wk "Open user-emacs-directory in dired") - "f d" '(find-grep-dired :wk "Search for string in files in DIR") - "f g" '(counsel-grep-or-swiper :wk "Search for string current file") - "f i" '((lambda () (interactive) - (find-file "~/.config/emacs/init.el")) - :wk "Open emacs init.el") - "f j" '(counsel-file-jump :wk "Jump to a file below current directory") - "f l" '(counsel-locate :wk "Locate a file") - "f r" '(counsel-recentf :wk "Find recent files") - "f u" '(sudo-edit-find-file :wk "Sudo find file") - "f U" '(sudo-edit :wk "Sudo edit file")) - - (dt/leader-keys - "g" '(:ignore t :wk "Git") - "g /" '(magit-displatch :wk "Magit dispatch") - "g ." '(magit-file-displatch :wk "Magit file dispatch") - "g b" '(magit-branch-checkout :wk "Switch branch") - "g c" '(:ignore t :wk "Create") - "g c b" '(magit-branch-and-checkout :wk "Create branch and checkout") - "g c c" '(magit-commit-create :wk "Create commit") - "g c f" '(magit-commit-fixup :wk "Create fixup commit") - "g C" '(magit-clone :wk "Clone repo") - "g f" '(:ignore t :wk "Find") - "g f c" '(magit-show-commit :wk "Show commit") - "g f f" '(magit-find-file :wk "Magit find file") - "g f g" '(magit-find-git-config-file :wk "Find gitconfig file") - "g F" '(magit-fetch :wk "Git fetch") - "g g" '(magit-status :wk "Magit status") - "g i" '(magit-init :wk "Initialize git repo") - "g l" '(magit-log-buffer-file :wk "Magit buffer log") - "g r" '(vc-revert :wk "Git revert file") - "g s" '(magit-stage-file :wk "Git stage file") - "g t" '(git-timemachine :wk "Git time machine") - "g u" '(magit-stage-file :wk "Git unstage file")) - - (dt/leader-keys - "h" '(:ignore t :wk "Help") - "h a" '(counsel-apropos :wk "Apropos") - "h b" '(describe-bindings :wk "Describe bindings") - "h c" '(describe-char :wk "Describe character under cursor") - "h d" '(:ignore t :wk "Emacs documentation") - "h d a" '(about-emacs :wk "About Emacs") - "h d d" '(view-emacs-debugging :wk "View Emacs debugging") - "h d f" '(view-emacs-FAQ :wk "View Emacs FAQ") - "h d m" '(info-emacs-manual :wk "The Emacs manual") - "h d n" '(view-emacs-news :wk "View Emacs news") - "h d o" '(describe-distribution :wk "How to obtain Emacs") - "h d p" '(view-emacs-problems :wk "View Emacs problems") - "h d t" '(view-emacs-todo :wk "View Emacs todo") - "h d w" '(describe-no-warranty :wk "Describe no warranty") - "h e" '(view-echo-area-messages :wk "View echo area messages") - "h f" '(describe-function :wk "Describe function") - "h F" '(describe-face :wk "Describe face") - "h g" '(describe-gnu-project :wk "Describe GNU Project") - "h i" '(info :wk "Info") - "h I" '(describe-input-method :wk "Describe input method") - "h k" '(describe-key :wk "Describe key") - "h l" '(view-lossage :wk "Display recent keystrokes and the commands run") - "h L" '(describe-language-environment :wk "Describe language environment") - "h m" '(describe-mode :wk "Describe mode") - "h r" '(:ignore t :wk "Reload") - "h r r" '((lambda () (interactive) - (load-file "~/.config/emacs/init.el") - (ignore (elpaca-process-queues))) - :wk "Reload emacs config") - "h t" '(load-theme :wk "Load theme") - "h v" '(describe-variable :wk "Describe variable") - "h w" '(where-is :wk "Prints keybinding for command if set") - "h x" '(describe-command :wk "Display full documentation for command")) - - (dt/leader-keys - "m" '(:ignore t :wk "Org") - "m a" '(org-agenda :wk "Org agenda") - "m e" '(org-export-dispatch :wk "Org export dispatch") - "m i" '(org-toggle-item :wk "Org toggle item") - "m t" '(org-todo :wk "Org todo") - "m B" '(org-babel-tangle :wk "Org babel tangle") - "m T" '(org-todo-list :wk "Org todo list")) - - (dt/leader-keys - "m b" '(:ignore t :wk "Tables") - "m b -" '(org-table-insert-hline :wk "Insert hline in table")) - - (dt/leader-keys - "m d" '(:ignore t :wk "Date/deadline") - "m d t" '(org-time-stamp :wk "Org time stamp")) - - (dt/leader-keys - "o" '(:ignore t :wk "Open") - "o d" '(dashboard-open :wk "Dashboard") - "o e" '(elfeed :wk "Elfeed RSS") - "o f" '(make-frame :wk "Open buffer in new frame") - "o F" '(select-frame-by-name :wk "Select frame by name")) - - ;; projectile-command-map already has a ton of bindings - ;; set for us, so no need to specify each individually. - (dt/leader-keys - "p" '(projectile-command-map :wk "Projectile")) - - (dt/leader-keys - "r" '(:ignore t :wk "Radio") - "r p" '(eradio-play :wk "Eradio play") - "r s" '(eradio-stop :wk "Eradio stop") - "r t" '(eradio-toggle :wk "Eradio toggle")) - - - (dt/leader-keys - "s" '(:ignore t :wk "Search") - "s d" '(dictionary-search :wk "Search dictionary") - "s m" '(man :wk "Man pages") - "s o" '(pdf-occur :wk "Pdf search lines matching STRING") - "s t" '(tldr :wk "Lookup TLDR docs for a command") - "s w" '(woman :wk "Similar to man but doesn't require man")) - - (dt/leader-keys - "t" '(:ignore t :wk "Toggle") - "t e" '(eshell-toggle :wk "Toggle eshell") - "t f" '(flycheck-mode :wk "Toggle flycheck") - "t l" '(display-line-numbers-mode :wk "Toggle line numbers") - "t n" '(neotree-toggle :wk "Toggle neotree file viewer") - "t o" '(org-mode :wk "Toggle org mode") - "t r" '(rainbow-mode :wk "Toggle rainbow mode") - "t t" '(visual-line-mode :wk "Toggle truncated lines") - "t v" '(vterm-toggle :wk "Toggle vterm")) - - (dt/leader-keys - "w" '(:ignore t :wk "Windows/Words") - ;; Window splits - "w c" '(evil-window-delete :wk "Close window") - "w n" '(evil-window-new :wk "New window") - "w s" '(evil-window-split :wk "Horizontal split window") - "w v" '(evil-window-vsplit :wk "Vertical split window") - ;; Window motions - "w h" '(evil-window-left :wk "Window left") - "w j" '(evil-window-down :wk "Window down") - "w k" '(evil-window-up :wk "Window up") - "w l" '(evil-window-right :wk "Window right") - "w w" '(evil-window-next :wk "Goto next window") - ;; Move Windows - "w H" '(buf-move-left :wk "Buffer move left") - "w J" '(buf-move-down :wk "Buffer move down") - "w K" '(buf-move-up :wk "Buffer move up") - "w L" '(buf-move-right :wk "Buffer move right") - ;; Words - "w d" '(downcase-word :wk "Downcase word") - "w u" '(upcase-word :wk "Upcase word") - "w =" '(count-words :wk "Count words/lines for buffer")) -) - -#+end_src - -* GIT PROGRAMS -** Git Time Machine -[[https://github.com/emacsmirror/git-timemachine][git-timemachine]] is a program that allows you to move backwards and forwards through a file's commits. 'SPC g t' will open the time machine on a file if it is in a git repo. Then, while in normal mode, you can use 'CTRL-j' and 'CTRL-k' to move backwards and forwards through the commits. - - -#+begin_src emacs-lisp -(use-package git-timemachine - :after git-timemachine - :hook (evil-normalize-keymaps . git-timemachine-hook) - :config - (evil-define-key 'normal git-timemachine-mode-map (kbd "C-j") 'git-timemachine-show-previous-revision) - (evil-define-key 'normal git-timemachine-mode-map (kbd "C-k") 'git-timemachine-show-next-revision) -) -#+end_src - -* HIGHLIGHT TODO -Adding highlights to TODO and related words. - -#+begin_src emacs-lisp -(use-package hl-todo - :hook ((org-mode . hl-todo-mode) - (prog-mode . hl-todo-mode)) - :config - (setq hl-todo-highlight-punctuation ":" - hl-todo-keyword-faces - `(("TODO" warning bold) - ("FIXME" error bold) - ("HACK" font-lock-constant-face bold) - ("REVIEW" font-lock-keyword-face bold) - ("NOTE" success bold) - ("DEPRECATED" font-lock-doc-face bold)))) - -#+end_src - -* IVY (COUNSEL) -+ Ivy, a generic completion mechanism for Emacs. -+ Counsel, a collection of Ivy-enhanced versions of common Emacs commands. -+ Ivy-rich allows us to add descriptions alongside the commands in M-x. - -#+begin_src emacs-lisp -(use-package counsel - :after ivy - :diminish - :config - (counsel-mode) - (setq ivy-initial-inputs-alist nil)) ;; removes starting ^ regex in M-x - -(use-package ivy - :bind - ;; ivy-resume resumes the last Ivy-based completion. - (("C-c C-r" . ivy-resume) - ("C-x B" . ivy-switch-buffer-other-window)) - :diminish - :custom - (setq ivy-use-virtual-buffers t) - (setq ivy-count-format "(%d/%d) ") - (setq enable-recursive-minibuffers t) - :config - (ivy-mode)) - -(use-package all-the-icons-ivy-rich - :ensure t - :init (all-the-icons-ivy-rich-mode 1)) - -(use-package ivy-rich - :after ivy - :ensure t - :init (ivy-rich-mode 1) ;; this gets us descriptions in M-x. - :custom - (ivy-virtual-abbreviate 'full - ivy-rich-switch-buffer-align-virtual-buffer t - ivy-rich-path-style 'abbrev) - :config - (ivy-set-display-transformer 'ivy-switch-buffer - 'ivy-rich-switch-buffer-transformer)) - -#+end_src - -* LANGUAGE SUPPORT -Emacs has built-in programming language modes for Lisp, Scheme, DSSSL, Ada, ASM, AWK, C, C++, Fortran, Icon, IDL (CORBA), IDLWAVE, Java, Javascript, M4, Makefiles, Metafont, Modula2, Object Pascal, Objective-C, Octave, Pascal, Perl, Pike, PostScript, Prolog, Python, Ruby, Simula, SQL, Tcl, Verilog, and VHDL. Other languages will require you to install additional modes. - -#+begin_src emacs-lisp -(use-package dart-mode) -(use-package haskell-mode) -(use-package lua-mode) -(use-package php-mode) - -#+end_src - -* MINIBUFFER ESCAPE -By default, Emacs requires you to hit ESC three times to escape quit the minibuffer. - -#+begin_src emacs-lisp -(global-set-key [escape] 'keyboard-escape-quit) -#+end_src - -* MODELINE -The modeline is the bottom status bar that appears in Emacs windows. While you can create your own custom modeline, why go to the trouble when Doom Emacs already has a nice modeline package available. For more information on what is available to configure in the Doom modeline, check out: [[https://github.com/seagle0128/doom-modeline][Doom Modeline]] - -#+begin_src emacs-lisp -(use-package doom-modeline - :ensure t - :init (doom-modeline-mode 1) - :config - (setq doom-modeline-height 35 ;; sets modeline height - doom-modeline-bar-width 5 ;; sets right bar width - doom-modeline-persp-name t ;; adds perspective name to modeline - doom-modeline-persp-icon t)) ;; adds folder icon next to persp name - -#+end_src - -* NEOTREE -Neotree is a file tree viewer. When you open neotree, it jumps to the current file thanks to neo-smart-open. The neo-window-fixed-size setting makes the neotree width be adjustable. NeoTree provides following themes: classic, ascii, arrow, icons, and nerd. Theme can be config'd by setting "two" themes for neo-theme: one for the GUI and one for the terminal. I like to use 'SPC t' for 'toggle' keybindings, so I have used 'SPC t n' for toggle-neotree. - -| COMMAND | DESCRIPTION | KEYBINDING | -|----------------+---------------------------+------------| -| neotree-toggle | /Toggle neotree/ | SPC t n | -| neotree- dir | /Open directory in neotree/ | SPC d n | - -#+BEGIN_SRC emacs-lisp -(use-package neotree - :config - (setq neo-smart-open t - neo-show-hidden-files t - neo-window-width 55 - neo-window-fixed-size nil - inhibit-compacting-font-caches t - projectile-switch-project-action 'neotree-projectile-action) - ;; truncate long file names in neotree - (add-hook 'neo-after-create-hook - #'(lambda (_) - (with-current-buffer (get-buffer neo-buffer-name) - (setq truncate-lines t) - (setq word-wrap nil) - (make-local-variable 'auto-hscroll-mode) - (setq auto-hscroll-mode nil))))) - -#+end_src - -* ORG MODE -** Agenda -#+begin_src emacs-lisp -(setq org-agenda-files '("~/.config/emacs/agenda.org")) -#+end_src - -** Bullets -=Org-bullets= gives us attractive bullets rather than asterisks. - -#+begin_src emacs-lisp -(add-hook 'org-mode-hook 'org-indent-mode) -(use-package org-bullets) -(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) -#+end_src - -** Diminish Org Indent Mode -Removes "Ind" from showing in the modeline. - -#+begin_src emacs-lisp -(eval-after-load 'org-indent '(diminish 'org-indent-mode)) -#+end_src - -** Org Level Headers -#+begin_src emacs-lisp - (custom-set-faces - '(org-level-1 ((t (:inherit outline-1 :height 1.7)))) - '(org-level-2 ((t (:inherit outline-2 :height 1.6)))) - '(org-level-3 ((t (:inherit outline-3 :height 1.5)))) - '(org-level-4 ((t (:inherit outline-4 :height 1.4)))) - '(org-level-5 ((t (:inherit outline-5 :height 1.3)))) - '(org-level-6 ((t (:inherit outline-5 :height 1.2)))) - '(org-level-7 ((t (:inherit outline-5 :height 1.1))))) -#+end_src - -** Org-Tempo -Org-tempo is not a separate package but a module within org that can be enabled. Org-tempo allows for ' from auto-pairing when electric-pair-mode is on. -;; Otherwise, org-tempo is broken when you try to ") #'pcomplete-list))) - -;; A function for easily creating multiple buffers of 'eshell'. -;; NOTE: `C-u M-x eshell` would also create new 'eshell' buffers. -(defun eshell-new (name) - "Create new eshell buffer named NAME." - (interactive "sName: ") - (setq name (concat "$" name)) - (eshell) - (rename-buffer name)) - -(use-package eshell-toggle - :custom - (eshell-toggle-size-fraction 3) - (eshell-toggle-use-projectile-root t) - (eshell-toggle-run-command nil) - (eshell-toggle-init-function #'eshell-toggle-init-ansi-term)) - - (use-package eshell-syntax-highlighting - :after esh-mode - :config - (eshell-syntax-highlighting-global-mode +1)) - - ;; eshell-syntax-highlighting -- adds fish/zsh-like syntax highlighting. - ;; eshell-rc-script -- your profile for eshell; like a bashrc for eshell. - ;; eshell-aliases-file -- sets an aliases file for the eshell. - - (setq eshell-rc-script (concat user-emacs-directory "eshell/profile") - eshell-aliases-file (concat user-emacs-directory "eshell/aliases") - eshell-history-size 5000 - eshell-buffer-maximum-lines 5000 - eshell-hist-ignoredups t - eshell-scroll-to-bottom-on-input t - eshell-destroy-buffer-when-process-dies t - eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh")) -#+end_src - -** Vterm -Vterm is a terminal emulator within Emacs. The 'shell-file-name' setting sets the shell to be used in M-x shell, M-x term, M-x ansi-term and M-x vterm. By default, the shell is set to 'fish' but could change it to 'bash' or 'zsh' if you prefer. - -#+begin_src emacs-lisp -(use-package vterm - :ensure t - :config - (setq shell-file-name "/bin/sh" - vterm-max-scrollback 5000)) -#+end_src - -** Vterm-Toggle -[[https://github.com/jixiuf/vterm-toggle][vterm-toggle]] toggles between the vterm buffer and whatever buffer you are editing. - -#+begin_src emacs-lisp -(use-package vterm-toggle - :ensure t - :after vterm - :config - ;; When running programs in Vterm and in 'normal' mode, make sure that ESC - ;; kills the program as it would in most standard terminal programs. - (evil-define-key 'normal vterm-mode-map (kbd "") 'vterm--self-insert) - (setq vterm-toggle-fullscreen-p nil) - (setq vterm-toggle-scope 'project) - (add-to-list 'display-buffer-alist - '((lambda (buffer-or-name _) - (let ((buffer (get-buffer buffer-or-name))) - (with-current-buffer buffer - (or (equal major-mode 'vterm-mode) - (string-prefix-p vterm-buffer-name (buffer-name buffer)))))) - (display-buffer-reuse-window display-buffer-at-bottom) - ;;(display-buffer-reuse-window display-buffer-in-direction) - ;;display-buffer-in-direction/direction/dedicated is added in emacs27 - ;;(direction . bottom) - ;;(dedicated . t) ;dedicated is supported in emacs27 - (reusable-frames . visible) - (window-height . 0.4)))) - -#+end_src - -* SUDO EDIT -[[https://github.com/nflath/sudo-edit][sudo-edit]] gives us the ability to open files with sudo privileges or switch over to editing with sudo privileges if we initially opened the file without such privileges. - -#+begin_src emacs-lisp -(use-package sudo-edit) -#+end_src - -* THEME -The first line below designates the directory where will place all of our custom-made themes, which I have created only one (dtmacs). You can create your own Emacs themes with the help of the [[https://emacsfodder.github.io/emacs-theme-editor/][Emacs Theme Editor]]. I am also installing =doom-themes= because it contains a huge collection of themes. M-x load-theme will list all of the themes available. - -#+begin_src emacs-lisp -(add-to-list 'custom-theme-load-path "~/.config/emacs/themes/") - -(use-package doom-themes - :config - (setq doom-themes-enable-bold t ; if nil, bold is universally disabled - doom-themes-enable-italic t) ; if nil, italics is universally disabled - ;; Sets the default theme to load!!! - (load-theme 'doom-one t) - ;; Enable custom neotree theme (all-the-icons must be installed!) - (doom-themes-neotree-config) - ;; Corrects (and improves) org-mode's native fontification. - (doom-themes-org-config)) -#+end_src - -* TLDR - -#+begin_src emacs-lisp -(use-package tldr) - -#+end_src - -* TRANSPARENCY -With Emacs version 29, true transparency has been added. I have turned transparency off by setting the alpha to '100'. If you want some slight transparency, try setting alpha to '90'. Of course, if you set alpha to '0', the background of Emacs would completely transparent. - -#+begin_src emacs-lisp -(add-to-list 'default-frame-alist '(alpha-background . 100)) ; For all new frames henceforth - -#+end_src - -* WHICH-KEY -#+begin_src emacs-lisp -(use-package which-key - :init - (which-key-mode 1) - :diminish - :config - (setq which-key-side-window-location 'bottom - which-key-sort-order #'which-key-key-order-alpha - which-key-allow-imprecise-window-fit nil - which-key-sort-uppercase-first nil - which-key-add-column-padding 1 - which-key-max-display-columns nil - which-key-min-display-lines 6 - which-key-side-window-slot -10 - which-key-side-window-max-height 0.25 - which-key-idle-delay 0.8 - which-key-max-description-length 25 - which-key-allow-imprecise-window-fit nil - which-key-separator " → " )) -#+end_src - -* TEST -#+begin_src emacs-lisp -(defun reader () - (interactive) - (let ((choices '(("First" . "Hi!") - ("Second" . 'second-choice) - ("Third" . 'third-choice)))) - (alist-get - (completing-read "Choose: " choices) - choices nil nil 'message))) - -(defun github-code-search () - "Search code on github for a given language." - (interactive) - (let ((language (completing-read - "Language: " - '("Emacs Lisp" "Python" "Clojure" "R"))) - (code (read-string "Code: "))) - (browse-url - (concat "https://github.com/search?l=" language - "&type=code&q=" code)))) - -(defun dm-search () - "Search various search engines." - (interactive) - (let ((engine (completing-read - "Search Engine: " - '("Arch Wiki" - "Bing" - "Google" - "Wikipedia"))) - (query (read-string "Query: "))) - (if (equal engine "Google") - (browse-url - (concat "https://www.google.com/search?q=" query))))) - -(defun dt/key-value-completing (choice) - (interactive - (list - (let ((completions '(("1" "One") - ("2" "Two") - ("3" "Three")))) - (cadr (assoc (completing-read "Choose: " completions) completions))))) - (message "You choose `%s'" choice)) - -#+end_src diff --git a/.config/emacs/early-init.el b/.config/emacs/early-init.el index 512068a..4859fe2 100644 --- a/.config/emacs/early-init.el +++ b/.config/emacs/early-init.el @@ -1 +1,150 @@ -(setq package-enable-at-startup nil) +;;; early-init.el --- Doom's universal bootstrapper -*- lexical-binding: t -*- +;;; Commentary: +;; +;; This file, in summary: +;; - Determines where `user-emacs-directory' is by: +;; - Processing `--init-directory DIR' (backported from Emacs 29), +;; - Processing `--profile NAME' (see +;; `https://docs.doomemacs.org/-/developers' or docs/developers.org), +;; - Or assume that it's the directory this file lives in. +;; - Loads Doom as efficiently as possible, with only the essential startup +;; optimizations, and prepares it for interactive or non-interactive sessions. +;; - If Doom isn't present, then we assume that Doom is being used as a +;; bootloader and the user wants to load a non-Doom config, so we undo all our +;; global side-effects, load `user-emacs-directory'/early-init.el, and carry +;; on as normal (without Doom). +;; - Do all this without breaking compatibility with Chemacs. +;; +;; early-init.el was introduced in Emacs 27.1. It is loaded before init.el, +;; before Emacs initializes its UI or package.el, and before site files are +;; loaded. This is great place for startup optimizing, because only here can you +;; *prevent* things from loading, rather than turn them off after-the-fact. +;; +;; Doom uses this file as its "universal bootstrapper" for both interactive and +;; non-interactive sessions. That means: no matter what environment you want +;; Doom in, load this file first. +;; +;;; Code: + +(let (file-name-handler-alist) + ;; PERF: Garbage collection is a big contributor to startup times in both + ;; interactive and CLI sessions, so I defer it. + (if noninteractive ; in CLI sessions + ;; PERF: GC deferral is less important in the CLI, but still helps script + ;; startup times. Just don't set it too high to avoid runaway memory + ;; usage in long-running elisp shell scripts. + (setq gc-cons-threshold 134217728 ; 128mb + ;; Backported from 29 (see emacs-mirror/emacs@73a384a98698) + gc-cons-percentage 1.0) + ;; PERF: Doom relies on `gcmh-mode' to reset this while the user is idle, so + ;; I effectively disable GC during startup. DON'T COPY THIS BLINDLY! If + ;; it's not reset later there will be stuttering, freezes, and crashes. + (setq gc-cons-threshold most-positive-fixnum)) + + ;; PERF: Don't use precious startup time to check mtimes on elisp bytecode. + ;; Ensuring correctness is 'doom sync's job. Although stale byte-code will + ;; heavily impact startup times, performance is unimportant when Emacs is in + ;; an error state. + (setq load-prefer-newer noninteractive) + + ;; UX: Respect DEBUG envvar as an alternative to --debug-init, and to make + ;; startup more verbose sooner. + (let ((debug (getenv-internal "DEBUG"))) + (when (stringp debug) + (if (string-empty-p debug) + (setenv "DEBUG" nil) + (setq init-file-debug t + debug-on-error t)))) + + (let (;; FIX: Unset `command-line-args' in noninteractive sessions, to + ;; ensure upstream switches aren't misinterpreted. + (command-line-args (unless noninteractive command-line-args)) + ;; I avoid using `command-switch-alist' to process --profile (and + ;; --init-directory) because it is processed too late to change + ;; `user-emacs-directory' in time. + (profile (or (cadr (member "--profile" command-line-args)) + (getenv-internal "DOOMPROFILE")))) + (if (null profile) + ;; REVIEW: Backported from Emacs 29. Remove when 28 support is dropped. + (let ((init-dir (or (cadr (member "--init-directory" command-line-args)) + (getenv-internal "EMACSDIR")))) + (if (null init-dir) + ;; FIX: If we've been loaded directly (via 'emacs -batch -l + ;; early-init.el') or by a doomscript (like bin/doom), and Doom + ;; is in a non-standard location (and/or Chemacs is used), then + ;; `user-emacs-directory' will be wrong. + (when noninteractive + (setq user-emacs-directory + (file-name-directory (file-truename load-file-name)))) + ;; FIX: To prevent "invalid option" errors later. + (push (cons "--init-directory" (lambda (_) (pop argv))) command-switch-alist) + (setq user-emacs-directory (expand-file-name init-dir)))) + ;; FIX: Discard the switch to prevent "invalid option" errors later. + (push (cons "--profile" (lambda (_) (pop argv))) command-switch-alist) + ;; Running 'doom sync' or 'doom profile sync --all' (re)generates a light + ;; profile loader in $XDG_DATA_HOME/doom/profiles.X.el (or + ;; $DOOMPROFILELOADFILE), after reading `doom-profile-load-path'. This + ;; loader requires `$DOOMPROFILE' be set to function. + (setenv "DOOMPROFILE" profile) + (or (load (let ((windows? (memq system-type '(ms-dos windows-nt cygwin)))) + (expand-file-name + (format (or (getenv-internal "DOOMPROFILELOADFILE") + (file-name-concat (if windows? "doomemacs/data" "doom") + "profiles.%d")) + emacs-major-version) + (or (if windows? (getenv-internal "LOCALAPPDATA")) + (getenv-internal "XDG_DATA_HOME") + "~/.local/share"))) + 'noerror (not init-file-debug)) + (user-error "Profiles not initialized yet; run 'doom sync' first")))) + + ;; PERF: When `load'ing or `require'ing files, each permutation of + ;; `load-suffixes' and `load-file-rep-suffixes' (then `load-suffixes' + + ;; `load-file-rep-suffixes') is used to locate the file. Each permutation + ;; amounts to at least one file op, which is normally very fast, but can add + ;; up over the hundreds/thousands of files Emacs loads. + ;; + ;; To reduce that burden -- and since Doom doesn't load any dynamic modules + ;; this early -- I remove `.so' from `load-suffixes' and pass the + ;; `must-suffix' arg to `load'. See the docs of `load' for details. + (if (let ((load-suffixes '(".elc" ".el")) + (doom (expand-file-name "lisp/doom" user-emacs-directory))) + ;; I avoid `load's NOERROR argument because it suppresses other, + ;; legitimate errors (like permission or IO errors), which gets + ;; incorrectly interpreted as "this is not a Doom config". + (if (file-exists-p (concat doom ".el")) + ;; Load the heart of Doom Emacs. + (load doom nil (not init-file-debug) nil 'must-suffix) + ;; Failing that, assume we're loading a non-Doom config... + ;; HACK: `startup--load-user-init-file' resolves $EMACSDIR from a + ;; lexical (and so, not-trivially-modifiable) + ;; `startup-init-directory', so Emacs will fail to locate the + ;; correct $EMACSDIR/init.el without help. + (define-advice startup--load-user-init-file (:filter-args (args) reroute-to-profile) + (list (lambda () (expand-file-name "init.el" user-emacs-directory)) + nil (nth 2 args))) + ;; (Re)set `user-init-file' for the `load' call further below, and do + ;; so here while our `file-name-handler-alist' optimization is still + ;; effective (benefits `expand-file-name'). BTW: Emacs resets + ;; `user-init-file' and `early-init-file' after this file is loaded. + (setq user-init-file (expand-file-name "early-init" user-emacs-directory)) + ;; COMPAT: I make no assumptions about the config we're going to load, + ;; so undo this file's global side-effects. + (setq load-prefer-newer t) + ;; PERF: But make an exception for `gc-cons-threshold', which I think + ;; all Emacs users and configs will benefit from. Still, setting it + ;; to `most-positive-fixnum' is dangerous if downstream does not + ;; reset it later to something reasonable, so I use 16mb as a best + ;; fit guess. It's better than Emacs' 80kb default. + (setq gc-cons-threshold (* 16 1024 1024)) + nil)) + ;; Sets up Doom (particularly `doom-profile') for the session ahead. This + ;; loads the profile's init file, if it's available. In interactive + ;; session, a missing profile is an error state, in a non-interactive one, + ;; it's not (and left to the consumer to deal with). + (doom-initialize (not noninteractive)) + ;; If we're here, the user wants to load another config/profile (that may or + ;; may not be a Doom config). + (load user-init-file 'noerror (not init-file-debug) nil 'must-suffix))) + +;;; early-init.el ends here diff --git a/.config/emacs/eshell/aliases b/.config/emacs/eshell/aliases deleted file mode 100644 index 2dac14d..0000000 --- a/.config/emacs/eshell/aliases +++ /dev/null @@ -1,23 +0,0 @@ -# Aliases for emacs commands -alias ff find-file $1 - -# Aliasing standard shell commands to better emacs alternatives -alias less view-file $1 - -# Changing "ls" to "exa" -alias ls eza -al --color=always --group-directories-first $* # my preferred listing -alias la eza -a --color=always --group-directories-first $* # all files and dirs -alias ll eza -l --color=always --group-directories-first $* # long format -alias lt eza -aT --color=always --group-directories-first $* # tree listing -alias l. eza -a1 $* | grep "^\." # list hidden files - -# Merge Xresources -alias merge xrdb -merge ~/.Xresources - -# Confirm before overwriting something -alias cp cp -i $1 -alias mv mv -i $1 -alias rm rm -i $1 - -# Bare git repo alias for dotfiles -alias config /usr/bin/git --git-dir=$HOME/dotfiles --work-tree=$HOME $* diff --git a/.config/emacs/eshell/profile b/.config/emacs/eshell/profile deleted file mode 100644 index 3c871d6..0000000 --- a/.config/emacs/eshell/profile +++ /dev/null @@ -1 +0,0 @@ -colorscript random \ No newline at end of file diff --git a/.config/emacs/images/dtmacs-logo.png b/.config/emacs/images/dtmacs-logo.png deleted file mode 100644 index 388f793e94e479873b4d701e0b4764e4668f9ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17056 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 P00000NkvXXu0mjfJI177 diff --git a/.config/emacs/init.el b/.config/emacs/init.el deleted file mode 100644 index 2eda1c6..0000000 --- a/.config/emacs/init.el +++ /dev/null @@ -1,33 +0,0 @@ -(org-babel-load-file - (expand-file-name - "config.org" - user-emacs-directory)) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(custom-safe-themes - '("02f57ef0a20b7f61adce51445b68b2a7e832648ce2e7efb19d217b6454c1b644" - "6945dadc749ac5cbd47012cad836f92aea9ebec9f504d32fe89a956260773ca4" - "944d52450c57b7cbba08f9b3d08095eb7a5541b0ecfb3a0a9ecd4a18f3c28948" - "636b135e4b7c86ac41375da39ade929e2bd6439de8901f53f88fde7dd5ac3561" - "1f669e8abe4dc2855268c9a607b5e350e2811b3c5afd09af5939ff0c01a89c5a" - default)) - '(package-selected-packages '(magit taxy-magit-section)) - '(send-mail-function 'smtpmail-send-it) - '(smtpmail-smtp-server "smtp.1and1.com") - '(smtpmail-smtp-service 587)) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(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))))) -(put 'downcase-region 'disabled nil) diff --git a/.config/emacs/scripts/app-launchers.el b/.config/emacs/scripts/app-launchers.el deleted file mode 100644 index 7536a87..0000000 --- a/.config/emacs/scripts/app-launchers.el +++ /dev/null @@ -1,56 +0,0 @@ -;;; app-launchers.el --- Possible alternatives to dmenu/rofi - -;;; Code: - -;; Counsel-Linux-App -;; Since we have counsel installed, we can use 'counsel-linux-app' to launch our Linux apps. It list the apps by their executable command, so it's kind of tricky to use. - -(defun dt/emacs-counsel-launcher () - "Create and select a frame called emacs-counsel-launcher which consists only of a minibuffer and has specific dimensions. Runs counsel-linux-app on that frame, which is an emacs command that prompts you to select an app and open it in a dmenu like behaviour. Delete the frame after that command has exited" - (interactive) - (with-selected-frame - (make-frame '((name . "emacs-run-launcher") - (minibuffer . only) - (fullscreen . 0) ; no fullscreen - (undecorated . t) ; remove title bar - ;;(auto-raise . t) ; focus on this frame - ;;(tool-bar-lines . 0) - ;;(menu-bar-lines . 0) - (internal-border-width . 10) - (width . 80) - (height . 11))) - (unwind-protect - (counsel-linux-app) - (delete-frame)))) - - -;; App-Launcher -;; The 'app-launcher' is a better run launcher since it reads the desktop applications on your system and you can search them by their names as defined in their desktop file. This means that sometimes you have to search for a generic term rather than the actual binary command of the program. - -(use-package app-launcher - :ensure '(app-launcher :host github :repo "SebastienWae/app-launcher")) -;; create a global keyboard shortcut with the following code -;; emacsclient -cF "((visibility . nil))" -e "(emacs-run-launcher)" - -(defun dt/emacs-run-launcher () - "Create and select a frame called emacs-run-launcher which consists only of a minibuffer and has specific dimensions. Runs app-launcher-run-app on that frame, which is an emacs command that prompts you to select an app and open it in a dmenu like behaviour. Delete the frame after that command has exited" - (interactive) - (with-selected-frame - (make-frame '((name . "emacs-run-launcher") - (minibuffer . only) - (fullscreen . 0) ; no fullscreen - (undecorated . t) ; remove title bar - ;;(auto-raise . t) ; focus on this frame - ;;(tool-bar-lines . 0) - ;;(menu-bar-lines . 0) - (internal-border-width . 10) - (width . 80) - (height . 11))) - (unwind-protect - (app-launcher-run-app) - (delete-frame)))) - - -(provide 'app-launchers) -;;; app-launchers.el ends here - diff --git a/.config/emacs/scripts/buffer-move.el b/.config/emacs/scripts/buffer-move.el deleted file mode 100644 index 5dcde11..0000000 --- a/.config/emacs/scripts/buffer-move.el +++ /dev/null @@ -1,101 +0,0 @@ -;;; buffer-move.el --- Buffer move allows for better window controls. - -;; Copyright (C) 2004-2014 Lucas Bonnet - -;; Author: Lucas Bonnet -;; Keywords: lisp,convenience -;; Version: 0.5 -;; URL : https://github.com/lukhas/buffer-move - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 2 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -;; 02111-1307, USA. - -;;; Commentary: - -;; This file is for lazy people wanting to swap buffers without -;; typing C-x b on each window. - -;;; Code: -(require 'windmove) - -;;;###autoload -(defun buf-move-up () - "Swap the current buffer and the buffer above the split. -If there is no split, ie now window above the current one, an -error is signaled." -;; "Switches between the current buffer, and the buffer above the -;; split, if possible." - (interactive) - (let* ((other-win (windmove-find-other-window 'up)) - (buf-this-buf (window-buffer (selected-window)))) - (if (null other-win) - (error "No window above this one") - ;; swap top with this one - (set-window-buffer (selected-window) (window-buffer other-win)) - ;; move this one to top - (set-window-buffer other-win buf-this-buf) - (select-window other-win)))) - -;;;###autoload -(defun buf-move-down () -"Swap the current buffer and the buffer under the split. -If there is no split, ie now window under the current one, an -error is signaled." - (interactive) - (let* ((other-win (windmove-find-other-window 'down)) - (buf-this-buf (window-buffer (selected-window)))) - (if (or (null other-win) - (string-match "^ \\*Minibuf" (buffer-name (window-buffer other-win)))) - (error "No window under this one") - ;; swap top with this one - (set-window-buffer (selected-window) (window-buffer other-win)) - ;; move this one to top - (set-window-buffer other-win buf-this-buf) - (select-window other-win)))) - -;;;###autoload -(defun buf-move-left () -"Swap the current buffer and the buffer on the left of the split. -If there is no split, ie now window on the left of the current -one, an error is signaled." - (interactive) - (let* ((other-win (windmove-find-other-window 'left)) - (buf-this-buf (window-buffer (selected-window)))) - (if (null other-win) - (error "No left split") - ;; swap top with this one - (set-window-buffer (selected-window) (window-buffer other-win)) - ;; move this one to top - (set-window-buffer other-win buf-this-buf) - (select-window other-win)))) - -;;;###autoload -(defun buf-move-right () -"Swap the current buffer and the buffer on the right of the split. -If there is no split, ie now window on the right of the current -one, an error is signaled." - (interactive) - (let* ((other-win (windmove-find-other-window 'right)) - (buf-this-buf (window-buffer (selected-window)))) - (if (null other-win) - (error "No right split") - ;; swap top with this one - (set-window-buffer (selected-window) (window-buffer other-win)) - ;; move this one to top - (set-window-buffer other-win buf-this-buf) - (select-window other-win)))) - -(provide 'buffer-move) -;;; buffer-move.el ends here diff --git a/.config/emacs/scripts/elpaca-setup.el b/.config/emacs/scripts/elpaca-setup.el deleted file mode 100644 index 6c5e8af..0000000 --- a/.config/emacs/scripts/elpaca-setup.el +++ /dev/null @@ -1,73 +0,0 @@ - -;;; Code: - -(defvar elpaca-installer-version 0.11) -(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) -(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) -(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) -(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" - :ref nil - :files (:defaults (:exclude "extensions")) - :build (:not elpaca--activate-package))) -(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) - (build (expand-file-name "elpaca/" elpaca-builds-directory)) - (order (cdr elpaca-order)) - (default-directory repo)) - (add-to-list 'load-path (if (file-exists-p build) build repo)) - (unless (file-exists-p repo) - (make-directory repo t) - (when (< emacs-major-version 28) (require 'subr-x)) - (condition-case-unless-debug err - (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - ((zerop (call-process "git" nil buffer t "clone" - (plist-get order :repo) repo))) - ((zerop (call-process "git" nil buffer t "checkout" - (or (plist-get order :ref) "--")))) - (emacs (concat invocation-directory invocation-name)) - ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" - "--eval" "(byte-recompile-directory \".\" 0 'force)"))) - ((require 'elpaca)) - ((elpaca-generate-autoloads "elpaca" repo))) - (progn (message "%s" (buffer-string)) (kill-buffer buffer)) - (error "%s" (with-current-buffer buffer (buffer-string)))) -((error) (warn "%s" err) (delete-directory repo 'recursive)))) - (unless (require 'elpaca-autoloads nil t) - (require 'elpaca) - (elpaca-generate-autoloads "elpaca" repo) - (load "./elpaca-autoloads"))) -(add-hook 'after-init-hook #'elpaca-process-queues) -(elpaca `(,@elpaca-order)) - -;; Install use-package support -(elpaca elpaca-use-package - ;; Enable :elpaca use-package keyword. - (elpaca-use-package-mode) - ;; Assume :elpaca t unless otherwise specified. - (setq elpaca-use-package-by-default t)) - -;; Block until current queue processed. -(elpaca-wait) - -;;When installing a package which modifies a form used at the top-level -;;(e.g. a package which adds a use-package key word), -;;use `elpaca-wait' to block until that package has been installed/configured. -;;For example: -;;(use-package general :demand t) -;;(elpaca-wait) - -;;Turns off elpaca-use-package-mode current declartion -;;Note this will cause the declaration to be interpreted immediately (not deferred). -;;Useful for configuring built-in emacs features. -;;(use-package emacs :elpaca nil :config (setq ring-bell-function #'ignore)) - -;; Don't install anything. Defer execution of BODY -;;(elpaca nil (message "deferred")) -(elpaca (magit :branch "main" :pre-build ("make" "info"))) -(elpaca (forge :branch "main")) -(elpaca (ghub :branch "main")) -(elpaca (transient :branch "main")) -(elpaca (with-editor :branch "main")) - -(provide 'elpaca-setup) - -;;; elpaca-setup.el ends here diff --git a/.config/emacs/scripts/eshell-prompt.el b/.config/emacs/scripts/eshell-prompt.el deleted file mode 100644 index 7485ec4..0000000 --- a/.config/emacs/scripts/eshell-prompt.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; eshell-prompt.el --- a fancy shell prompt for eshell - -;;; Code: - -;; fancy-shell -;; A fancy shell prompt for eshell. - -(defun fancy-shell () - "A pretty shell with git status" - (let* ((cwd (abbreviate-file-name (eshell/pwd))) - (ref (magit-get-shortname "HEAD")) - (stat (magit-file-status)) - (x-stat eshell-last-command-status) - (git-chunk - (if ref - (format "%s%s%s " - (propertize (if stat "[" "(") 'font-lock-face (list :foreground (if stat "#e81050" "#9bee8b"))) - (propertize ref 'font-lock-face '(:foreground "#c897ff")) - (propertize (if stat "]" ")") 'font-lock-face (list :foreground (if stat "#e81050" "#9bee8b")))) - ""))) - (propertize - (format "\n%s %s %s$ " - (if (< 0 x-stat) (format (propertize "!%s" 'font-lock-face '(:foreground "#e81050")) x-stat) - (propertize "➤" 'font-lock-face (list :foreground (if (< 0 x-stat) "#e81050" "#9bee8b")))) - (propertize cwd 'font-lock-face '(:foreground "#45babf")) - git-chunk) - 'read-only t - 'front-sticky '(font-lock-face read-only) - 'rear-nonsticky '(font-lock-face read-only)))) - - -(provide 'eshell-prompt) -;;; eshell-prompt.el ends here diff --git a/.config/emacs/themes/dtmacs-theme.el b/.config/emacs/themes/dtmacs-theme.el deleted file mode 100644 index b03dc56..0000000 --- a/.config/emacs/themes/dtmacs-theme.el +++ /dev/null @@ -1,317 +0,0 @@ -;;; dtmacs-theme.el --- Theme - -;; Copyright (C) 2023 , - -;; Author: Derek Taylor (DT) -;; Version: 0.1 -;; Package-Requires: ((emacs "24.1")) -;; Created with ThemeCreator, https://github.com/mswift42/themecreator. - -;; This program is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;; This file is not part of Emacs. - -;;; Commentary: -;;; dtmacs-theme was created by Derek Taylor in 2023 - -;;; Code: - -(deftheme dtmacs) -(let ((class '((class color) (min-colors 89))) - (fg1 "#d3eaf4") - (fg2 "#cadae2") - (fg3 "#748895") - (fg4 "#4f545a") - (fg6 "#c4c4c4") - (bg1 "#192428") - (bg2 "#24343e") - (bg3 "#0c191d") - (bg4 "#0d6f9f") - (builtin "#41b2ea") - (keyword "#9bee8b") - (const "#96defa") - (comment "#7a95a0") - (func "#a094fb") - (str "#89e14b") - (type "#68cee8") - (var "#ff6ba9") - (bufid "#ffffff") - (selection "#e81050") - (warning "#e81050") - (warning2 "#e86310") - (todo "#c897ff") - (done "#d6ff97") - (unspec (when (>= emacs-major-version 29) 'unspecified))) - (custom-theme-set-faces - 'dtmacs - `(default ((,class (:background ,bg1 :foreground ,fg1)))) - `(dashboard-footer ((,class (:foreground ,var :italic t)))) - `(dashboard-heading ((,class (:foreground ,const :weight bold)))) - `(dashboard-text-banner ((,class (:foreground ,fg1 :weight bold)))) - `(dashboard-banner-logo-title ((,class (:foreground ,str :weight bold)))) - `(font-lock-builtin-face ((,class (:foreground ,builtin)))) - `(font-lock-comment-face ((,class (:italic t :foreground ,comment)))) - `(font-lock-negation-char-face ((,class (:foreground ,const)))) - `(font-lock-reference-face ((,class (:foreground ,const)))) - `(font-lock-constant-face ((,class (:foreground ,const)))) - `(font-lock-doc-face ((,class (:foreground ,comment)))) - `(font-lock-function-name-face ((,class (:foreground ,func )))) - `(font-lock-keyword-face ((,class (:bold ,class :foreground ,keyword)))) - `(font-lock-string-face ((,class (:foreground ,str)))) - `(font-lock-type-face ((,class (:foreground ,type )))) - `(font-lock-variable-name-face ((,class (:foreground ,var)))) - `(font-lock-warning-face ((,class (:foreground ,warning :background ,bg2)))) - `(term-color-black ((,class (:foreground ,fg2 :background ,unspec)))) - ;; `(region ((,class (:background ,fg1 :foreground ,bg1)))) - `(region ((,class (:background ,selection)))) - `(highlight ((,class (:foreground ,fg3 :background ,bg3)))) - `(hl-line ((,class (:background ,bg2)))) - `(fringe ((,class (:background ,bg1 :foreground ,fg4)))) - `(cursor ((,class (:background ,fg4)))) - `(isearch ((,class (:bold t :foreground ,warning :background ,bg3)))) - `(mode-line ((,class (:box (:line-width 4 :color ,bg2) :bold t :foreground ,fg3 :background ,bg2)))) - `(mode-line-inactive ((,class (:box (:line-width 4 :color ,bg3) :foreground ,fg3 :background ,bg3 :weight bold)))) - `(mode-line-buffer-id ((,class (:box nil :bold t :foreground ,bufid :background ,unspec)))) - `(mode-line-highlight ((,class (:box nil :foreground ,selection :weight bold)))) - `(mode-line-emphasis ((,class (:foreground ,fg1)))) - `(vertical-border ((,class (:foreground ,fg3)))) - `(minibuffer-prompt ((,class (:bold t :foreground ,builtin)))) - `(default-italic ((,class (:italic t)))) - `(link ((,class (:foreground ,const :underline t)))) - `(org-code ((,class (:foreground ,fg2)))) - `(org-hide ((,class (:foreground ,fg4)))) - `(org-level-1 ((,class (:bold t :foreground ,builtin :height 1.7)))) - `(org-level-2 ((,class (:bold t :foreground ,str :height 1.6)))) - `(org-level-3 ((,class (:bold t :foreground ,var :height 1.5)))) - `(org-level-4 ((,class (:bold t :foreground ,func :height 1.4)))) - `(org-level-5 ((,class (:bold t :foreground ,const :height 1.3)))) - `(org-level-6 ((,class (:bold t :foreground ,keyword :height 1.2)))) - `(org-level-7 ((,class (:bold t :foreground ,builtin :height 1.1)))) - `(org-level-8 ((,class (:bold t :foreground ,str :height 1.0)))) - `(org-date ((,class (:underline t :foreground ,var) ))) - `(org-footnote ((,class (:underline t :foreground ,fg4)))) - `(org-link ((,class (:underline t :foreground ,type )))) - `(org-special-keyword ((,class (:foreground ,func)))) - `(org-block ((,class (:foreground ,fg2)))) - `(org-quote ((,class (:inherit org-block :slant italic)))) - `(org-verse ((,class (:inherit org-block :slant italic)))) - `(org-todo ((,class (:foreground ,todo :bold t :italic t)))) - `(org-done ((,class (:foreground ,done :bold t :italic t)))) - `(org-warning ((,class (:underline t :foreground ,warning)))) - `(org-agenda-structure ((,class (:weight bold :foreground ,fg3 :box (:color ,fg4) :background ,bg3)))) - `(org-agenda-date ((,class (:foreground ,var :height 1.1 )))) - `(org-agenda-date-weekend ((,class (:weight normal :foreground ,fg4)))) - `(org-agenda-date-today ((,class (:weight bold :foreground ,keyword :height 1.4)))) - `(org-agenda-done ((,class (:foreground ,bg4)))) - `(org-scheduled ((,class (:foreground ,type)))) - `(org-scheduled-today ((,class (:foreground ,func :weight bold :height 1.2)))) - `(org-ellipsis ((,class (:foreground ,builtin)))) - `(org-verbatim ((,class (:foreground ,str)))) - `(org-document-info-keyword ((,class (:foreground ,func)))) - `(font-latex-bold-face ((,class (:foreground ,type)))) - `(font-latex-italic-face ((,class (:foreground ,var :italic t)))) - `(font-latex-string-face ((,class (:foreground ,str)))) - `(font-latex-match-reference-keywords ((,class (:foreground ,const)))) - `(font-latex-match-variable-keywords ((,class (:foreground ,var)))) - `(ido-only-match ((,class (:foreground ,warning)))) - `(org-sexp-date ((,class (:foreground ,fg4)))) - `(ido-first-match ((,class (:foreground ,keyword :bold t)))) - `(ivy-current-match ((,class (:foreground ,fg3 :inherit highlight :underline t)))) - `(gnus-header-content ((,class (:foreground ,keyword)))) - `(gnus-header-from ((,class (:foreground ,var)))) - `(gnus-header-name ((,class (:foreground ,type)))) - `(gnus-header-subject ((,class (:foreground ,func :bold t)))) - `(mu4e-view-url-number-face ((,class (:foreground ,type)))) - `(mu4e-cited-1-face ((,class (:foreground ,fg2)))) - `(mu4e-cited-7-face ((,class (:foreground ,fg3)))) - `(mu4e-header-marks-face ((,class (:foreground ,type)))) - `(ffap ((,class (:foreground ,fg4)))) - `(js2-private-function-call ((,class (:foreground ,const)))) - `(js2-jsdoc-html-tag-delimiter ((,class (:foreground ,str)))) - `(js2-jsdoc-html-tag-name ((,class (:foreground ,var)))) - `(js2-external-variable ((,class (:foreground ,type )))) - `(js2-function-param ((,class (:foreground ,const)))) - `(js2-jsdoc-value ((,class (:foreground ,str)))) - `(js2-private-member ((,class (:foreground ,fg3)))) - `(js3-warning-face ((,class (:underline ,keyword)))) - `(js3-error-face ((,class (:underline ,warning)))) - `(js3-external-variable-face ((,class (:foreground ,var)))) - `(js3-function-param-face ((,class (:foreground ,fg2)))) - `(js3-jsdoc-tag-face ((,class (:foreground ,keyword)))) - `(js3-instance-member-face ((,class (:foreground ,const)))) - `(warning ((,class (:foreground ,warning)))) - `(ac-completion-face ((,class (:underline t :foreground ,keyword)))) - `(info-quoted-name ((,class (:foreground ,builtin)))) - `(info-string ((,class (:foreground ,str)))) - `(icompletep-determined ((,class :foreground ,builtin))) - `(undo-tree-visualizer-current-face ((,class :foreground ,builtin))) - `(undo-tree-visualizer-default-face ((,class :foreground ,fg2))) - `(undo-tree-visualizer-unmodified-face ((,class :foreground ,var))) - `(undo-tree-visualizer-register-face ((,class :foreground ,type))) - `(slime-repl-inputed-output-face ((,class (:foreground ,type)))) - `(trailing-whitespace ((,class :foreground ,unspec :background ,warning))) - `(rainbow-delimiters-depth-1-face ((,class :foreground ,fg1))) - `(rainbow-delimiters-depth-2-face ((,class :foreground ,type))) - `(rainbow-delimiters-depth-3-face ((,class :foreground ,var))) - `(rainbow-delimiters-depth-4-face ((,class :foreground ,const))) - `(rainbow-delimiters-depth-5-face ((,class :foreground ,keyword))) - `(rainbow-delimiters-depth-6-face ((,class :foreground ,fg1))) - `(rainbow-delimiters-depth-7-face ((,class :foreground ,type))) - `(rainbow-delimiters-depth-8-face ((,class :foreground ,var))) - `(magit-item-highlight ((,class :background ,bg3))) - `(magit-section-heading ((,class (:foreground ,keyword :weight bold)))) - `(magit-hunk-heading ((,class (:background ,bg3)))) - `(magit-section-highlight ((,class (:background ,bg2)))) - `(magit-hunk-heading-highlight ((,class (:background ,bg3)))) - `(magit-diff-context-highlight ((,class (:background ,bg3 :foreground ,fg3)))) - `(magit-diffstat-added ((,class (:foreground ,type)))) - `(magit-diffstat-removed ((,class (:foreground ,var)))) - `(magit-process-ok ((,class (:foreground ,func :weight bold)))) - `(magit-process-ng ((,class (:foreground ,warning :weight bold)))) - `(magit-branch ((,class (:foreground ,const :weight bold)))) - `(magit-log-author ((,class (:foreground ,fg3)))) - `(magit-hash ((,class (:foreground ,fg2)))) - `(magit-diff-file-header ((,class (:foreground ,fg2 :background ,bg3)))) - `(lazy-highlight ((,class (:foreground ,fg2 :background ,bg3)))) - `(term ((,class (:foreground ,fg1 :background ,bg1)))) - `(term-color-black ((,class (:foreground ,bg3 :background ,bg3)))) - `(term-color-blue ((,class (:foreground ,func :background ,func)))) - `(term-color-red ((,class (:foreground ,keyword :background ,bg3)))) - `(term-color-green ((,class (:foreground ,type :background ,bg3)))) - `(term-color-yellow ((,class (:foreground ,var :background ,var)))) - `(term-color-magenta ((,class (:foreground ,builtin :background ,builtin)))) - `(term-color-cyan ((,class (:foreground ,str :background ,str)))) - `(term-color-white ((,class (:foreground ,fg2 :background ,fg2)))) - `(rainbow-delimiters-unmatched-face ((,class :foreground ,warning))) - `(helm-header ((,class (:foreground ,fg2 :background ,bg1 :underline nil :box nil)))) - `(helm-source-header ((,class (:foreground ,keyword :background ,bg1 :underline nil :weight bold)))) - `(helm-selection ((,class (:background ,bg2 :underline nil)))) - `(helm-selection-line ((,class (:background ,bg2)))) - `(helm-visible-mark ((,class (:foreground ,bg1 :background ,bg3)))) - `(helm-candidate-number ((,class (:foreground ,bg1 :background ,fg1)))) - `(helm-separator ((,class (:foreground ,type :background ,bg1)))) - `(helm-time-zone-current ((,class (:foreground ,builtin :background ,bg1)))) - `(helm-time-zone-home ((,class (:foreground ,type :background ,bg1)))) - `(helm-buffer-not-saved ((,class (:foreground ,type :background ,bg1)))) - `(helm-buffer-process ((,class (:foreground ,builtin :background ,bg1)))) - `(helm-buffer-saved-out ((,class (:foreground ,fg1 :background ,bg1)))) - `(helm-buffer-size ((,class (:foreground ,fg1 :background ,bg1)))) - `(helm-ff-directory ((,class (:foreground ,func :background ,bg1 :weight bold)))) - `(helm-ff-file ((,class (:foreground ,fg1 :background ,bg1 :weight normal)))) - `(helm-ff-executable ((,class (:foreground ,var :background ,bg1 :weight normal)))) - `(helm-ff-invalid-symlink ((,class (:foreground ,warning2 :background ,bg1 :weight bold)))) - `(helm-ff-symlink ((,class (:foreground ,keyword :background ,bg1 :weight bold)))) - `(helm-ff-prefix ((,class (:foreground ,bg1 :background ,keyword :weight normal)))) - `(helm-grep-cmd-line ((,class (:foreground ,fg1 :background ,bg1)))) - `(helm-grep-file ((,class (:foreground ,fg1 :background ,bg1)))) - `(helm-grep-finish ((,class (:foreground ,fg2 :background ,bg1)))) - `(helm-grep-lineno ((,class (:foreground ,fg1 :background ,bg1)))) - `(helm-grep-match ((,class (:foreground ,unspec :background ,unspec :inherit helm-match)))) - `(helm-grep-running ((,class (:foreground ,func :background ,bg1)))) - `(helm-moccur-buffer ((,class (:foreground ,func :background ,bg1)))) - `(helm-source-go-package-godoc-description ((,class (:foreground ,str)))) - `(helm-bookmark-w3m ((,class (:foreground ,type)))) - `(company-echo-common ((,class (:foreground ,bg1 :background ,fg1)))) - `(company-preview ((,class (:background ,bg1 :foreground ,var)))) - `(company-preview-common ((,class (:foreground ,bg2 :foreground ,fg3)))) - `(company-preview-search ((,class (:foreground ,type :background ,bg1)))) - `(company-scrollbar-bg ((,class (:background ,bg3)))) - `(company-scrollbar-fg ((,class (:foreground ,keyword)))) - `(company-tooltip ((,class (:foreground ,fg2 :background ,bg2 :bold t)))) - `(company-tooltop-annotation ((,class (:foreground ,const)))) - `(company-tooltip-common ((,class ( :foreground ,fg3)))) - `(company-tooltip-common-selection ((,class (:foreground ,str)))) - `(company-tooltip-mouse ((,class (:inherit highlight)))) - `(company-tooltip-selection ((,class (:background ,bg3 :foreground ,fg3)))) - `(company-template-field ((,class (:inherit region)))) - `(web-mode-builtin-face ((,class (:inherit ,font-lock-builtin-face)))) - `(web-mode-comment-face ((,class (:inherit ,font-lock-comment-face)))) - `(web-mode-constant-face ((,class (:inherit ,font-lock-constant-face)))) - `(web-mode-keyword-face ((,class (:foreground ,keyword)))) - `(web-mode-doctype-face ((,class (:inherit ,font-lock-comment-face)))) - `(web-mode-function-name-face ((,class (:inherit ,font-lock-function-name-face)))) - `(web-mode-string-face ((,class (:foreground ,str)))) - `(web-mode-type-face ((,class (:inherit ,font-lock-type-face)))) - `(web-mode-html-attr-name-face ((,class (:foreground ,func)))) - `(web-mode-html-attr-value-face ((,class (:foreground ,keyword)))) - `(web-mode-warning-face ((,class (:inherit ,font-lock-warning-face)))) - `(web-mode-html-tag-face ((,class (:foreground ,builtin)))) - `(jde-java-font-lock-package-face ((t (:foreground ,var)))) - `(jde-java-font-lock-public-face ((t (:foreground ,keyword)))) - `(jde-java-font-lock-private-face ((t (:foreground ,keyword)))) - `(jde-java-font-lock-constant-face ((t (:foreground ,const)))) - `(jde-java-font-lock-modifier-face ((t (:foreground ,fg2)))) - `(jde-jave-font-lock-protected-face ((t (:foreground ,keyword)))) - `(jde-java-font-lock-number-face ((t (:foreground ,var)))) - `(yas-field-highlight-face ((t (:background ,selection))))) - ;; Legacy - (if (< emacs-major-version 22) - (custom-theme-set-faces - 'dtmacs - `(show-paren-match-face ((,class (:background ,warning))))) ;; obsoleted in 22.1, removed 2016 - (custom-theme-set-faces - 'dtmacs - `(show-paren-match ((,class (:foreground ,bg1 :background ,str)))) - `(show-paren-mismatch ((,class (:foreground ,bg1 :background ,warning)))))) - ;; emacs >= 26.1 - (when (>= emacs-major-version 26) - (custom-theme-set-faces - 'dtmacs - `(line-number ((t (:inherit fringe)))) - `(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold)))))) - - ;; emacs >= 27.1 - (when (>= emacs-major-version 27) - (custom-theme-set-faces - 'dtmacs - `(tab-line ((,class (:background ,bg2 :foreground ,fg4)))) - `(tab-line-tab ((,class (:inherit tab-line)))) - `(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4)))) - `(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1)))) - `(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2)))))) - (when (>= emacs-major-version 28) - (custom-theme-set-faces - 'dtmacs - `(line-number ((t (:inherit fringe)))) - `(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold)))))) -;; emacs >= 27.1 -(when (>= emacs-major-version 27) - (custom-theme-set-faces - 'dtmacs - `(tab-line ((,class (:background ,bg2 :foreground ,fg4)))) - `(tab-line-tab ((,class (:inherit tab-line)))) - `(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4)))) - `(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1)))) - `(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2)))))) - (when (>= emacs-major-version 28) - (custom-theme-set-faces - 'dtmacs - `(tab-line-tab-modified ((,class (:foreground ,warning2 :weight bold)))))) - (when (boundp 'font-lock-regexp-face) - (custom-theme-set-faces - 'dtmacs - `(font-lock-regexp-face ((,class (:inherit font-lock-string-face :underline t))))))) - -;;;###autoload -(when load-file-name - (add-to-list 'custom-theme-load-path - (file-name-as-directory (file-name-directory load-file-name)))) - -(provide-theme 'dtmacs) - -;; Local Variables: -;; no-byte-compile: t -;; End: - -;;; dtmacs-theme.el ends here