;;; $doomdir/config.el --- My Emacs Config File -*- lexical-binding: t; -*- ;; ;; author: Marty Buchaus ;; copyright © 2022, Marty Buchaus, all rights reserved. ;; ;;; Commentary: ;; ;;; Code: ;;;; Global (setq user-full-name "Marty Buchaus") (setq user-mail-address "marty@dabuke.com") (setq-default epg-gpg-program "/usr/bin/gpg2") (setq-default delete-by-moving-to-trash t) (setq-default enable-local-variables t) ; allow for reading the local variables file (setq-default left-margin-width 1) ; Define new widths (setq-default right-margin-width 2) ; Define new widths. (setq-default window-combination-resize t) (setq-default x-stretch-cursor t) (setq-default display-time-24hr-format t) ; I wonder what this does (setq-default evil-want-fine-undo t) ; by default while in insert all changes are one big blob. be more granular (setq-default truncate-string-ellipsis "…") ; unicode ellispis are nicer than "...", and also save /precious/ space (setq-default auth-sources '("~/.authinfo.gpg")) (setq-default warning-minimum-level :emergency) (setq-default doom-scratch-initial-major-mode 'lisp-interaction-mode) ; Make the scratch buffer start in lisp mode (setq-default display-time-load-average nil) (setq auto-save-default t) ; nobody likes to loose work, i certainly don't (setq confirm-kill-emacs nil) ; stop hounding me and quit (setq inhibit-compacting-font-caches t) (setq password-cache-expiry nil) ; i can trust my computers ... can't i? (setq read-process-output-max (* 1024 1024)) (setq scroll-margin 2) ; it's nice to maintain a little margin (setq undo-limit 80000000) ; raise undo-limit to 80mb (setq garbage-collection-messages nil) (display-time-mode 1) ; enable time in the mode-line (global-subword-mode 1) ; CamelCase and it makes refactoring slightly Essie (set-window-buffer nil (current-buffer)) (add-to-list 'load-path (expand-file-name "elisp/" doom-user-dir)) (setq safe-local-variable-values (quote ((buffer-read-only . 1)))) (doom-load-envvars-file (expand-file-name ".local/env" doom-emacs-dir)) ;;;;; Vterm (setq-default vterm-kill-buffer-on-exit t) (setq-default vterm-always-compile-module t) ; Always compile the vterm module (setq-default vterm-timer-delay nil) ; Make Vterm snappier (setq-default vterm-shell "/usr/bin/zsh") ;;;; Key Bindings (setq-default doom-localleader-key ",") ;;;;; global Keybindings (define-key! help-map "h" #'helpful-at-point) (global-set-key [f7] 'hyrolo-fgrep) (after! evil (map! :m "-" #'dired-jump :en "C-h" #'evil-window-left :en "C-j" #'evil-window-down :en "C-k" #'evil-window-up :en "C-l" #'evil-window-right)) (map! :n "C-:" #'flyspell-correct-wrapper :n "gz" #'zoxide-find-file :n "C-," #'flyspell-correct-next) ;;;;; Leader KeyBindings (map! :leader "TAB" #'evil-switch-to-windows-last-buffer "SPC" #'execute-extended-command) ;;;;;; a --- Application (map! :leader (:prefix-map ("a" . "app") :desc "MU4E" "m" #'=mu4e :desc "Dashboard" "d" #'+doom-dashboard/open ;; :desc "consult-recoll" "r" #'consult-recoll :desc "Paperless" "P" #'paperless :desc "Xeft-mode" "x" #'xeft (:prefix-map ("b" . "buku") "b" #'ebuku "s" #'ebuku-search-on-all) ;; Pass (:when (modulep! :tools pass) (:prefix-map ("p" . "pass") "/" #'+pass/consult "c" #'password-store-edit "d" #'password-store-remove "g" #'password-store-generate "i" #'password-store-insert "r" #'password-store-rename "w" #'password-store-url "y" #'password-store-copy "D" #'password-store-clear "I" #'password-store-init)) (:prefix-map ("o" . "otp") "a" #'password-store-otp-append "i" #'password-store-otp-insert "y" #'password-store-otp-token-copy "A" #'password-store-otp-append-from-image "Y" #'password-store-otp-uri-copy) ;; Tramp (:prefix-map ("t" . "Tramp") :desc "clean all connections" "C" #'tramp-cleanup-all-connections :desc "clean all buffers" "B" #'tramp-cleanup-all-buffers :desc "clean connection" "c" #'tramp-cleanup-this-connection :desc "consult-tramp" "t" #'consult-tramp :desc "tramp-quit" "q" #'marty/tramp-quit))) ;; ;;;;;; b ;; (map! :leader ;; :prefix ("b") ;; "b" #'consult-buffer) ;;;;;; d --- (map! :leader (:prefix-map ("d" . "Dired") :desc "Peep-dired image previews" "p" #'peep-dired :desc "Dired-FD" "d" #'fd-dired :desc "Dired Jump" "j" #'dired-jump :desc "Dired Jump o/window" "J" #'dired-jump-other-window :desc "Dired view file" "v" #'dired-view-file)) ;;;;;; f --- file (map! :leader (:prefix ("f") :desc "Search Directory FD" "/" #'+vertico/consult-fd)) ;;;;;; l --- workspace / Layout (map! :leader :prefix-map ("l" . "workspace") :desc "Display tab bar" "SPC" #'+workspace/display :desc "Cycle tab bar" "TAB" #'+workspace/cycle :desc "Switch workspace" "." #'+workspace/switch-to :desc "Switch to last workspace" "`" #'+workspace/other :desc "Move workspace left" "<" #'+workspace/swap-left :desc "Move workspace right" ">" #'+workspace/swap-right :desc "New workspace" "n" #'+workspace/new :desc "Create named workspace" "N" #'+workspace/new-named :desc "open workspace from file" "o" #'+workspace/load :desc "Save workspace to file" "s" #'+workspace/save :desc "Delete session" "x" #'+workspace/kill-session :desc "Delete this workspace" "d" #'+workspace/delete :desc "Rename workspace" "r" #'+workspace/rename :desc "Switch workspace" "l" #'+workspace/switch-to :desc "Restore last session" "R" #'+workspace/restore-last-session :desc "Next workspace" "]" #'+workspace/switch-right :desc "Previous workspace" "[" #'+workspace/switch-left :desc "Switch to 1st workspace" "1" #'+workspace/switch-to-0 :desc "Switch to 2nd workspace" "2" #'+workspace/switch-to-1 :desc "Switch to 3rd workspace" "3" #'+workspace/switch-to-2 :desc "Switch to 4th workspace" "4" #'+workspace/switch-to-3 :desc "Switch to 5th workspace" "5" #'+workspace/switch-to-4 :desc "Switch to 6th workspace" "6" #'+workspace/switch-to-5 :desc "Switch to 7th workspace" "7" #'+workspace/switch-to-6 :desc "Switch to 8th workspace" "8" #'+workspace/switch-to-7 :desc "Switch to 9th workspace" "9" #'+workspace/switch-to-8 :desc "Switch to final workspace" "0" #'+workspace/switch-to-final) ;;;;;; n --- notes (map! :leader :prefix "n" "r" #'transient-roam-jump) ;;;;;; o --- open (map! :leader (:prefix ("o") (:prefix-map ("m" . "My") :desc "0mobile" "0" #'(lambda () (interactive) (find-file (concat org-directory "0mobile.org"))) :desc "Bullets" "b" #'(lambda () (interactive) (find-file (concat org-directory "Joyent/Bullets.org"))) :desc "Desktop" "d" #'(lambda () (interactive) (find-file (concat org-directory "desktop.org"))) :desc "MD Cheat" "D" #'(lambda () (interactive) (find-file "~/Nextcloud/Notes/markdown/markdown-cheat-sheet.md")) :desc "contacts" "o" #'(lambda () (interactive) (find-file (concat org-directory "contacts.org"))) :desc "read-later" "r" #'(lambda () (interactive) (find-file (concat org-directory "read-later.org"))) :desc "Tasks" "g" #'(lambda () (interactive) (find-file (concat org-directory "Tasks.org"))) :desc "Habits" "h" #'(lambda () (interactive) (find-file (concat org-directory "Habits.org"))) :desc "Joyent Index" "j" #'(lambda () (interactive) (find-file (concat org-directory "Joyent/index.org"))) :desc "read later" "l" #'(lambda () (interactive) (find-file (concat org-directory "read-later.org"))) :desc "Projects" "p" #'(lambda () (interactive) (find-file (concat org-directory "Projects.org"))) :desc "Someday" "s" #'(lambda () (interactive) (find-file (concat org-directory "Someday.org"))) :desc "Tip Jar" "t" #'(lambda () (interactive) (find-file (concat org-directory "TipJar/index.org")))) (:prefix-map ("c" . "+config") :desc "keybindings" "k" #'(lambda () (interactive) (find-file (concat doom-private-dir "keybindings.el"))) :desc "config" "c" #'(lambda () (interactive) (find-file (concat doom-private-dir "config.el"))) :desc "org" "o" #'(lambda () (interactive) (find-file (concat doom-private-dir "org-mode.el"))) :desc "init" "i" #'(lambda () (interactive) (find-file (concat doom-private-dir "init.el"))) :desc "packages" "p" #'(lambda () (interactive) (find-file (concat doom-private-dir "packages.el"))) :desc "mu4e" "m" #'(lambda () (interactive) (find-file (concat doom-private-dir "mu4e.el")))) (:prefix-map ("C" . "calendar") :desc "Calendar" "C" #'(lambda () (interactive) (find-file (concat org-directory "snuffop-calendar.org"))) :desc "Joyent-Calendar" "j" #'(lambda () (interactive) (find-file (concat org-directory "joyent-calendar.org")))))) ;;;; UI ;;;;; Set Fonts (cond (IS-MAC (setq doom-font (font-spec :family "DejaVuSansMono Nerd Font Mono" :size 13) doom-variable-pitch-font (font-spec :family "Ubuntu Nerd Font" :style "Regular" :size 13 :weight 'regular))) (IS-LINUX (setq doom-font (font-spec :family "FiraCode Nerd Font" :size 13 :weight 'medium) doom-big-font (font-spec :family "FiraCode Nerd Font" :size 21 :weight 'regular) doom-variable-pitch-font (font-spec :family "Ubuntu" :size 14) doom-unicode-font (font-spec :family "Noto Color Emoji" :size 15)))) ;;;;; Faces (custom-set-faces! '(font-lock-comment-face :slant italic) '(font-lock-keyword-face :slant italic)) (setq global-prettify-symbols-mode t) (cond (IS-MAC (custom-set-faces! '(mode-line :family "firacode nerd font mono" :height 140) '(mode-line-inactive :family "firacode nerd font mono" :height 140))) (t (custom-set-faces! '(mode-line :family "Ubuntu Nerd Font" :height 105) '(mode-line-inactive :family "Ubuntu Nerd Font" :height 105)))) ;;;;; Theme (setq doom-theme 'doom-dracula) (remove-hook 'window-setup-hook #'doom-init-theme-h) (add-hook 'after-init-hook #'doom-init-theme-h 'append) (delq! t custom-theme-load-path) (custom-set-faces! '(doom-modeline-buffer-modified :foreground "orange")) (after! doom-themes (doom-themes-org-config) (doom-themes-visual-bell-config) (doom-themes-treemacs-config) (setq doom-themes-enable-bold t doom-themes-enable-italic t doom-themes-padded-modeline t doom-themes-treemacs-theme 'doom-colors)) ;;;;; Modeline (after! doom-modeline (setq auto-revert-check-vc-info t doom-modeline-buffer-file-name-style 'relative-to-project doom-modeline-enable-word-count t doom-modeline-github t doom-modeline-major-mode-color-icon (display-graphic-p) doom-modeline-major-mode-icon (display-graphic-p) doom-modeline-mu4e t doom-modeline-buffer-state-icon t doom-modeline-buffer-modification-icon t doom-modeline-modal-icon nil doom-modeline-vcs-max-length 60) (set-face-attribute 'mode-line nil :family "Ubuntu" :height 100) (set-face-attribute 'mode-line-inactive nil :family "Ubuntu" :height 100) (add-hook! 'doom-modeline-mode-hook (progn (set-face-attribute 'header-line nil :background (face-background 'mode-line) :foreground (face-foreground 'mode-line)))) (doom-modeline-def-segment buffer-name "Display the current buffer's name, without any other information." (concat (doom-modeline-spc) (doom-modeline--buffer-name))) (doom-modeline-def-segment pdf-icon "PDF icon from all-the-icons." (concat (doom-modeline-spc) (doom-modeline-icon 'octicon "file-pdf" nil nil :face (if (doom-modeline--active) 'all-the-icons-red 'mode-line-inactive) :v-adjust 0.02)))) ;;;;; Dashboard (setq doom-fallback-buffer-name "► Doom" +doom-dashboard-name "► Doom") (custom-theme-set-faces! 'doom-one '(doom-dashboard-banner :foreground "red" :background "#000000" :weight bold) '(doom-dashboard-footer :inherit font-lock-constant-face) '(doom-dashboard-footer-icon :inherit all-the-icons-red) '(doom-dashboard-loaded :inherit font-lock-warning-face) '(doom-dashboard-menu-desc :inherit font-lock-string-face) '(doom-dashboard-menu-title :inherit font-lock-function-name-face)) (setq fancy-splash-image (expand-file-name "banners/smaller-cute-demon.png" doom-private-dir)) ;;;;; Line Numbers (setq display-line-numbers-type 'relative) ;; remove numbers from these modes (dolist (mode '(org-mode-hook term-mode-hook shell-mode-hook eshell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (setq doom-fallback-buffer-name "► Doom" +doom-dashboard-name "► Doom") ;;;;; Syntax Lists (add-to-list 'auto-mode-alist '("\\.service\\'" . systemd-mode)) (add-to-list 'auto-mode-alist '("\\.service.tmpl\\'" . systemd-mode)) (add-to-list 'auto-mode-alist '("\\.timer\\'" . systemd-mode)) (add-to-list 'auto-mode-alist '("\\.timer.tmpl\\'" . systemd-mode)) (add-to-list 'auto-mode-alist '("\\.target\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.mount\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.automount\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.slice\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.path\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.netdev\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.network\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.link\\'" . conf-unix-mode)) (add-to-list 'auto-mode-alist '("\\.j2\\'" . jinja2-mode)) (add-to-list 'auto-mode-alist '("hosts" . conf-mode)) ;;;;; Windows (setq evil-vsplit-window-right t evil-split-window-below t) ;;;; PACKAGES ;;;;; Autoinsert (defun marty/autoinsert-yas-expand () "Auto Insert Funtion that works for me." (let ((template ( buffer-string))) (delete-region (point-min) (point-max)) (yas-expand-snippet template) (evil-insert-state))) (use-package! autoinsert :init (setq auto-insert-query nil) (setq auto-insert-directory (expand-file-name "templates" doom-private-dir)) (add-hook 'find-file-hook 'auto-insert) (auto-insert-mode 1) :config (define-auto-insert "\\.html?$" ["default.html" marty/autoinsert-yas-expand]) (define-auto-insert "\\.org" ["default.org" marty/autoinsert-yas-expand]) (define-auto-insert "\\.sh" ["default.sh" marty/autoinsert-yas-expand]) (define-auto-insert "\\.el" ["default.el" marty/autoinsert-yas-expand]) (define-auto-insert "Roam/.+\\.org?$" ["org-roam-mode/defaultRoam.org" marty/autoinsert-yas-expand]) (define-auto-insert "masons/[^/].+\\.org?$" ["org-mode/masonsMeetingMinuets.org" marty/autoinsert-yas-expand]) (define-auto-insert "daily/[^/].+\\.org?$" ["org-roam-mode/defaultRoamDaily.org" marty/autoinsert-yas-expand])) ;;;;; Completion (setq completion-styles '(orderless basic substring partial-compltion flex)) (setq read-file-name-completion-ignore-case t) (setq read-buffer-completion-ignore-case t) (setq completion-ignore-case t) ;;;;;; Vertico (after! vertico (vertico-reverse-mode 1) (setq vertico-resize t)) ;;;;;; Embark ;; Open files in (Option) after C-; in embark ;; (defun my/vsplit-file-open (file) "Vertically Split FILE below current." (let ((evil-split-window-below t)) (+evil/window-vsplit-and-follow) (find-file file))) (defun my/split-file-open (file) "Split Window Below Current opening FILE." (let ((evil-split-window-below t)) (+evil/window-split-and-follow) (find-file file))) (map! :after embark :map embark-file-map "V" 'my/vsplit-file-open "X" 'my/split-file-open) ;;;;;; Marginalia (after! marginalia (setq marginalia-censor-variables nil) (defadvice! +marginalia--anotate-local-file-colorful (cand) "Just a more colourful version of `marginalia--anotate-local-file'." :override #'marginalia--annotate-local-file (when-let (attrs (file-attributes (substitute-in-file-name (marginalia--full-candidate cand)) 'integer)) (marginalia--fields ((marginalia--file-owner attrs) :width 12 :face 'marginalia-file-owner) ((marginalia--file-modes attrs)) ((+marginalia-file-size-colorful (file-attribute-size attrs)) :width 7) ((+marginalia--time-colorful (file-attribute-modification-time attrs)) :width 12)))) (defun +marginalia--time-colorful (time) (let* ((seconds (float-time (time-subtract (current-time) time))) (color (doom-blend (face-attribute 'marginalia-date :foreground nil t) (face-attribute 'marginalia-documentation :foreground nil t) (/ 1.0 (log (+ 3 (/ (+ 1 seconds) 345600.0))))))) ;; 1 - log(3 + 1/(days + 1)) % grey (propertize (marginalia--time time) 'face (list :foreground color)))) (defun +marginalia-file-size-colorful (size) (let* ((size-index (/ (log10 (+ 1 size)) 7.0)) (color (if (< size-index 10000000) ; 10m (doom-blend 'orange 'green size-index) (doom-blend 'red 'orange (- size-index 1))))) (propertize (file-size-human-readable size) 'face (list :foreground color))))) ;;;;;; Consult (after! consult (evil-collection-init 'consult) (set-face-attribute 'consult-file nil :inherit 'consult-buffer) (setf (plist-get (alist-get 'perl consult-async-split-styles-alist) :initial) ";")) ;;;;;; Consult-Recoll ;; (defun my-recoll-format (title url mime-type) ;; "remove from url the common prefixes /home/jao/{org/doc,doc,..." ;; (let* ((u (replace-regexp-in-string "/home/marty/" "" url)) ;; (u (replace-regexp-in-string ;; "\\(doc\\|org/doc\\|.emacs.d/gnus/Mail\\|var/mail\\)/" "" u))) ;; (format "%s (%s, %s)" ;; (propertize title 'face 'consult-recoll-title-face) ;; (propertize u 'face 'consult-recoll-url-face) ;; (propertize mime-type 'face 'consult-recoll-mime-face)))) ;; (setq consult-recoll-format-candidate #'my-recoll-format) ;;;;; Chezmoi (use-package! chezmoi :commands (chezmoi-write chezmoi-magit-status chezmoi-diff chezmoi-ediff chezmoi-find chezmoi-write-files chezmoi-open-other chezmoi-template-buffer-display chezmoi-mode) :config ;; Company integration (when (modulep! :completion company) (defun +chezmoi--company-backend-h () (require 'chezmoi-company) (if chezmoi-mode (add-to-list 'company-backends 'chezmoi-company-backend) (delete 'chezmoi-company-backend 'company-backends))) (add-hook 'chezmoi-mode-hook #'+chezmoi--company-backend-h)) ;; Integrate with evil mode by toggling template display when entering insert mode. (when (modulep! :editor evil) (defun +chezmoi--evil-insert-state-enter-h () "Run after evil-insert-state-entry." (chezmoi-template-buffer-display nil (point)) (remove-hook 'after-change-functions #'chezmoi-template--after-change 1)) (defun +chezmoi--evil-insert-state-exit-h () "Run after evil-insert-state-exit." (chezmoi-template-buffer-display nil) (chezmoi-template-buffer-display t) (add-hook 'after-change-functions #'chezmoi-template--after-change nil 1)) (defun +chezmoi--evil-h () (if chezmoi-mode (progn (add-hook 'evil-insert-state-entry-hook #'+chezmoi--evil-insert-state-enter-h nil 1) (add-hook 'evil-insert-state-exit-hook #'+chezmoi--evil-insert-state-exit-h nil 1)) (progn (remove-hook 'evil-insert-state-entry-hook #'+chezmoi--evil-insert-state-enter-h 1) (remove-hook 'evil-insert-state-exit-hook #'+chezmoi--evil-insert-state-exit-h 1)))) (add-hook 'chezmoi-mode-hook #'+chezmoi--evil-h))) (map! :leader :prefix "a" (:prefix ("c" . "chezmoi") :desc "Magit status" "g" #'chezmoi-magit-status :desc "Write" "w" #'chezmoi-write :desc "Write files" "W" #'chezmoi-write-files :desc "Find source" "f" #'chezmoi-find :desc "Sync files" "s" #'chezmoi-sync-files :desc "Diff" "d" #'chezmoi-diff :desc "EDiff" "e" #'chezmoi-ediff :desc "Open other" "o" #'chezmoi-open-other)) ;;;;; Circe (after! circe (setq circe-use-cycle-completion t) (setq circe-reduce-lurker-spam t) (setq circe-format-server-topic "*** Topic change by {userhost}: {topic-diff}") (setq circe-format-say "{nick:-16s} {body}") (circe-set-display-handler "JOIN" (lambda (&rest ignored) nil)) (set-irc-server! "irc.libera.chat" `(:tls t :port 6697 :nick "snuffop" :sasl-username ,(+pass-get-user "irc/libera.chat") :sasl-password ,(+pass-get-secret "irc/libera.chat") :channels ("#doomemacs" "#b0fh")))) ;;;;; Consult-Tramp (use-package! consult-tramp :commands (consult-tramp) :config (setq consult-tramp-extra-targets '("/sshx:mail.dabuke.com|sudo:mail.dabuke.com:/"))) ;;;;; Company (after! company (setq company-idle-delay 0.2 company-minimum-prefix-length 1 company-tooltip-align-annotations t company-selection-wrap-around t company-backends '(company-capf company-dabbrev company-files company-yasnippet) company-global-modes '(not comint-mode erc-mode message-mode help-mode gud-mode))) ;;;;; DIRed (define-key! dired-mode-map (kbd "C-t") #'marty/dired-copy-filename-as-tsfile-link) (setq delete-by-moving-to-trash t trash-directory "~/.local/share/Trash/files/") ;;;;; Dirvish (use-package! diredfl :hook (dired-mode . diredfl-mode) :hook (dirvish-directory-view-mode . diredfl-mode)) (use-package! dirvish :defer t :general (dired-mode-map "C-c C-r" #'dirvish-rsync) :after-call dired-noselect dired dired-jump :custom (dirvish-quick-access-entries '(("." "~/.config/" "config") ("h" "~/" "Home") ("c" "~/.local/share/chezmoi/" "chezmoi") ("d" "~/Downloads/" "Downloads") ("p" "~/Nextcloud/Pictures" "Pictures") ("s" "~/Source" "Source") ("S" "~/Sites" "Sites") ("t" "~/.local/share/Trash/files" "TrashCan"))) :config (dirvish-override-dired-mode) (setq dirvish-cache-dir (concat doom-cache-dir "dirvish/")) (set-popup-rule! "^ ?\\*Dirvish.*" :ignore t) (map! :map dirvish-mode-map :n "?" #'dirvish-dispatch :n "q" #'dirvish-quit :ng "a" #'dirvish-quick-access :ng "f" #'dirvish-file-info-menu :ng "y" #'dirvish-yank-menu :ng "s" #'dirvish-quicksort :ng "TAB" #'dirvish-subtree-toggle :ng "M-t" #'dirvish-layout-toggle :ng "M-b" #'dirvish-history-go-backward :ng "M-f" #'dirvish-history-go-forward :ng "M-n" #'dirvish-narrow :ng "M-m" #'dirvish-mark-menu :ng "M-s" #'dirvish-setup-menu :ng "M-e" #'dirvish-emerge-menu) (setq dirvish-attributes '(file-size collapse) dirvish-mode-line-format '(:left (sort file-time symlink) :right (omit yank index))) (setq dirvish-attributes nil dirvish-use-header-line nil dirvish-mode-line-format nil dirvish-hide-details nil dirvish-hide-cursor nil) (when (modulep! :ui vc-gutter) (push 'vc-state dirvish-attributes)) (when (modulep! +icons) (appendq! dirvish-attributes '(all-the-icons subtree-state)))) ;;;;; ebuku (use-package! ebuku :commands ebuku :init (+evil-collection-init 'ebuku) :config (evil-collection-ebuku-setup)) ;;;;; evil (global-evil-matchit-mode 1) ;;;;; Evil keys in DIRed (map! :after dired :map dired-mode-map :localleader :desc "Create TSfile link" "t" #'marty/dired-copy-filename-as-tsfile-link) (evil-define-key 'normal dired-mode-map (kbd "M-RET") 'dired-display-file (kbd "h") 'dired-up-directory (kbd "l") 'dired-view-file (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-chmod (kbd "O") 'dired-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 "+") 'dired-create-directory (kbd "-") 'dired-up-directory (kbd "% l") 'dired-downcase (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 (kbd "; d") 'epa-dired-do-decrypt (kbd "; e") 'epa-dired-do-encrypt) (add-hook 'peep-dired-hook 'evil-normalize-keymaps) ;; ;; 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"))) ;;;;; EWW (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)) ;;;;; EROS (setq eros-eval-result-prefix "⟹ ") ;;;;; Flycheck (use-package! flycheck-org-vale :after org flycheck) (use-package flycheck-title :after flycheck :config (flycheck-title-mode)) ;;;;; Google Translate (use-package! google-translate :defer t :bind ("C-c T" . 'google-translate-smooth-translate)) ;;;;; Info-colors (use-package! info-colors :commands (info-colors-fontify-node) :init (add-hook 'Info-selection-hook 'info-colors-fontify-node)) ;;;;; I3 window manager config ;; Syntax highlighting for i3 config (use-package! i3wm-config-mode :defer t) ;;;;; keychain-environment (use-package! keychain-environment :init (keychain-refresh-environment)) ;;;;; Magit (after! magit (add-hook 'git-commit-setup-hook 'git-commit-turn-on-flyspell) (magit-todos-mode 1) (magit-delta-mode +1) (add-hook 'magit-add-section-hook 'magit-status-selections-hook 'magit-insert-modules 'magit-insert-unpulled-from-upstream) (setq magit-module-sections-nested nil) (setq magit-diff-refine-hunk 'all) (setq magit-revision-show-gravatars '("^author: " . "^commit: "))) ;;;;; Markdown (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))))) ;;;;;; Grip (after! grip-mode (setq grip-github-password (auth-source-pass-get 'secret "Application/github.com/emacs-token"))) ;;;;; mixed pitch (use-package! mixed-pitch :hook (org-mode . mixed-pitch-mode)) ;;;;; neopastebin (use-package! neopastebin :commands pastebin-list-buffer-refresh pastebin-new :config (let ((credentials (auth-source-user-and-password "pastebin.com"))) (pastebin-create-login :username "snuffop" :dev-key (car credentials) :password (cadr credentials)))) ;;;;; nginx (use-package! company-nginx :after nginx-mode :config (add-hook 'nginx-mode-hook (lambda () (add-to-list 'company-backends #'company-nginx)))) (use-package! nginx-mode :commands (nginx-mode) :defer t) ;;;;; outshine (use-package! outshine :hook (prog-mode . outshine-mode) :config (map! :map emacs-lisp-mode-map "TAB" #'outshine-cycle) (add-hook 'prog-mode-hook #'outline-minor-mode) (add-hook 'outline-minor-mode-hook #'outshine-mode) (defvar outline-minor-mode-prefix "\M-#")) ;;;;; paperless (use-package! paperless :commands (paperless) :config (setq paperless-capture-directory "~/Nextcloud/Documents/INBOX") (setq paperless-root-directory "~/Nextcloud/Documents") (map! :after paperless :map paperless-mode-map :localleader "v" #'paperless-display "f" #'paperless-file "x" #'paperless-execute "D" #'paperless-delete "r" #'paperless-rename "s" #'paperless-scan-directories)) ;;;;; projectile (after! projectile (setq projectile-indexing-method 'alien) (setq projectile-project-search-path '("~/Source" "~/Source/Joyent" "~/Sites" "~/.local/share" "~/.config")) (setq projectile-ignored-projects '("~/" "/tmp" "~/.emacs.d/.local/straight/repos/")) (defun projectile-ignored-project-function (filepath) "Return t if FILEPATH is within any of `projectile-ignored-projects'" (or (mapcar (lambda (p) (s-starts-with-p p filepath)) projectile-ignored-projects)))) ;;;;; Pop Up (set-popup-rules! '(("^\\*helpful" :size 0.35) ("^\\*Ibuffer\\*$" :size 0.35) ("^\\*info.*" :size 80 :side right) ("^\\*Man.*" :size 80 :side right) ("^\\*keycast.*" :size 50 :side right) ("^\\*Customize" :actions display-buffer) ("^\\*edit-indirect" :size 0.6) ("^\\*YASnippet Tables\\*$" :size 0.35) ("^\\*grep\\*$" :size 0.35) ("^\\*pytest\\*" :size 0.35) ("^\\*Anaconda\\*$" :size 0.35) ("\\*.*server log\\*$" :side top :size 0.20 :select nil) ((lambda (buf _) (with-current-buffer buf (eq major-mode 'forge-topic-mode))) :size 0.35) )) ;;;;; SPELL (after! flyspell (setq ispell-personal-dictionary (expand-file-name "dictionary/personal" doom-private-dir)) (setq flyspell-lazy-idle-seconds 0.5)) ;;;;; systemd mode (use-package! systemd :commands (systemd-mode) :mode "\\.service\\'" :config (map! :map systemd-mode :localleader :prefix ("h" . "help") "d" #'systemd-doc-directives "o" #'systemd-doc-open)) ;;;;; TRAMP (after! tramp (setenv "SHELL" "/bin/bash") (setq tramp-shell-prompt-pattern "\\(?:^\\|\\)[^]#$%>\n]*#?[]#$%>] *\\(�\\[[0-9;]*[a-zA-Z] *\\)*")) ;;;;; TREEMACS (after! treemacs (setq +treemacs-git-mode 'extended) (setq treemacs-width 30)) ;;;;; vimrc-mode (use-package! vimrc-mode :commands vimrc-mode) (add-to-list 'auto-mode-alist '("\\.vim\\(rc\\)?\\'" . vimrc-mode)) ;;;;; vlf (use-package! vlf-setup :defer-incrementally vlf-tune vlf-base vlf-write vlf-search vlf-occur vlf-follow vlf-ediff vlf) ;;;;; wakatime (defun marty/startwakatime () "Start wakatime mode." (interactive) (setq wakatime-api-key (auth-source-pass-get 'secret "Application/wakatime/apikey")) (global-wakatime-mode)) (use-package! wakatime-mode :config (cond (IS-MAC (setq wakatime-cli-path "/usr/local/bin/wakatime-cli")) (IS-LINUX (setq wakatime-cli-path "/usr/bin/wakatime")))) (add-hook 'doom-first-buffer-hook #'marty/startwakatime) ;;;;; Whichkey (setq which-key-idle-delay 1) ;; I need the help, I really do (setq which-key-idle-secondary-delay 0.05) (setq which-key-allow-multiple-replacements t) (after! which-key (pushnew! which-key-replacement-alist '(("" . "\\`+?evil[-:]?\\(?:a-\\)?\\(.*\\)") . (nil . "◂\\1")) '(("\\`g s" . "\\`evilem--?motion-\\(.*\\)") . (nil . "◃\\1")))) ;; tell which-key to behave (setq which-key-use-C-h-commands t prefix-help-command #'which-key-C-h-dispatch) (defadvice! fix-which-key-dispatcher-a (fn &rest args) "Fix which-key Dispatcher." :around #'which-key-C-h-dispatch (let ((keys (this-command-keys-vector))) (if (equal (elt keys (1- (length keys))) ?\?) (let ((keys (which-key--this-command-keys))) (embark-bindings (seq-take keys (1- (length keys))))) (apply fn args)))) ;;;;; xeft (use-package! xeft :defer t :config (setq xeft-directory "~/Nextcloud/Notes/org") (setq xeft-database "~/.local/share/Doom/.local/cache") (setq xeft-recursive t) (map! :after xeft :map xeft-mode-map :n "C-n" #'xeft-next :n "C-p" #'xeft-previous :n "R" #'xeft-full-reindex :n "c" #'xeft-create-note :n "j" #'xeft-next :n "k" #'xeft-previous :n "r" #'xeft-refresh)) ;;;;; zeal-at-point (use-package! zeal-at-point :defer t :bind ("C-c z" . zeal-at-point) :config (add-to-list 'zeal-at-point-mode-alist '(python-mode . "python"))) ;;;; LOAD FILES (load! "functions.el") (load! "org-mode.el") (load! "mu4e.el") (load! "abbrev.el") ;;;; CUSTOM (when (file-directory-p custom-file) (message (concat "Please delete " custom-file ". And customization in config.el and +ui.el."))) (custom-set-variables '(warning-suppress-log-types '((lsp-mode) (iedit))) '(warning-suppress-types '((iedit)))) (provide 'config) ;;; config.el ends here