;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- ;;;; Misc settings (setq user-full-name "Jeffrey Serio" user-mail-address "hyperreal@fedoraproject.org") ;; This sets the frame dimensions and position on the screen when on moonshadow host. ;; Also sets the font size for moonshadow host. (when (string= (system-name) "moonshadow") (setq fontsize 18) (setq default-frame-alist '((height . 53) (width . 154) (left . 1720) (top . 0) (vertical-scroll-bars . nil) (horizontal-scroll-bars . nil)))) ;; This sets the frame to be full screen maximized on evergloam host. ;; Also sets the font size for evergloam host. (when (string= (system-name) "evergloam") (setq fontsize 18) (add-to-list 'default-frame-alist '(fullscreen . maximized))) ;; Set fonts (setq monofontfam "JetBrainsMono Nerd Font Mono") (setq doom-font (font-spec :family monofontfam :size fontsize) doom-variable-pitch-font (font-spec :family "Rubik") doom-unicode-font (font-spec :family monofontfam :size fontsize) doom-big-font (font-spec :family monofontfam :size fontsize)) ;; Use catppuccin-mocha theme (setq doom-theme 'catppuccin) (setq catppuccin-flavor 'mocha) ;; 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 'relative) ;; Make vterm open in another window (setq vterm-other-window 1) ;; Keybinding to kill-whole-line (global-set-key (kbd "M-9") 'kill-whole-line) ;; Copy all or text selection (defun xah-copy-all-or-region () "Put the whole buffer content to `kill-ring', or text selection if there's one. Respects `narrow-to-region'. URL `https://ergomacs.org/emacs/emacs_copy_cut_all_or_region.html' Version 2015-08-22" (interactive) (if (use-region-p) (progn (kill-new (buffer-substring (region-beginning) (region-end))) (message "Text selection copied.")) (progn (kill-new (buffer-string)) (message "Buffer content copied.")))) ;; Cut all or text selection (defun xah-cut-all-or-region () "Cut the whole buffer content to `kill-ring', or text selection if there's one. Respects `narrow-to-region'. URL `https://ergomacs.org/emacs/emacs_copy_cut_all_or_region.html' Version 2015-08-22" (interactive) (if (use-region-p) (progn (kill-new (buffer-substring (region-beginning) (region-end))) (delete-region (region-beginning) (region-end))) (progn (kill-new (buffer-string)) (delete-region (point-min) (point-max))))) ;; open URL in Firefox (defun browse-host-firefox (url &rest ignored) "Browse URL with the host's Firefox using distrobox-exec." (interactive "sURL: ") (shell-command (concat "firefox " url))) (setq browse-url-browser-function 'browse-host-firefox) ;; after copy Ctrl+c in Linux X11, you can paste by `yank' in emacs (setq select-enable-clipboard t) ;; after mouse selection copy in X11, you can paste by `yank' in emacs (setq select-enable-primary t) ;; set keybinding for paste (global-set-key (kbd "C-S-V") #'clipboard-yank) ;; Smart home key (defun smart-beginning-of-line () "Move point to first non-whitespace character or beginning-of-line. Move point to the first non-whitespace character on this line. If point was already at that position, move point to beginning of line." (interactive "^") (let ((oldpos (point))) (back-to-indentation) (and (= oldpos (point)) (beginning-of-line)))) (global-set-key (kbd "") 'smart-beginning-of-line) (global-set-key (kbd "") 'end-of-line) ;; Autoformat on save (setq +format-on-save-enabled-modes '(emacs-lisp-mode python-mode)) ;;;; evil-nerd-commenter (global-set-key (kbd "M-;") 'evilnc-comment-or-uncomment-lines) (global-set-key (kbd "C-c l") 'evilnc-quick-comment-or-uncomment-to-the-line) (global-set-key (kbd "C-c c") 'evilnc-copy-and-comment-lines) (global-set-key (kbd "C-c p") 'evilnc-comment-or-uncomment-paragraphs) ;;;; org-mode (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1))) (setq org-modules '(org-agenda org-annotate-file org-choose org-collector org-man org-notify )) (eval-after-load 'org '(org-load-modules-maybe t)) (setq org-directory "~/sync/org/") (setq org-default-notes-file "~/sync/org/notes.org") ;; support selecting lines by using shift (setq org-support-shift-select t) ;; org-mode tags (setq org-tag-alist (quote (("@errand" . ?e) ("@homemaking" . ?m) ("@homelab" . ?l) ("@config" . ?c) ("@selfcare" . ?s) ("@fedora" . ?f) ("@techne" . ?t) ("@refile" . ?r)))) ;; org-mode keybindings (with-eval-after-load 'org (bind-key "C-c $" 'org-archive-subtree) (bind-key "C-c r" 'org-capture) (bind-key "C-c R" 'org-roam-capture) (bind-key "C-c a" 'org-agenda) (bind-key "C-c l" 'org-store-link) (bind-key "C-c L" 'org-insert-link-global) (bind-key "C-c O" 'org-open-at-point-global)) (setq org-use-effective-time t) ;; org-refile (setq org-reverse-note-order t) ; new notes prepended (setq org-refile-use-outline-path 'file) (setq org-outline-path-complete-in-steps nil) (setq org-refile-allow-creating-parent-nodes 'confirm) (setq org-refile-use-cache nil) (setq org-blank-before-new-entry '((heading . t) (plain-list-item . t))) (setq org-refile-targets `((("~/sync/org/inbox.org" "~/sync/org/calendar.org" "~/sync/org/computing.org" "~/sync/org/general.org" "~/sync/org/orders.org" "~/sync/org/notes.org" "~/sync/org/reading.org" "~/sync/org/grocery.org") . (:maxlevel .5)))) ;; org-todo-keywords (with-eval-after-load 'org (setq org-todo-keywords '((sequence "STARTED(s)" "TODO(t)" "WAITING(w@/!)" "IDEA(i)" "SOMEDAY(.)" "BLOCKED(k@/!)" "|" "DONE(x!)" "CANCELLED(c)") (sequence "PROJECT" "|" "DONE(x)") (sequence "MAYBE(,0)" "CHOSEN(c,+)" "|" "REJECTED"))) ;; catppuccin palette (setq org-todo-keyword-faces '(("STARTED" . (:foreground "#a6d189" :weight bold)) ("TODO" . (:foreground "#a6e3a1" :weight bold)) ("WAITING" . (:foreground "#f9e2af" :weight bold)) ("IDEA" . (:foreground "#74c7ec" :weight bold)) ("SOMEDAY" . (:foreground "#f2cdcd" :weight bold)) ("BLOCKED" . (:foreground "#c6d0f5" :weight bold)) ("DONE" . (:foreground "#f38ba8" :weight bold)) ("CANCELLED" . (:foreground "#e78284" :weight bold)) ("MAYBE" . (:foreground "#c6d0f5" :weight bold)) ("CHOSEN" . (:foreground "#89b4fa" :weight bold)) ("REJECTED" . (:foreground "#d20f39" :weight bold))))) (setq org-log-done 'time) ;;;; org-roam (setq org-roam-directory "~/sync/org-roam") (org-roam-db-autosync-mode) ;; org-roam-capture-template (setq org-roam-capture-templates '(("m" "main" plain "%?" :if-new (file+head "main/${slug}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t) ("r" "reference" plain "%?" :if-new (file+head "reference/${title}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t) ("s" "self" plain "%?" :if-new (file+head "self/${slug}.org" "#+title: ${title}\n#+filetags: :self:\n") :unnarrowed t) ("S" "self-entry" entry "* %U\n%?" :target (file "self/${slug}.org") :empty-lines 1 :unnarrowed t) ("c" "cookbook" plain "* %^{Recipe title}\n :PROPERTIES:\n :source-url:%?\n :servings:\n :prep-time:\n :cook-time:\n :ready-in:\n :END:\n** Ingredients\n \n** Directions\n\n" :if-new (file "recipes/${title}.org") :unnarrowed t))) ;; org-capture templates (setq org-capture-templates '(("t" "Todo" entry (file "~/sync/org/inbox.org") "* TODO %?" :empty-lines-before 1 :unnarrowed t :immediate-finish t) ("d" "Calendar" entry (file "~/sync/org/calendar.org") "* TODO %?" :empty-lines-before 1 :unnarrowed t) ("j" "Journal" entry (file+olp+datetree "~/sync/org/journal.org") "* %U\n%?" :empty-lines-before 1 :unnarrowed t) ("r" "Reading" entry (file "~/sync/org/reading.org") "* %a\n%U\n%^{PROMPT}" :empty-lines-before 1 :unnarrowed t :immediate-finish t))) (defun hyperreal/org-capture-slipbox () (interactive) (org-capture nil "s")) ;;;; python-mode ;; Set bpython as Python shell interpreter (add-hook! python-mode-hook (setq python-shell-interpreter "bpython")) ;; Set black as Python formatter (setq-hook! 'python-mode-hook +format-with 'black) ;;;; go-mode ;; completion for GoLang (add-hook 'completion-at-point-functions 'go-complete-at-point) ;; Go - lsp-mode (defun lsp-go-install-save-hooks () (add-hook 'before-save-hook #'lsp-format-buffer t t) (add-hook 'before-save-hook #'lsp-organize-imports t t)) (add-hook 'go-mode-hook #'lsp-go-install-save-hooks) ;; Start LSP Mode (add-hook 'go-mode-hook #'lsp-deferred) ;;;; dired (after! dired (setq dired-listing-switches "-laGh1v --group-directories-first") (setq dired-confirm-shell-command nil dired-no-confirm t dired-deletion-confirmer '(lambda (x) t) dired-recursive-deletes 'always)) ;;;; elfeed (elfeed-protocol-enable) (run-with-idle-timer (* 15 60) t #'elfeed-update) (setq elfeed-protocol-ttrss-maxsize 200) (setq elfeed-feeds (list (list "ttrss+https://hyperreal@rss.envs.net" :password (shell-command-to-string "echo -n `pass show envs.net/ttrss`")))) ;;;; dictionary (global-set-key (kbd "C-c l") #'dictionary-lookup-definition) (setq dictionary-server "dict.org") ;;;; undo-tree (use-package undo-tree :diminish undo-tree-mode :config (progn (global-undo-tree-mode) (setq undo-tree-visualizer-timestamps t) (setq undo-tree-visualizer-diff t) (setq undo-tree-history-directory-alist '(("." . "~/sync/emacs/backups/undo-tree"))))) ;;;; tab-bar-mode (global-set-key (kbd "s-{") 'tab-bar-switch-to-prev-tab) (global-set-key (kbd "s-}") 'tab-bar-switch-to-next-tab) (global-set-key (kbd "s-t") 'tab-bar-new-tab) (global-set-key (kbd "s-w") 'tab-bar-close-tab) (tab-bar-mode 1) (setq tab-bar-close-button-show nil) (setq tab-bar-new-tab-choice "*doom*") (setq tab-bar-tab-hints t) (setq tab-bar-format '(tab-bar-format-history tab-bar-format-tabs tab-bar-separator)) (setq tab-bar-select-tab-modifiers "super") ;;;; bufler-mode (setq bufler-tabs-mode 1) (global-set-key (kbd "C-x b") 'bufler-switch-buffer) (bufler-defgroups (group ;; Subgroup collecting all named workspaces. (auto-workspace)) (group ;; Subgroup collecting all help-mode and info-mode buffers (group-or "*Help/Info*" (mode-match "*Help*" (rx bos "help-")) (mode-match "*Info*" (rx bos "info-")))) (group ;; Subgroup collecting all special buffers (i.e. ones that are not ;; file-backed), except magit-status-mode buffers (which are allowed to fall ;; through to other groups, so they end up grouped with their project buffers). (group-and "*Special*" (lambda (buffer) (unless (or (funcall (mode-match "Magit" (rx bos "magit-status")) buffer) (funcall (mode-match "Dired" (rx bos "dired")) buffer) (funcall (auto-file) buffer)) "*Special*"))) (group ;; Subgroup collecting these "special special" buffers ;; separately for convenience. (name-match "**Special**" (rx bos "*" (or "Messages" "Warnings" "scratch" "Backtrace") "*"))) (group ;; Subgroup collecting all other Magit buffers, grouped by directory. (mode-match "*Magit* (non-status)" (rx bos (or "magit" "forge") "-")) (auto-directory)) ;; Remaining special buffers are grouped automatically by mode. (auto-mode)) ;; All buffers under ~/.doom.d (dir doom-user-dir) (group ;; Subgroup collecting buffers in org-directory. (dir org-directory) (dir org-roam-directory) (group ;; Subgroup collecting indirect Org buffers, grouping them by file. ;; This is very useful when used with org-tree-to-indirect-buffer. (auto-indirect) (auto-file)) (group-not "*special*" (auto-file)) (auto-mode)) (group ;; Subgroup collecting buffers in a version-control project, ;; grouping them by directory. (auto-project)) ;; Group remaining buffers by directory, then major mode. (auto-directory) (auto-mode))