;;; $doomdir/config.el --- My Emacs Config File -*- lexical-binding: t; -*-
;;
;; author: Marty Buchaus <[email protected]>
;; copyright © 2022, Marty Buchaus, all rights reserved.
;;
;;; Commentary:
;;
;;; Code:
;;;; Global
(setq user-full-name "Marty Buchaus")
(setq user-mail-address "[email protected]")
(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)
;;;;;; <leader> 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)))
;; ;;;;;; <leader> b
;; (map! :leader
;; :prefix ("b")
;; "b" #'consult-buffer)
;;;;;; <leader> 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))
;;;;;; <leader> f --- file
(map! :leader
(:prefix ("f")
:desc "Search Directory FD" "/" #'+vertico/consult-fd))
;;;;;; <leader> 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)
;;;;;; <leader> n --- notes
(map! :leader
:prefix "n"
"r" #'transient-roam-jump)
;;;;;; <leader> 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
Comments
0 B
|👍
/👎
0 B
|👍
/👎