emacs config
Table of Contents
- straight.el
- general configuration
- important programs to load first
- garbage collections
- registers
- paths
- general.el (main keybindings set here)
- ivy
- all the icons and all the icons dired
- doom modeline and themes
- default emacs frame features
- themes and icons
- line numbers, fringe, hl-line
- writeroom + visual-fill-column
- which-key
- counsel
- prescient
- smartparens
- mixed-pitch
- evil-anzu (search and replace)
- avy
- clipboard (simpleclip)
- undo/redo (undofu)
- super-save
- saveplace
- yasnippet
- helpful
- rainbow-delimiters
- dired and dired-single
- lsp-mode
- evil mode
- magit
- forge
- evil nerd commenter
- projectile
- dap mode
- corfu (+ extensions)
- spellcheck (flyspell)
- eglot
- python stuff
- typescript
- company
- terminal stuff
- org mode stuff
- tags, todos, priorities
- org mode keybindings
- other function(s)
- vertico
- consult
- nix mode
- treemacs
- javascript stuff
- start page
- dashboard
- perspective
- miscellaneous settings
- deft
- popper.el
- coding stuff
- spacious padding
- org-evil
- yuck-mode
- eat
- sudo-edit
- ledger mode
- presentation mode
- rust
- fzf
straight.el
(defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" (or (bound-and-true-p straight-base-dir) user-emacs-directory))) (bootstrap-version 7)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) (straight-use-package 'use-package) (setq straight-use-package-by-default t) ; (setq use-package-always-ensure t)
general configuration
(server-start) (winner-mode 1) ;; interaction (setq use-short-answers t) ;; when emacs asks for 'yes' or 'no', let 'y' or 'n' suffice (setq confirm-kill-emacs 'yes-or-no-p) ;;confirm to quit (setq initial-major-mode 'org-mode ;; major mode of new buffers initial-scratch-message "") ;; window (setq frame-resize-pixelwise t) (setq ns-pop-up-frames nil) (setq window-resize-pixelwise nil) (setq split-width-threshold 80) (setq lik-default-line-spacing 2) (defun lik/org-setup () (org-indent-mode) ;;keeps org items like text under headings, lists, nicely indented (visual-line-mode 1) ;; nice line wrapping ; (centered-cursor-mode 1) ;; enable centered cursor mode (smartparens-mode 0) ;; disable smartparens ; (hl-prog-extra-mode) ;; highlighting with regexps (setq-local line-spacing (+ lik-default-line-spacing 2)) ;; a bit more line spacing for org mode (valign-mode) ) (defun lik/prettify-symbols-setup () ;; checkboxes (push '("[ ]" . "\u2610") prettify-symbols-alist) (push '("[X]" . "\u2611" ) prettify-symbols-alist) ;; (push '("[X]" . "\u2612" ) prettify-symbols-alist) (push '("[-]" . "\u274d" ) prettify-symbols-alist) ;; org-babel (push '("#+BEGIN_SRC" . ?\u226b) prettify-symbols-alist) (push '("#+END_SRC" . ?\u226b) prettify-symbols-alist) (push '("#+begin_src" . ?\u226b) prettify-symbols-alist) (push '("#+end_src" . ?\u226b) prettify-symbols-alist) (push '("#+BEGIN_QUOTE" . ?\u275d) prettify-symbols-alist) (push '("#+END_QUOTE" . ?\u275e) prettify-symbols-alist) ;; (push '("#+BEGIN_SRC python" . \ue928) prettify-symbols-alist) ;; This is the Python symbol. Comes up weird for some reason (push '("#+RESULTS:" . ?\u225a ) prettify-symbols-alist) ;; drawers (push '(":PROPERTIES:" . ?\uf1de) prettify-symbols-alist) ;; tags ;; (push '(":Misc:" . "\ue2c8" ) prettify-symbols-alist) (prettify-symbols-mode)) (use-package ob-nix :ensure t :defer 0 :config (require 'ob-nix)) (use-package org :hook (org-mode . lik/org-setup) :hook (org-mode . lik/prettify-symbols-setup) :hook (org-capture-mode . evil-insert-state) ;; start org-capture in insert state by default :diminish org-indent-mode :diminish visual-line-mode :config (setq org-directory "~/Documents/orgfiles") (setq org-agenda-files '("tasks.org" "birthdays.org" "social_media_planning.org" "~/org_mode_exp/example-file.org" "~/Documents/wizr/work_master.org")) (setq org-agenda-start-with-log-mode t) (setq org-log-done 'time) (setq org-log-into-drawer t) (setq org-startup-with-inline-images t) (setq org-src-fontify-natively t) (setq org-highlight-latex-and-related '(native)); highlight inline latex (setq org-startup-folded 'showeverything) (setq org-image-actual-width 300) (setq org-fontify-whole-heading-line t) (setq org-pretty-entities t) (setq org-cycle-separator-lines 1) (setq org-catch-invisible-edits 'show-and-error) ;; 'smart (setq org-src-tab-acts-natively t) ;; M-Ret can split lines on items and tables but not headlines and not on anything else (unconfigured) (setq org-M-RET-may-split-line '((headline) (item . t) (table . t) (default))) (setq org-loop-over-headlines-in-active-region nil) ;; Opens links to other org file in same frame (rather than splitting) (setq org-link-frame-setup '((file . find-file))) (setq org-log-done t org-log-into-drawer t) ;; Automatically change bullet type when indenting ;; Ex: indenting a + makes the bullet a *. (setq org-list-demote-modify-bullet '(("+" . "*") ("*" . "-") ("-" . "+"))) ;; Automatically save and close the org files I most frequently archive to. ;; I see no need to keep them open and crowding my buffer list. ;; Uses my own function jib/save-and-close-this-buffer. (dolist (file '("/home/lik/Documents/orgfiles/archive.org")) (advice-add 'org-archive-subtree-default :after (lambda () (lik/save-and-close-this-buffer file))))) ;; lines (setq truncate-lines t) (setq-default tab-width 4) (setq-default fill-column 80) (setq line-mode-visual t);; C-p, C-n, etc uses visual lines (use-package paren ;; highlight matching delimiters :straight nil :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t show-paren-when-point-inside-paren t show-paren-when-point-in-periphery t) (show-paren-mode 1)) (setq sentence-end-double-space nil) ;; sentences end with one space (setq bookmark-set-fringe-mark nil) ;; scrolling (setq scroll-conservatively 101) (setq mouse-wheel-follow-mouse 't mouse-wheel-progressive-speed nil ;; the most important setting of all! make each scroll-event move 2 lines at ;; a time (instead of 5 at default). simply hold down shift to move twice ;; fast, or hold down control to move 3x as fast. perfect for trackpads mouse-wheel-scroll-amount '(1 ((shift) . 3) ((control) . 6))) (setq visible-bell nil) (setq ring-bell-function 'ignore) ;; try really hard to keep the cursor from getting stuck in the read-only prompt ;; portion of the minibuffer (setq minibuffer-prompt-properties '(read-only t intangible t cursor-intangible t face minibuffer-prompt)) (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) ;; explicitly define a width to reduce the cost of on-the-fly computation (setq-default display-line-numbers-width 3) ;; when opening a symlink that links to a file in a git repo, edit the file ;; in the git repo so we can use the emacs vc features (like diff) in the future (setq vc-follow-symlinks t) ;; backups/lockfiles ;; don't generate backups or lockfiles (setq create-lockfiles nil make-backup-files nil ;; but in case the user does enable it, some sensible defaults version-control t backup-by-copying t delete-old-versions t kept-old-versions 5 kept-new-versions 5 backup-directory-alist (list (cons "." (concat user-emacs-directory "backup/")))) (use-package recentf :straight nil :config (setq ;;recentf-auto-cleanup 'never ;; recentf-max-menu-items 0 recentf-max-saved-items 200) (setq recentf-filename-handlers ;; show home folder path as a ~ (append '(abbreviate-file-name) recentf-filename-handlers)) (recentf-mode)) (require 'uniquify) (setq uniquify-buffer-name-style 'forward) ;; encoding (when (fboundp 'set-charset-priority) (set-charset-priority 'unicode)) (prefer-coding-system 'utf-8) (setq locale-coding-system 'utf-8) (setq blink-cursor-interval 0.6) (blink-cursor-mode 0) (setq save-interprogram-paste-before-kill t apropos-do-all t mouse-yank-at-point t) (setq what-cursor-show-names t) ;; improves C-x (setq dired-kill-when-opening-new-dired-buffer t) (setq reb-re-syntax 'string) ;; https://www.masteringemacs.org/article/re-builder-interactive-regexp-builder
important programs to load first
(tool-bar-mode -1) (defvar emacs/default-font-size 240) (add-to-list 'default-frame-alist '(font . "Agave Nerd Font Mono-24")) (menu-bar-mode -1) (tooltip-mode -1) (set-fringe-mode 10) (column-number-mode) (global-display-line-numbers-mode t) (dolist (mode '(org-mode-hook term-mode-hook eshell-mode-hook ; treemacs-mode-hook shell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("elpa" . "https://elpa.gnu.org/packages/"))) ; (require 'package) ; (package-initialize) ; (setq my-packages ; '(ivy ; counsel ; json-mode ; projectile ; cider ; clojure-mode ; expand-region ; jinja2-mode ; magit ; markdown-mode ; paredit ; wrap-region ; yaml-mode ; elpy ; json-mode ; doom-themes ; modus-themes ; all-the-icons ; all-the-icons-dired ; which-key ; ivy-rich ; helpful ; rainbow-delimiters ; evil ; evil-collection ; forge ; evil-nerd-commenter ; projectile ; counsel-projectile ; ; dap-mode ; typescript-mode ; company ; company-box ; term ; eterm-256color ; vterm ; eshell-git-prompt ; eshell ; apheleia ; pet ; lsp-ui ; doom-modeline ; org ; org-bullets ; nix-mode ; olivetti ; visual-fill-column ; page-break-lines ; nerd-icons ; ripgrep ; consult ; orderless ; marginalia ; embark ; prettier ; prettier-js ; prettier-rc ; js2-mode ; org-edna ; treemacs ; treemacs-evil ; treemacs-icons-dired ; treemacs-magit ; treemacs-persp ; treemacs-tab-bar ; treemacs-projectile)) ; (dolist (pkg my-packages) ; (unless (package-installed-p pkg) ; (package-install pkg))) ; (unless package-archive-contents ; (package-refresh-contents)) ; (unless (package-installed-p 'use-package) ; (package-install 'use-package)) ; (require 'use-package) ; (setq use-package-verbose nil) (setq standard-indent 2) (defun lik/get-project-root () (when (fboundp 'projectile-project-root) (projectile-project-root))) (global-set-key (kbd "<escape>") 'keyboard-escape-quit) (setq history-length 25) (setq savehist-autosave-interval 600) (setq history-delete-duplicates t) (global-auto-revert-mode 1)
garbage collections
(use-package gcmh :diminish gcmh-mode :config (setq gcmh-idle-delay 5 gcmh-high-cons-threshold (* 16 1024 1024)) ;16mb (gcmh-mode 1)) (add-hook 'emacs-startup-hook (lambda () (setq gc-cons-percentage 0.1))) ; default value for gc-cons-percentage
registers
(setq register-preview-delay 0);; show registers asap (setq org-directory (concat "/home/lik/Documents/" "orgfiles/")) (set-register ?i (cons 'file (concat org-directory "/home/lik/.dotfiles/config.org"))) (set-register ?w (cons 'file (concat org-directory "/home/lik/Documents/wizr/work_master.org")))
paths
(setq browse-url-firefox-program "/run/current-system/sw/bin/firefox") (setq browse-url-chrome-program "/run/current-system/sw/bin/chromium")
general.el (main keybindings set here)
(defun lik/rg () "allows you to select a folder to ripgrep" (interactive) (let ((current-prefix-arg 4)) ;;emulate C-u (call-interactively 'counsel-rg))) (defun lik/fzf () "allows you to select a folder to fzf" (interactive) (let ((current-prefix-arg '-)) ;;emulate C-u (call-interactively 'counsel-fzf))) ;; https://emacsredux.com/blog/2013/03/28/google/ (defun lik/er-google () "google the selected region if any, display a query prompt otherwise" (interactive) (browse-url (concat "http://www.google.com/search?ie=utf-8&oe=utf-8&q=" (url-hexify-string (if mark-active (buffer-substring (region-beginning) (region-end)) (read-string "google: ")))))) (defun lik/switch-to-scratch-buffer () (interactive) (switch-to-buffer "*scratch*")) (defun lik/kill-other-buffers (&optional arg) "kill all other buffers if the universal prefix argument is used then will kill the windows too" (interactive "P") (when (yes-or-no-p (format "killing all buffers except \"%s\"? " (buffer-name))) (mapc 'kill-buffer (delq (current-buffer) (buffer-list))) (when (equal '(4) arg) (delete-other-windows)) (message "buffers deleted"))) (defun spacemacs/new-wmpty-buffer () "create a new buffer called untitled (<n>)" (interactive) (let ((newbuf (generate-new-buffer-name "*scratch*"))) (switch-to-buffer newbuf))) (defun lik/listify (&optional count) "Turn the region's (or count = n lines) into an orgmode list by prepending a +." (interactive "p") (let ((lines (count-lines (region-beginning) (region-end)))) ;; By default grab a region (if (> count 1) (setq lines count)) ;; but if there was an argument, override the # of lines (save-excursion (if (use-region-p) ;; If there's a region go to the start and deactivate the region (goto-char (region-beginning)) (deactivate-mark)) (while (> lines 0) ;; Add "+ " at the beginning of each line (beginning-of-line) (insert "+ ") (forward-line) (setq lines (1- lines)))))) (fset 'lik|sublistify (kmacro-lambda-form [?A M-return tab S-right escape ?j ?0] 0 "%d")) (defun lik/copy-whole-buffer-to-clipboard () "Copy entire buffer to clipboard" (interactive) (save-excursion (mark-whole-buffer) (simpleclip-copy (point-min) (point-max)) (deactivate-mark)) (message "Copied entire buffer to clipboard")) (defun lik/toggle-maximize-buffer () "maximize buffer" (interactive) (if (and (= 1 (length (window-list))) (assoc ?_ register-alist)) (jump-to-register ?_) (progn (window-configuration-to-register ?_) (delete-other-windows)))) (defun lik/split-window-vertically-and-switch () (interactive) (split-window-vertically) (other-window 1)) (defun lik/split-window-horizontally-and-switch () (interactive) (split-window-horizontally) (other-window 1)) (defun lik/load-theme (theme) "enhance 'load-theme' by first disabling enabled themes" (mapc #'disable-theme custom-enabled-themes) (load-theme theme t)) (use-package general :config (general-create-definer rune/leader-keys :keymaps '(normal insert visual emacs) :prefix "SPC" :global-prefix "C-SPC") (rune/leader-keys "t" '(:ignore t :which-key "toggles") "tt" '(counsel-load-theme :which-key "choose theme")))
preamble
(general-define-key :states '(normal motion visual) :keymaps 'override :prefix "SPC" ;; top level functions "/" '(lik/rg :which-key "ripgrep, pick directory") "'" '(counsel-rg :which-key "ripgrep in current directory") ":" '(project-find-file :which-key "p-find-file") ";" '(lik/fzf :which-key "fzf, pick directory") "[" '(counsel-fzf :which-key "fzf in current directory") "." '(counsel-find-file :which-key "find file") "," '(counsel-recentf :which-key "recent files") "TAB" '(switch-to-prev-buffer :which-key "previous buffer") "SPC" '(counsel-find-file :which-key "M-x") "q" '(save-buffers-kill-terminal :which-key "quit emacs") "r" '(jump-to-register :which-key "registers") "c" 'org-capture
applications
;; applications "a" '(nil :which-key "applications") "ao" '(org-agenda :which-key "org-agenda") "am" '(mu4e :which-key "mu4e") "aC" '(calc :which-key "calc") "ac" '(org-capture :which-key "org-capture") "aqq" '(org-ql-view :which-key "org-ql-view") "aqs" '(org-ql-search :which-key "org-ql-search") "ab" '(nil :which-key "browse url") "abf" '(browse-url-firefox :which-key "firefox") "abc" '(browse-url-chrome :which-key "chrome") "abx" '(xwidget-webkit-browse-url :which-key "xwidget") "abg" '(lik/er-google :which-key "google search") "ad" '(dired :which-key "dired")
buffers
;; applications "b" '(nil :which-key "buffer") "bb" '(counsel-switch-buffer :which-key "switch buffer") "bd" '(evil-delete-buffer :which-key "delete buffer") "bs" '(lik/switch-to-scratch-buffer :which-key "scratch buffer") "bm" '(lik/kill-other-buffers :which-key "kill other buffers") "bi" '(clone-indirect-buffer :which-key "indirect buffer") "br" '(revert-buffer :which-key "revert-buffer")
files
;; files "f" '(nil :which-key "files") "fb" '(counsel-bookmark :which-key "bookmarks") "ff" '(counsel-find-file :which-key "find file") "fn" '(spacemacs/new-empty-buffer :which-key "new file") "fr" '(counsel-recentf :which-key "recent files") "fR" '(rename-file :which-key "rename file") "fs" '(save-buffer :which-key "save buffer") "fS" '(evil-write-all :which-key "save all buffers")
my files
"l" '(nil :which-key "likith") "lc" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/config.org")) :which-key "emacs config") "lr" '(restart-emacs :which-key "restart emacs") "lt" '((lambda() (interactive) (find-file "/home/lik/Documents/orgfiles/tasks.org")) :which-key "tasks.org") "lw" '((lambda() (interactive) (find-file "/home/lik/Documents/wizr/work_master.org")) :which-key "work_master.org") "ln" '(nil :which-key "nixos configurations") "lnx" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/configuration.nix")) :which-key "nixos") "lnh" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/home.nix")) :which-key "hm") "lns" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/sh.nix")) :which-key "shell") "lnt" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/theme.nix")) :which-key "theme") "lnw" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/waybar3.nix")) :which-key "waybar") "lnb" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/browsers.nix")) :which-key "browsers") "lnl" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/lockscreen.nix")) :which-key "lockscreen") "lng" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/wlogout.nix")) :which-key "logout") "lnv" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/neovim.nix")) :which-key "neovim") "lnp" '((lambda() (interactive) (find-file "/home/lik/.dotfiles/wallpapers.nix")) :which-key "wallpapers") "lg" '((lambda () (interactive) (find-file "/home/lik/Documents/wizr/gmail_data/aum_scraper_final.py")) :which-key "aum scraper.py") "lp" '((lambda () (interactive) (find-file "/home/lik/.dotfiles/hyprland.nix")) :which-key "hyprland.nix") "lh" '(nil :which-key "hydras") "lht" '(lik-hydra-theme-switcher/body :which-key "themes") "lhf" '(lik-hydra-variable-fonts/body :which-key "mixed-pitch-face") "lhw" '(lik-hydra-window/body :which-key "window control") "lm" '(nil :which-key "macros/custom commands") "lml" '(lik/listify :which-key "listify") "lmL" '(lik|sublistify :which-key "sublistify") "lmo" '(lik/org-temp-export-html :which-key "org temp export region") "lk" '(nil :which-key "agenda/ql") "lkq" '((lambda () (interactive) (org-ql-view "work full view")) :which-key "ql")
help/emacs
;; Help/emacs "h" '(nil :which-key "help/emacs") "hv" '(counsel-describe-variable :which-key "des. variable") "hb" '(counsel-descbinds :which-key "des. bindings") "hM" '(describe-mode :which-key "des. mode") "hf" '(counsel-describe-function :which-key "des. func") "hF" '(counsel-describe-face :which-key "des. face") "hk" '(describe-key :which-key "des. key") "hed" '((lambda () (interactive) (jump-to-register 67)) :which-key "edit dotfile") "hm" '(nil :which-key "switch mode") "hme" '(emacs-lisp-mode :which-key "elisp mode") "hmo" '(org-mode :which-key "org mode") "hmt" '(text-mode :which-key "text mode") "hp" '(nil :which-key "packages") "hpr" 'package-refresh-contents "hpi" 'package-install "hpd" 'package-delete
text
"x" '(nil :which-key "text") "xC" '(lik/copy-whole-buffer-to-clipboard :which-key "copy whole buffer to clipboard") "xr" '(anzu-query-replace :which-key "find and replace") "xs" '(yas-insert-snippet :which-key "insert yasnippet") "xf" '(flush-lines :which-key "flush-lines") "xR" '(replace-regexp :which-key "replace-regexp")
toggles/visuals
;; Toggles "t" '(nil :which-key "toggles") "tt" '(toggle-truncate-lines :which-key "truncate lines") "tv" '(visual-line-mode :which-key "visual line mode") "tn" '(display-line-numbers-mode :which-key "display line numbers") "ta" '(mixed-pitch-mode :which-key "variable pitch mode") "ty" '(counsel-load-theme :which-key "load theme") "tw" '(writeroom-mode :which-key "writeroom-mode") "tR" '(read-only-mode :which-key "read only mode") "tI" '(toggle-input-method :which-key "toggle input method") "tr" '(display-fill-column-indicator-mode :which-key "fill column indicator") "tm" '(hide-mode-line-mode :which-key "hide modeline mode")
windows
;; Windows "w" '(nil :which-key "window") "wm" '(lik/toggle-maximize-buffer :which-key "maximize buffer") "wN" '(make-frame :which-key "make frame") "wd" '(evil-window-delete :which-key "delete window") "wc" '(evil-window-delete :which-key "delete window") "w-" '(lik/split-window-vertically-and-switch :which-key "split below") "w/" '(lik/split-window-horizontally-and-switch :which-key "split right") "wr" '(lik-hydra-window/body :which-key "hydra window") "wl" '(evil-window-right :which-key "evil-window-right") "wh" '(evil-window-left :which-key "evil-window-left") "wj" '(evil-window-down :which-key "evil-window-down") "wk" '(evil-window-up :which-key "evil-window-up") "wz" '(text-scale-adjust :which-key "text zoom") ) ;; End SPC prefix block
all-mode keybindings
;; all-mode keymaps (general-def :keymaps 'override ;; emacs "M-x" 'counsel-M-x "M-s" 'evil-window-next "M-S-s" 'other-frame "C-S-B" 'counsel-switch-buffer "M-b" 'counsel-switch-buffer "s-b" 'counsel-switch-buffer ;super-b "s-o" 'lik-hydra-window/body "M-n" 'evil-normal-state ;; remapping normal help features to use counsel version "C-h v" 'counsel-describe-variable "C-h o" 'counsel-describe-symbol "C-h f" 'counsel-describe-function "C-h F" 'counsel-describe-face ;;editing "M-v" 'simpleclip-paste "M-V" 'evil-paste-after ;;shift-paste uses the internal clipboard "M-c" 'simpleclip-copy "M-u" 'capitalize-dwim ;; default is upcase-dwim "M-U" 'upcase-dwim ;; M-S-u (switch upcase and capitalize) ;; utility "C-c c" 'org-capture "C-c a" 'org-agenda "C-s" 'consult-line "s-\"" 'ispell-word ;;super-shift-' "M-=" 'count-words "C-'" 'avy-goto-char-2 "C-x C-b" 'buffer-list "s-w" 'kill-this-buffer "C-x r" 'dashboard-refresh-buffer )
non-insert mode keybindings (normal, visual, motion)
;; non-insert mode keymaps (general-def :states '(normal visual motion) "gc" 'comment-dwim "gC" 'comment-line "u" 'undo-fu-only-undo "U" 'undo-fu-only-redo "j" 'evil-next-visual-line "k" 'evil-previous-visual-line "gf" 'xah-open-file-at-cursor "f" 'evil-avy-goto-char-in-line "/" 'lik/split-window-horizontally-and-switch "-" 'lik/split-window-vertically-and-switch "\\" '(lambda () (interactive) (org-agenda nil "c")) "|" '(lambda () (interactive) (org-ql-view "columbia todo")) "]\\" '(lambda () (interactive) (org-agenda nil "w")) ) (general-def :states '(normal visual motion) :keymaps 'override "s" 'consult-line "?" 'evil-search-forward)
insert mode keymaps
;; insert keymaps ;; many of these are emulating standard emacs bindings in evil insert mode, such as C-a, or C-e (general-def :states '(insert) "C-a" 'evil-beginning-of-visual-line "C-e" 'evil-end-of-visual-line "C-S-a" 'evil-beginning-of-line "C-S-e" 'evil-end-of-line "C-n" 'evil-next-visual-line "C-p" 'evil-previous-visual-line )
emacs mode keymaps
(general-def :keymaps 'emacs "C-w C-q" 'kill-this-buffer )
ivy
(use-package ivy :demand t :diminish ivy-mode :config (setq ivy-extra-directories nil) ;; Hides . and .. directories (setq ivy-initial-inputs-alist nil) ;; Removes the ^ in ivy searches (setq ivy-re-builders-alist '((t . ivy--regex-ignore-order))) (setq ivy-height 12) (setq ivy-fixed-height-minibuffer t) (setq ivy-use-virtual-buffers t) (setq ivy-use-selectable-prompt t) (setq counsel-find-file-at-point t) (setq ivy-count-format "(%d%d) ") (add-to-list 'ivy-height-alist '(counsel-M-x . 7)) ;; Don't need so many lines for M-x, I usually know what command I want (ivy-mode 1) ;; Shows a preview of the face in counsel-describe-face (add-to-list 'ivy-format-functions-alist '(counsel-describe-face . counsel--faces-format-function)) :general (general-define-key ;; Also put in ivy-switch-buffer-map b/c otherwise switch buffer map overrides and C-k kills buffers :keymaps '(ivy-minibuffer-map ivy-switch-buffer-map) "S-SPC" 'nil "C-SPC" 'ivy-restrict-to-matches ;; Default is S-SPC, changed this b/c sometimes I accidentally hit S-SPC ;; C-j and C-k to move up/down in Ivy "C-k" 'ivy-previous-line "C-j" 'ivy-next-line) ) ;; Nice icons in Ivy. Replaces all-the-icons-ivy. (use-package all-the-icons-ivy-rich :init (all-the-icons-ivy-rich-mode 1) :config (setq all-the-icons-ivy-rich-icon-size 1.0)) (use-package ivy-rich :after ivy counsel :init (setq ivy-rich-path-style 'abbrev) (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line) :config (ivy-rich-mode 1))
all the icons and all the icons dired
doom modeline and themes
(setq display-time-default-load-average nil) (line-number-mode) (column-number-mode) (display-time-mode -1) (use-package hide-mode-line :commands (hide-mode-line-mode)) ; (use-package doom-modeline ; ; :init (doom-modeline-mode 1) ; :custom ((doom-modeline-height 15))) (use-package doom-modeline :config (doom-modeline-mode) (setq doom-modeline-buffer-file-name-style 'relative-from-project doom-modeline-enable-word-count nil doom-modeline-buffer-encoding nil doom-modeline-icon t doom-modeline-modal-icon t doom-modeline-major-mode-icon t doom-modeline-major-mode-color-icon nil doom-modeline-buffer-state-icon nil doom-modeline-bar-width 3 doom-modeline-height 15))
default emacs frame features
(setq frame-inhibit-implied-resize t)
(add-to-list 'default-frame-alist '(tool-bar-lines . 0))
(add-to-list 'default-frame-alist '(menu-bar-lines . 0))
(add-to-list 'default-frame-alist '(vertical-scroll-bars))
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
themes and icons
(use-package all-the-icons :if (display-graphic-p) :commands all-the-icons-install-fonts :init (unless (find-font (font-spec :name "all-the-icons")) (all-the-icons-install-fonts t))) (use-package all-the-icons-dired :if (display-graphic-p) :hook (dired-mode . all-the-icons-dired-mode)) (use-package doom-themes :after mixed-pitch :init (load-theme 'doom-tomorrow-night t) :config (doom-themes-visual-bell-config) (doom-themes-org-config) :custom-face (org-ellipsis ((t (:height 0.8 :inherit 'shadow)))) (org-scheduled-previously ((t (:background "red"))))) (use-package kaolin-themes :config (setq kaolin-themes-modeline-border nil)) ;; disable underline for org deadline warnings ; (org-warning ((t (:underline nil)))) ;; darkens the org-ellipses (first unset the color, then give it shadow) ; (org-ellipsis ((t (:foreground unspecified :height 0.8 :inherit 'shadow))))) (use-package modus-themes :init (setq modus-themes-italic-constructs nil modus-themes-bold-constructs t modus-themes-region '(bg-only no-extend) modus-themes-hl-line '(intense) ;;accented or intense modus-themes-syntax '(yellow-comments) modus-themes-org-blocks 'gray-background modus-themes-mode-line '(moody borderless)) ;; mody or accented (setq modus-themes-headings (quote ((1 . (variable-pitch 1.1 rainbow)) (2 . (regular)) (3 . (regular)) (4 . (regular)) (t . (rainbow)) ))) ; (modus-themes-load-themes) :custom-face (org-ellipsis ((t (:height 0.8 :inherit 'shadow))))) (use-package ef-themes :init (setq ef-themes-headings (quote ((1 . (variable-pitch 1.1)) (2 . (regular)) (3 . (regular)) (4 . (regular))))) :custom-face (org-scheduled-today ((t (:inherit org-level-3))))) ;; loading theme based on the time
line numbers, fringe, hl-line
(setq-default fringes-outside-margins nil) (setq-default indicate-buffer-boundaries nil) ;;otherwise shows a corner icon on the edge (setq-default indicate-empty-lines nil) ;;otherwise there are weird fringes on blank lines (set-face-attribute 'fringe nil :background nil) (set-face-attribute 'header-line nil :background nil :inherit 'default) (add-hook 'prog-mode-hook 'hl-line-mode) (add-hook 'prog-mode-hook 'display-line-numbers-mode)
writeroom + visual-fill-column
(use-package visual-fill-column :defer t :config (setq visual-fill-column-center-text t) (setq visual-fill-column-width 100) (setq visual-fill-column-center-text t)) (use-package writeroom-mode :defer t :config (setq writeroom-maximize-window nil writeroom-mode-line t writeroom-global-effects nil writeroom-extra-line-spacing 3) (setq writeroom-width visual-fill-column-width))
which-key
(use-package which-key :init (which-key-mode) (which-key-setup-minibuffer) :diminish which-key-mode :config (setq which-key-idle-delay 1) (setq which-key-prefix-prefix "◉ ") (setq which-key-sort-order 'which-key-key-order-alpha which-key-min-display-lines 3 which-key-max-display-columns nil))
counsel
(defvar lik/home (concat (getenv "HOME") "/") "my home directory") (use-package counsel :bind ( ("C-x C-b" . ivy-switch-buffer) ("C-x b" . ivy-switch-buffer) ("M-r" . counsel-ag) ("C-x C-d" . counsel-dired) ("C-x d" . counsel-dired) ) :diminish :config (setq default-directory lik/home) (setq counsel-switch-buffer-preview-virtual-buffers nil) ;; Removes recentfiles/bookmarks from counsel-switch-buffer (setq counsel-find-file-ignore-regexp (concat ;; That weird Icon? file in Dropbox. "\\(Icon\ \\)" ;; Hides file names beginning with # or . "\\|\\(?:\\`[#.]\\)")) ;; emacs regexp notes: had to put \\| before the second regexp to make this work ;; Sorts counsel-recentf in order of time last accessed (add-to-list 'ivy-sort-functions-alist '(counsel-recentf . file-newer-than-file-p)) (add-to-list 'recentf-exclude (expand-file-name "projectile-bookmarks.eld" user-emacs-directory)) ;; Use fd (setq find-program "fd") (setq counsel-file-jump-args (split-string "-L --type f -H")) ;; follow symlinks, files, show hidden (global-set-key [remap org-set-tags-command] #'counsel-org-tag) :general (general-define-key :keymaps 'counsel-find-file-map "C-c f" 'counsel-file-jump-from-find) ;; when in counsel-find-file, run this to search the whole directory recursively ) (use-package swiper :bind(("M-C-s" . swiper))) (use-package ivy-hydra)
prescient
(use-package prescient :config (setq-default history-length 1000) (setq-default prescient-history-length 1000) ;; More prescient history (prescient-persist-mode +1)) ;; Use `prescient' for Ivy menus. (use-package ivy-prescient :after ivy :config ;; don't prescient sort these commands (dolist (command '(org-ql-view counsel-find-file fontaine-set-preset)) (setq ivy-prescient-sort-commands (append ivy-prescient-sort-commands (list command)))) (ivy-prescient-mode +1)) ;; (use-package company-prescient ;; :defer 2 ;; :after company ;; :config ;; (company-prescient-mode +1))
smartparens
(use-package smartparens :ensure t :diminish smartparens-mode :defer 1 :config (progn (require 'smartparens-config) (smartparens-global-mode 1) (show-paren-mode t)) ;; Load default smartparens rules for various languages (require 'smartparens-config) (setq sp-max-prefix-length 25) (setq sp-max-pair-length 4) (setq sp-highlight-pair-overlay nil sp-highlight-wrap-overlay nil sp-highlight-wrap-tag-overlay nil) (with-eval-after-load 'evil (setq sp-show-pair-from-inside t) (setq sp-cancel-autoskip-on-backward-movement nil) (setq sp-pair-overlay-keymap (make-sparse-keymap))) (let ((unless-list '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p))) (sp-pair "'" nil :unless unless-list) (sp-pair "\"" nil :unless unless-list)) ;; In lisps ( should open a new form if before another parenthesis (sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p)) ;; Don't do square-bracket space-expansion where it doesn't make sense to (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) "[" nil :post-handlers '(:rem ("| " "SPC"))) (dolist (brace '("(" "{" "[")) (sp-pair brace nil :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) ;; Don't autopair opening braces if before a word character or ;; other opening brace. The rationale: it interferes with manual ;; balancing of braces, and is odd form to have s-exps with no ;; whitespace in between, e.g. ()()(). Insert whitespace if ;; genuinely want to start a new form in the middle of a word. :unless '(sp-point-before-word-p sp-point-before-same-p))) (smartparens-global-mode t))
mixed-pitch
(use-package mixed-pitch :defer t :config (setq mixed-pitch-set-height nil) (dolist (face '(org-date org-priority org-tag org-special-keyword)) (add-to-list 'mixed-pitch-fixed-pitch-faces face)))
evil-anzu (search and replace)
(use-package evil-anzu :defer t)
avy
(use-package avy :defer t :config (setq avy-case-fold-search nil))
clipboard (simpleclip)
(use-package simpleclip :config (simpleclip-mode 1)) ;; allows pasting in minibuffer with M-v (defun lik/paste-in-minibuffer () (local-set-key (kbd "M-v") 'simpleclip-paste)) (add-hook 'minibuffer-setup-hook 'lik/paste-in-minibuffer)
undo/redo (undofu)
(use-package undo-fu)
super-save
(use-package super-save :diminish super-save-mode :defer 2 :config (setq super-save-auto-save-when-idle t super-save-idle-duration 5 ;; after 5 seconds of not typing autosave super-save-triggers ;; Functions after which buffers are saved (switching window, for example) '(evil-window-next evil-window-prev balance-windows other-window next-buffer previous-buffer) super-save-max-buffer-size 10000000) (super-save-mode +1)) ;; After super-save autosaves, wait __ seconds and then clear the buffer. I don't like ;; the save message just sitting in the echo area. (defun lik-clear-echo-area-timer () (run-at-time "2 sec" nil (lambda () (message " ")))) (advice-add 'super-save-command :after 'lik-clear-echo-area-timer)
saveplace
(use-package saveplace :init (setq save-place-limit 100) :config (save-place-mode))
yasnippet
(defvar lik/emacs-stuff "/home/lik/Documents/" "directory where personal emacs files are kept") (use-package yasnippet :diminish yas-minor-mode :defer 5 :config (setq yas-snippet-dirs (list (expand-file-name "snippets" lik/emacs-stuff))) (yas-global-mode 1)) ;; or M-x yas-reload-all if you've started YASnippet already. ;; Silences the warning when running a snippet with backticks (runs a command in the snippet) (require 'warnings) (add-to-list 'warning-suppress-types '(yasnippet backquote-change))
helpful
(use-package helpful :custom (counsel-describe-function-function #'helpful-callable) (counsel-describe-variable-function #'helpful-variable) :bind ([remap describe-function] . counsel-describe-function) ([remap describe-command] . helpful-command) ([remap describe-variable] . counsel-describe-variable) ([remap describe-key] . helpful-key))
rainbow-delimiters
(use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (global-set-key (kbd "C-M-j") 'counsel-switch-buffer) ; (global-set-key (kbd "C-M-k") 'dw/switch-to-browser-buffer) (global-set-key (kbd "C-x C-f") 'counsel-find-file) (global-set-key (kbd "C-x C-z") 'counsel-fzf)
dired and dired-single
(use-package dired :straight nil :commands (dired dired-find-file) :bind (("C-x C-j" . dired-find-file)) :custom ((dired-listing-switches "-agho --group-directories-first"))) (use-package dired-single :commands (dired dired-jump)) (use-package dired-open :commands (dired dired-jump) :config (setq dired-open-extensions '(("png" . "feh") ("mkv" . "mpv")))) (use-package dired-hide-dotfiles :hook (dired-mode . dired-hide-dotfiles-mode) :config (evil-collection-define-key 'normal 'dired-mode-map "H" 'dired-hide-dotfiles-mode)) (setq gc-cons-threshold (* 2 1000 1000))
lsp-mode
(setq gc-cons-threshold 100000000) (setq read-process-output-max (* 1024 1024)) (use-package lsp-mode :hook ((python-mode js-mode) . lsp-deferred) :commands lsp :config (setq lsp-ui-doc-enable nil) (setq lsp-ui-doc-show-with-cursor nil) (setq lsp-ui-doc-show-with-mouse nil) (setq lsp-lens-enable nil) (setq lsp-headerline-breadcrumb-enable t) (setq lsp-ui-sideline-enable nil) (setq lsp-ui-sideline-show-code-actions nil) (setq lsp-ui-sideline-enable nil) (setq lsp-ui-sideline-show-hover nil) (setq lsp-modeline-code-actions-enable nil) (setq lsp-diagnostics-provider :none) (setq lsp-ui-sideline-enable nil) (setq lsp-ui-sideline-show-diagnostics nil) (setq lsp-eldoc-enable-hover nil) (setq lsp-modeline-diagnostics-enable nil) (setq lsp-signature-auto-activate nil) (setq lsp-signature-render-documentation nil) (setq lsp-completion-provider :none) (setq lsp-completion-show-detail nil) (setq lsp-completion-show-kind nil) ) ; (use-package lsp-ui ; :commands lsp-ui-mode ; :config ; (setq lsp-ui-doc-enable nil) ; (setq lsp-ui-doc-header t) ; (setq lsp-ui-doc-include-signature t) ; (setq lsp-ui-doc-border (face-foreground 'default)) ; (setq lsp-ui-sideline-show-code-actions t) ; (setq lsp-ui-sideline-delay 0.005)) ; (use-package lsp-pyright ; :hook (python-mode . (lambda () (require 'lsp-pyright))) ; :init (when (executable-find "python") ; (setq lsp-pyright-python-executable-cmd "python")))
evil mode
(use-package evil :init (setq evil-want-integration t) (setq evil-want-keybinding nil) (setq evil-want-C-u-scroll t) (setq evil-want-C-i-jump nil) (setq evil-want-fine-undo t) (setq evil-want-Y-yank-to-eol t) :config (evil-set-initial-state 'dashboard-mode 'motion) (evil-set-initial-state 'debugger-mode 'motion) (evil-set-initial-state 'pdf-view-mode 'motion) (evil-set-initial-state 'buffer-list-mode 'emacs) (evil-set-initial-state 'inferior-python-mode 'emacs) (evil-set-initial-state 'term-mode 'emacs) (evil-set-initial-state 'calc-mode 'emacs) (define-key evil-insert-state-map (kbd "C-b") 'evil-normal-state) (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) (define-key evil-window-map "\C-q" 'evil-delete-buffer) ;;maps C-w C-q to evil-delete-buffer (the first C-w puts you into evil-window-map) (define-key evil-window-map "\C-w" 'kill-this-buffer) (define-key evil-motion-state-map "\C-b" 'evil-scroll-up) ;;makes C-b how C-u is (define-key evil-motion-state-map [?\s-\\] 'evil-execute-in-emacs-state) ;; super-\ by default it's just \ (evil-global-set-key 'motion "j" 'evil-next-visual-line) (evil-global-set-key 'motion "k" 'evil-previous-visual-line) (evil-set-initial-state 'messages-buffer-mode 'normal) (evil-set-initial-state 'dashboard-mode 'normal) (setq evil-emacs-state-cursor '("#649bce" box)) (setq evil-normal-state-cursor '("#d9a871" box)) (setq evil-visual-state-cursor '("#677691" box)) (setq evil-insert-state-cursor '("#eb998b" (bar . 2))) (setq evil-replace-state-cursor '("#eb998b" hbar)) (setq evil-motion-state-cursor '("#ad8beb" box)) (evil-mode 1)) (use-package evil-surround :after evil :defer 2 :config (global-evil-surround-mode 1)) (use-package evil-collection :after evil :init (evil-collection-init)) (evil-define-key 'motion help-mode-map "q" 'kill-this-buffer) (evil-define-key 'motion calendar-mode-map "q" 'kill-this-buffer)
magit
(use-package magit :commands (magit-status magit-get-current-branch) :custom (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) (global-set-key (kbd "C-M-;") 'magit-status)
forge
(use-package forge :after magit)
evil nerd commenter
(use-package evil-nerd-commenter :bind ("M-/" . evilnc-comment-or-uncomment-lines))
projectile
(use-package projectile :diminish projectile-mode :config (projectile-mode) :custom ((projectile-completion-system 'ivy)) :bind ("C-M-p" . projectile-find-file) :bind-keymap ("C-c p" . projectile-command-map) :init (when (file-directory-p "~/Documents") (setq projectile-project-search-path '("~/Documents"))) (setq projectile-switch-project-action #'projectile-dired)) (use-package counsel-projectile :disabled :after projectile :config (counsel-projectile-mode))
dap mode
(use-package hydra :defer t) (defhydra hydra-text-scale (:timeout 4) "scale text" ("j" text-scale-increase "in") ("k" text-scale-decrease "out") ("f" nil "finished" :exit t)) (rune/leader-keys "ts" '(hydra-text-scale/body :which-key "scale text")) (defhydra lik-hydra-variable-fonts (:pre (mixed-pitch-mode 0) :post (mixed-pitch-mode 1)) ("t" (set-face-attribute 'variable-pitch nil :family "Times New Roman" :height 160) "Times New Roman") ("g" (set-face-attribute 'variable-pitch nil :family "EB Garamond" :height 160 :weight 'normal) "EB Garamond") ("n" (set-face-attribute 'variable-pitch nil :slant 'normal :weight 'normal :height 160 Lwidth 'normal :foundry "nil" :family "Nunito") "Nunito") ) (defhydra lik-hydra-theme-switcher (:hint nil) " Dark ^Light^ ---------------------------------------------- _1_ one _z_ one-light _2_ vivendi _x_ operandi _3_ molokai _c_ lik-plain _4_ snazzy _v_ flatwhite _5_ old-hope _b_ tomorrow-day _6_ henna ^ _7_ kaolin-galaxy ^ _8_ peacock ^ _9_ lik-plain-dark ^ _0_ monokai-machine ^ _-_ xcode ^ _q_ quit ^ ^ ^ " ;; Dark ("1" (lik/load-theme 'doom-one) "one") ("2" (lik/load-theme 'modus-vivendi) "modus-vivendi") ("3" (lik/load-theme 'doom-molokai) "molokai") ("4" (lik/load-theme 'doom-snazzy) "snazzy") ("5" (lik/load-theme 'doom-old-hope) "old-hope") ("6" (lik/load-theme 'doom-henna) "henna") ("7" (lik/load-theme 'kaolin-galaxy) "kaolin-galaxy") ("8" (lik/load-theme 'doom-peacock) "peacock") ("9" (lik/load-theme 'jake-doom-plain-dark) "jake-plain-dark") ("0" (lik/load-theme 'doom-monokai-machine) "monokai-machine") ("-" (lik/load-theme 'doom-xcode) "xcode") ;; Light ("z" (lik/load-theme 'doom-one-light) "one-light") ("x" (lik/load-theme 'modus-operandi) "modus-operandi") ("c" (lik/load-theme 'jake-doom-plain) "jake-plain") ("v" (lik/load-theme 'doom-flatwhite) "flatwhite") ("b" (lik/load-theme 'doom-opera-light) "tomorrow-day") ("q" nil)) ;; all-in-one window management. makes use of some custom functions ;; 'ace-window' (for swapping), 'windmove' (could probably be replaced ;; by evil?) and 'windresize' ;; inspired by https://github.com/jmercouris/configuration/blob/master/.emacs.d/hydra.el#L86 (defhydra lik-hydra-window (:hint nil) " Movement ^Split^ ^Switch^ ^Resize^ ---------------------------------------------------------------- _M-<left>_ < _/_ vertical _b_uffer _<left>_ < _M-<right>_ > _-_ horizontal _f_ind file _<down>_ ↓ _M-<up>_ ↑ _m_aximize _s_wap _<up>_ ↑ _M-<down>_ ↓ _c_lose _[_backward _<right>_ > _q_uit _e_qualize _]_forward ^ ^ ^ _K_ill ^ ^ ^ ^ ^ " ;; Movement ("M-<left>" windmove-left) ("M-<down>" windmove-down) ("M-<up>" windmove-up) ("M-<right>" windmove-right) ;; Split/manage ("-" lik/split-window-vertically-and-switch) ("/" lik/split-window-horizontally-and-switch) ("c" evil-window-delete) ("d" evil-window-delete) ("m" delete-other-windows) ("e" balance-windows) ;; Switch ("b" counsel-switch-buffer) ("f" counsel-find-file) ("P" project-find-file) ("s" ace-swap-window) ("[" previous-buffer) ("]" next-buffer) ("K" kill-this-buffer) ;; Resize ("<left>" windresize-left) ("<right>" windresize-right) ("<down>" windresize-down) ("<up>" windresize-up) ("q" nil)) (defhydra lik-hydra-org-table () " _c_ insert col _v_ delete col Move col: _h_, _l_ _r_ insert row _d_ delete row Move row: _j_, _k_ _n_ create table _i_ create hline _u_ undo _q_ quit " ("n" org-table-create "create table") ("r" org-table-insert-row "insert row") ("c" org-table-insert-column "insert col") ("v" org-table-delete-column "delete col") ("d" org-table-kill-row "delete row") ("i" org-table-insert-hline "hline") ("u" undo-fu-only-undo "undo") ("h" org-table-move-column-left "move col left") ("l" org-table-move-column-right "move col right") ("k" org-table-move-row-up "move row up") ("j" org-table-move-row-down "move row down") ("<left>" org-table-previous-field) ("<right>" org-table-next-field) ("<up>" previous-line) ("<down>" org-table-next-row) ("q" nil "quit"))
corfu (+ extensions)
(use-package corfu :init (global-corfu-mode) :config (setq corfu-auto t corfu-echo-documentation t corfu-scroll-margin 0 corfu-count 8 corfu-max-width 50 corfu-min-width corfu-max-width corfu-auto-prefix 2) ;; Make Evil and Corfu play nice ; (evil-make-overriding-map corfu-map) ; (advice-add 'corfu--setup :after 'evil-normalize-keymaps) ; (advice-add 'corfu--teardown :after 'evil-normalize-keymaps) (corfu-history-mode 1) (savehist-mode 1) (add-to-list 'savehist-additional-variables 'corfu-history) (defun corfu-enable-always-in-minibuffer () (setq-local corfu-auto nil) (corfu-mode 1)) (add-hook 'minibuffer-setup-hook #'corfu-enable-always-in-minibuffer 1) :general (:keymaps 'corfu-map :states 'insert "C-n" 'corfu-next "C-p" 'corfu-previous "C-j" 'corfu-next "C-k" 'corfu-previous "RET" 'corfu-complete "<escape>" 'corfu-quit )) (use-package cape :init (add-to-list 'completion-at-point-functions #'cape-file) (add-to-list 'completion-at-point-functions #'cape-keyword) ;; kinda confusing re length, WIP/TODO ;; :hook (org-mode . (lambda () (add-to-list 'completion-at-point-functions #'cape-dabbrev))) ;; :config ;; (setq dabbrev-check-other-buffers nil ;; dabbrev-check-all-buffers nil ;; cape-dabbrev-min-length 6) ) (use-package kind-icon :config (setq kind-icon-default-face 'corfu-default) (setq kind-icon-default-style '(:padding 0 :stroke 0 :margin 0 :radius 0 :height 0.9 :scale 1)) (setq kind-icon-blend-frac 0.08) (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter) (add-hook 'counsel-load-theme #'(lambda () (interactive) (kind-icon-reset-cache))) (add-hook 'load-theme #'(lambda () (interactive) (kind-icon-reset-cache))))
spellcheck (flyspell)
;; "Enable Flyspell mode, which highlights all misspelled words. " (use-package flyspell :defer t :config (add-to-list 'ispell-skip-region-alist '("~" "~")) (add-to-list 'ispell-skip-region-alist '("=" "=")) (add-to-list 'ispell-skip-region-alist '("^#\\+BEGIN_SRC" . "^#\\+END_SRC")) (add-to-list 'ispell-skip-region-alist '("^#\\+BEGIN_EXPORT" . "^#\\+END_EXPORT")) (add-to-list 'ispell-skip-region-alist '("^#\\+BEGIN_EXPORT" . "^#\\+END_EXPORT")) (add-to-list 'ispell-skip-region-alist '(":\\(PROPERTIES\\|LOGBOOK\\):" . ":END:")) (dolist (mode '( ;;org-mode-hook mu4e-compose-mode-hook)) (add-hook mode (lambda () (flyspell-mode 1)))) (setq flyspell-issue-welcome-flag nil flyspell-issue-message-flag nil) :general ;; Switches correct word from middle click to right click (general-define-key :keymaps 'flyspell-mouse-map "<mouse-3>" #'ispell-word "<mouse-2>" nil) (general-define-key :keymaps 'evil-motion-state-map "zz" #'ispell-word) ) ;; (use-package flyspell-correct ;; :after flyspell ;; :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))) ;; (use-package flyspell-correct-ivy ;; :after flyspell-correct)
eglot
(use-package eglot :bind (:map eglot-mode-map ("C-c d" . eldoc) ("C-c a" . eglot-code-actions) ; ("C-c f" . flymake-show-buffer-diagnostics) ("C-c r" . eglot-rename))) (desktop-save-mode 1) (use-package highlight-indent-guides :hook (python-ts-mode . highlight-indent-guides-mode) :config (set-face-foreground 'highlight-indent-guides-character-face "white") (setq highlight-indent-guides-method 'character)) ; (use-package eglot ; :hook (python-base-mode . eglot-ensure) ; :custom (eglot-autopshutdown t))
python stuff
;; (use-package python ;; :bind (:map python-ts-mode-map ;; ("<f5>" . recompile) ;; ("<f6>" . eglot-format)) ;; :hook ((python-ts-mode . eglot-ensure) ;; (python-ts-mode . company-mode)) ;; :mode (("\\.py\\'" . python-ts-mode))) ;; (use-package python-mode :defer t) ;; (general-define-key :states '(emacs) :keymaps 'inferior-python-mode-map ;; "<up>" 'comint-previous-input ;; "<down>" 'comint-next-input) (use-package python-mode :ensure t :hook (python-mode . lsp-deferred) :custom (dap-python-debugger 'debugpy) :config (require 'dap-python))
typescript
; (use-package typescript-mode ; :mode "\\.ts\\'" ; :hook (typescript-mode .lsp-deferred) ; :config ; (setq typescript-indent-level 2))
company
(use-package company :after lsp-mode :hook (lsp-mode . company-mode) :bind (:map company-active-map ("<tab>" . company-complete-selection)) (:map lsp-mode-map ("<tab>" . company-indent-or-complete-common)) :custom (company-minimum-prefix-length 1) (company-idle-delay 0.5)) (use-package company-box :hook (company-mode . company-box-mode)) (use-package company-prescient :after company :config (company-prescient-mode 1))
terminal stuff
(use-package term :commands term :config (setq explicit-shell-file-name "fish")) (use-package eterm-256color :hook (term-mode . eterm-256color-mode)) (use-package vterm :commands vterm :config (setq vterm-shell "fish") (setq vterm-max-scrollback 10000)) (defun efs/configure-eshell () (add-hook 'eshell-pre-command-hook 'eshell-save-some-history) (add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer) (evil-define-key '(normal insert visual) eshell-mode-map (kbd "C-r") 'counsel-esh-history) (evil-define-key '(normal insert visual) eshell-mode-map (kbd "<home>") 'eshell-bol) (evil-normalize-keymaps) (setq eshell-history-size 10000 eshell-buffer-maximum-lines 10000 eshell-hist-ignoredups t eshell-scroll-to-bottom-on-input t)) (use-package eshell-git-prompt :after eshell) (use-package eshell :hook (eshell-first-time-mode . efs/configure-eshell) :config (with-eval-after-load 'esh-opt (setq eshell-destroy-buffer-when-process-dies t) (setq eshell-visual-commands '("htop" "zsh" "vim"))) (eshell-git-prompt-use-theme 'powerline))
org mode stuff
(use-package org-super-agenda :after org :config (setq org-super-agenda-header-map nil) ;; takes over 'j' (add-hook 'org-agenda-mode-hook #'(lambda () (setq-local nobreak-char-display nil))) (org-super-agenda-mode)) (use-package org-superstar :config (setq org-superstar-leading-bullet " ") (setq org-superstar-special-todo-items t) ;; makes todo header bullets into boxes (setq org-superstar-todo-bullet-alist '(("TODO" . 9744) ("IN PROGRESS" . 9744) ("WAITING" . 9744) ("DONE" . 9745) ("BACKLOG" . 9744) ("PLAN" . 9744) ("READY" . 9744) ("ACTIVE" . 9744) ("REVIEW" . 9744) ("WAIT" . 9744) ("HOLD" . 9744) ("COMPLETED" . 9745) ("CANC" . 9745)))) (setq org-blank-before-new-entry '((heading . nil) (plain-list-item . nil))) (defun efs/org-mode-setup () (org-indent-mode) (variable-pitch-mode 1) (auto-fill-mode 0) (visual-line-mode 1) (setq evil-auto-indent nil)) (defun efs/org-font-setup () (font-lock-add-keywords 'org-mode '(("^ *\\([-]\\) " (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) (dolist (face '((org-level-1 . 1.2) (org-level-2 . 1.1) (org-level-3 . 1.05) (org-level-4 . 1.0) (org-level-5 . 1.1) (org-level-6 . 1.1) (org-level-7 . 1.1) (org-level-8 . 1.1))) (set-face-attribute (car face) nil :font "Cantarell" :weight 'regular :height (cdr face))) (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch)) (defface lik-read '((t (:foreground "MediumPurple2"))) "custom face for highlighting read" :group 'lik) (defun lik/save-and-close-this-buffer (buffer) "Saves and closes given buffer." (if (get-buffer buffer) (let ((b (get-buffer buffer))) (save-buffer b) (kill-buffer b)))) (defun lik/post-org-goto () (let ((current-prefix-arg '(4))) ;; emulate C-u (call-interactively 'org-reveal)) (org-cycle) (advice-add 'counsel-org-goto :after #'lik/post-org-goto) (advice-add 'org-agenda-goto :after #'lik/post-org-goto) (advice-add 'org-agenda-switch-to :after #'lik/post-org-goto)) ; (efs/org-font-setup)) (use-package org-bullets :after org :hook (org-mode . org-bullets-mode) :custom (org-bullets-bullet-list '("◉" "○" "○" "○")))
tags, todos, priorities
tags
(setq org-tags-column -1)
todo/workflow states
(setq org-todo-keywords '((sequence "BACKLOG(b)" "TODO(t)" "IN PROGRESS(p)" "WAITING(w)" "|" "DONE(d!)") ; (sequence "BACKLOG(b)" "PLAN(l)" "READY(r)" "ACTIVE(a)" "REVIEW(v)" "WAIT(w@/!)" "HOLD(h)" "|" "COMPLETED(c)" "CANC(k@)") (sequence "PLANNING(l)" "SHOT(s)" "EDITING(e)" "THUMBNAIL(m)" "|" "UPLOADED(u)" "PUBLISHED(b)"))) (setq org-todo-faces '(("TODO" :inherit (region org-todo) :foreground "DarkOrange1" :weight bold) ("PLANNING" :inherit (region org-todo) :foreground "DarkOrange1" :weight bold) ("IN PROGRESS" :inherit (org-todo region) :foreground "DarkOrange1" :weight bold) ("SHOT" :inherit (org-todo-region) :foreground "DarkOrange1" :weight bold) ("WAITING" :inherit (org-todo-region) :foreground "MediumPurple2" :weight bold) ("EDITING" :inherit (org-todo-region) :foreground "MediumPurple2" :weight bold) ("BACKLOG" :inherit (org-todo-region) :foreground "orange3" :weight bold) ("THUMBNAIL" :inherit (org-todo-region) :foreground "orange3" :weight bold) ("UPLOADED" . "SeaGreen4") ("PUBLISHED" . "SeaGreen4") ("DONE" . "SeaGreen4")))
priorities
(setq org-lowest-priority ?F) ;;gives us priorities A through F (setq org-default-priority ?E) (setq org-priority-faces '((65 . "red2") (66 . "Gold1") (67 . "Goldenrod2") (68 . "PaleTurquoise3") (69 . "DarkSlateGray4") (70 . "PaleTurquoise4")))
org babel
(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (python . t) (eshell . t) (shell . t) (gnuplot . t) (sed . t) (awk . t) (clojure . t) (css . t) (java . t) (latex . t) (lua . t) (lisp . t) ; (ledger . t) (makefile . t) (js . t) (org . t) (perl . t) (nix . t) (sql . t))) (use-package gnuplot :defer t) ;; don't prompt before running code in org (setq org-confirm-babel-evaluate nil) (setq python-shell-completion-native-enable nil) ;; how to open buffer when calling 'org-edit-special' (setq org-src-window-setup 'current-window)
org mode tagging stuff
workflow states
(setq org-refile-targets '(("~/Documents/orgfiles/archive.org" :maxlevel . 1) ("~/Documents/orgfiles/tasks.org" :maxlevel . 1))) (advice-add 'org-refile :after 'org-save-all-org-buffers)
tags
(setq org-tag-alist '((:startgroup) ; put mutually exclusive tags here (:endgroup) ("errand" . ?E) ("home" . ?H) ("work" . ?W) ("agenda" . ?a) ("planning" . ?p) ("publish" . ?P) ("batch" . ?b) ("note" . ?n) ("idea" . ?i) ("thinking" . ?t) ("recurring" . ?r)))
org mode agenda views
(setq org-time-stamp-custom-formats '("<%A, %B %d, %Y" . "<%m/%d.%y %a %I:%M %p>")) (setq org-agenda-restore-windows-after-quit t) (setq org-agenda-window-setup 'current-window) ;; only show upcoming deadlines for the next X days. by default it shows ;; 14 days into the future, which seems excessive (setq org-deadline-warning-days 3) ;; if something is done, don't show its deadline (setq org-agenda-skip-deadline-if-done t) ;; if something is done, don't show when it's scheduled for (setq org-agenda-skip-scheduled-if-done t) ;; if something is scheduled, don't tell me it is sue soon (setq org-agenda-skip-deadline-prewarning-if-scheduled t) ;; use am-pm and not 24 hour time (setq org-agenda-timegrid-use-ampm t) (setq org-agenda-time-grid nil) (setq org-agenda-block-separator ?-) (setq org-agenda-prefix-format '((agenda . "%-12:T%?-12t% s") (todo . " %i %-12:c") (tags . " %i %-12:c") (search . " %i %-12:c"))) (setq org-agenda-deadline-leaders '("deadline: " "in %2d d.: " "%2d d. ago: ")) (add-hook 'org-agenda-mode-hook #'(lambda () (setq-local line-spacing 3))) (add-hook 'org-agenda-mode-hook #'(lambda () (hide-mode-line-mode))) ; (setq org-agenda-custom-commands nil) ; (setq org-agenda-hide-tags-regexp "\\(ec\\|lit\\|sci\\|edu\\|ds\\|calc3\\)") (defvar lik-org-agenda-columbia-productivity-super-groups '((:name "personal stuff" :tag "p" :order 10) (:name "extracurricular" :tag "ec" :order 5) (:name "todo" :todo ("TODO") :order 3) (:name "heads up" :todo ("WAITING" "BACKLOG") :tag "lt" :order 4) (:discard (:todo t)))) (defvar lik-org-columbia-productivity-ql-query '(and (not (tags "defer")) (not (scheduled)) ;; rationale --- if it's scheduled i don't need the heads-up (or (effort 1) (todo "WAITING" "BACKLOG") (and (todo) (tags "p" "ec" "lt"))))) ;; day view (add-to-list 'org-agenda-custom-commands '("c" "columbia day view" ((agenda "" ((org-agenda-overriding-header "columbia productivity view") (org-agenda-span 'day) (org-agenda-sorting-strategy '(scheduled-up deadline-up priority-down)) (org-super-agenda-groups '( (:name "today:" :scheduled t :order 2) (:name "deadlines:" :deadline t :order 3) (:name "today's schedule:" :time-grid t :discard (:deadline t) :order 1))))) (org-ql-block lik-org-columbia-productivity-ql-query ((org-ql-block-header "productivity overview:") (org-super-agenda-groups lik-org-agenda-columbia-productivity-super-groups)))))) ;; day view no agenda (add-to-list 'org-agenda-custom-commands '("v" "columbia day view no agenda" (org-ql-block '(todo) ((org-super-agenda-groups (push '(:name "today's tasks" ;; lik-org-super-agenda-school-groups, with this added on :scheduled today :deadline today) lik-org-agenda-columbia-productivity-super-groups)))))) (add-to-list 'org-agenda-custom-commands '("d" "dashboard" ((agenda "" ((org-deadline-warning-days 7))) (todo "NEXT" ((org-agenda-overriding-header "next tasks"))) (tags-todo "agenda/ACTIVE" ((org-agenda-overriding-header "active projects")))))) (add-to-list 'org-agenda-custom-commands '("n" "next tasks" ((todo "NEXT" ((org-agenda-overriding-header "next tasks")))))) (add-to-list 'org-agenda-custom-commands '("W" "work tasks" tags-todo "+work")) (add-to-list 'org-agenda-custom-commands '("e" "low-effort tasks" tags-todo "+TODO=\"NEXT\"+effort<15&+effort>0" ((org-agenda-overriding-header "low effort tasks") (org-agenda-max-todos 20) (org-agenda-files org-agenda-files)))) (add-to-list 'org-agenda-custom-commands '("w" "workflow status" ((todo "WAIT" ((org-agenda-files org-agenda-files))) (todo "REVIEW" ((org-agenda-overriding-header "in review") (org-agenda-files org-agenda-files))) (todo "PLAN" ((org-agenda-overriding-header "in planning") (org-agenda-todo-list-sublevels nil) (org-agenda-files org-agenda-files))) (todo "BACKLOG" ((org-agenda-overriding-header "project backlog") (org-agenda-todo-list-sublevels nil) (org-agenda-files org-agenda-files))) (todo "READY" ((org-agenda-overriding-header "ready for work") (org-agenda-files org-agenda-files))) (todo "ACTIVE" ((org-agenda-overriding-header "active projects") (org-agenda-files org-agenda-files))) (todo "COMPLETED" ((org-agenda-overriding-header "completed projects") (org-agenda-files org-agenda-files))) (todo "CANC" ((org-agenda-overriding-header "cancelled projects") (org-agenda-files org-agenda-files)))))) (add-to-list 'org-agenda-custom-commands '("f" "columbia four-day view" ((agenda "" ((org-agenda-span 4) (org-agenda-entry-types '(:deadline :scheduled)) (org-agenda-start-on-weekday nil) (org-deadline-warning-days 0))) (org-ql-block lik-org-columbia-productivity-ql-query ((org-ql-block-header "productivity overview:") (org-super-agenda-groups lik-org-agenda-columbia-productivity-super-groups)))))) (add-to-list 'org-agenda-custom-commands '("q" "columbia ten-day view" ((agenda "" ((org-agenda-span 10) (org-agenda-entry-types '(:deadline :scheduled)) (org-agenda-start-on-weekday nil) (org-deadline-warning-days 0))))))
other org mode stuff
(use-package org-appear :commands (org-appear-mode) :hook (org-mode . org-appear-mode) :init (setq org-hide-emphasis-markers t ;; a default setting that needs to be t for org-appear org-appear-autoemphasis t ;; enable org-appear on emphasis (bold, italics, etc) org-appear-autolinks nil ;;don't enable on links org-appear-autosubmarkers t)) ;; enable on subscript and superscript (use-package ox-reveal :defer 5) (setq org-reveal-root "https://revealjs.com/") (setq org-modules '(org-habit)) (setq org-habit-preceding-days 6 org-habit-following-days 6 org-habit-show-habits-only-for-today nil org-habit-today-glyph ?\u235f ;;|| org-habit-completed-glyph ?\u2713 org-habit-graph-column 40) (eval-after-load 'org '(org-load-modules-maybe t)) (use-package org-ql :defer t :general (general-define-key :keymaps 'org-ql-view-map "q" :kill-buffer-and-window) ) (use-package org-preview-html :defer t :config (setq org-preview-html-viewer 'xwidget)) (use-package org-modern :hook (org-mode . org-modern-mode) :config (setq org-modern-star '("◉" "○" "●" "○") org-modern-list '((42 . "○") (43 . "●") (45 . "-")) org-modern-tag nil org-modern-priority nil org-modern-todo nil org-modern-table nil)) (use-package evil-org :diminish evil-org-mode :after org :config (add-hook 'org-mode-hook 'evil-org-mode) (add-hook 'evil-org-mode-hook (lambda () (evil-org-set-key-theme)))) (require 'evil-org-agenda) (evil-org-agenda-set-keys) (org-add-link-type "color" (lambda (path) (message (concat "color " (progn (add-text-properties 0 (length path) (list 'face `((t (:foreground, path)))) path) path)))) (lambda (path desc format) (cond ((eq format 'html) (format "<span style=\"color:%s;\">%s</span>" path desc)) ((eq format 'latex) (format "{\\color{%s}%s}" path desc))))) (use-package org-special-block-extras :ensure t :hook (org-mode . org-special-block-extras-mode) :custom (o-defblock src (lang nil) (title nil exports nil file nil) "Fold-away all \u2018src\u2019 blocks as \u2018<details>\u2019 HTML export. If a block has a \u2018:title\u2019, use that to title the \u2018<details>\u2019." (format "<details> <summary> %s </summary> <pre> %s </pre></details>" (or title (concat "Details; " lang)) raw-contents))) (use-package olivetti :demand t :bind (("<f9>" . ews-distraction-free))) (defun ews-distraction-free () (interactive) (if (equal olivetti-mode nil) (progn (window-configuration-to-register 1) (delete-other-windows) (text-scale-set 2) (olivetti-mode t)) (progn (if (eq (length (window-list)) 1) (jump-to-register 1)) (olivetti-mode 0) (text-scale-set 0)))) (require 'org-tempo) (add-to-list 'org-structure-template-alist '("sh" . "src shell")) (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) (add-to-list 'org-structure-template-alist '("py" . "src python"))
org roam
(use-package emacsql) (use-package org-roam :init (setq org-roam-v2-ack t) :custom (org-roam-directory "~/Documents/roamnotes") (org-roam-completion-everywhere t) (org-roam-capture-templates '(("d" "default" plain "%?" :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+date: %U\n") :unnarrowed t) ("m" "Team Meeting" plain "\n* Minutes\n\n%?" :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+date: %U\n#+filetags:work") :unnarrowed t))) (org-roam-dailies-capture-templates '(("d" "default" entry "* %<%I:%M %p>: %?" :if-new (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n")) ("j" "journal" entry "* %<%I:%M %p>: %?" :if-new (file+head "journal/%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d> journal \n")) ("m" "meeting" entry "* %<%I:%M %p>: %?" :if-new (file+head "meetings/%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d> meeting \n")))) :bind (("C-c n l" . org-roam-buffer-toggle) ("C-c n f" . org-roam-node-find) ("C-c n i" . org-roam-node-insert) :map org-mode-map ("C-M-i" . completion-at-point) :map org-roam-dailies-map ("Y" . org-roam-dailies-capture-yesterday) ("T" . org-roam-dailies-capture-tomorrow)) :bind-keymap ("C-c n d" . org-roam-dailies-map) :config (require 'org-roam-dailies) (org-roam-setup) (setq org-roam-dailies-directory "daily/") (org-roam-db-autosync-mode))
treemacs emacs openwith modern emacs UI
vertico selectrum marginalia
org-edna
for task dependencies
(straight-use-package 'org-edna) (org-edna-mode)
org-fragtog
(use-package org-fragtog :hook (org-mdoe . org-fragtog-mode) :config (setq org-latex-create-formula-image-program 'dvisvgm) ;; sharper (plist-put org-format-latex-options :scale 1.5)) ;; bigger
org-tree-slide
(use-package org-tree-slide :defer t :config (setq org-tree-slide-slide-in-effect nil org-tree-slide-skip-outline-level 3))
org-download
(defun lik/emacs-clipboard-to-system-clipboard () "set system clipboard to contents of emacs kill ring" (interactive) (simpleclip-set-contents (substring-no-properties (nth 0 kill-ring)))) (defun lik/system-clipboard-to-emacs-clipboard () "set emacs kill ring to contents of system clipboard" (interactive) (kill-new (simpleclip-get-contents))) (use-package org-download :defer 2 :config (setq org-download-method 'attach) (advice-add 'org-download-yank :before 'lik/system-clipboard-to-emacs-clipboard))
valign
(use-package valign :defer t)
org mode keybindings
;; https://www.reddit.com/r/emacs/comments/8qm1lb/new_orgcountwords_command/ (defun ap/org-forward-to-entry-content (&optional unsafe) "Skip headline, planning line, and all drawers in current entry. If UNSAFE is non-nil, assume point is on headline." (unless unsafe ;; To improve performance in loops (e.g. with `org-map-entries') (org-back-to-heading)) (cl-loop for element = (org-element-at-point) for pos = (pcase element (`(headline . ,_) (org-element-property :contents-begin element)) (`(,(or 'planning 'property-drawer 'drawer) . ,_) (org-element-property :end element))) while pos do (goto-char pos))) (defun ap/org-count-words () "If region is active, count words in it; otherwise count words in current subtree." (interactive) (if (use-region-p) (funcall-interactively #'count-words-region (region-beginning) (region-end)) (org-with-wide-buffer (cl-loop for (lines words characters) in (org-map-entries (lambda () (ap/org-forward-to-entry-content 'unsafe) (let ((end (org-entry-end-position))) (list (count-lines (point) end) (count-words (point) end) (- end (point))))) nil 'tree) sum lines into total-lines sum words into total-words sum characters into total-characters finally do (message "Subtree \"%s\" has %s lines, %s words, and %s characters." (org-get-heading t t) total-lines total-words total-characters))))) (defun lik/org-done-keep-todo () "mark an org todo item as done while keeping its former keyword intact, and archive. for example, * TODO this item becomes * DONE TODO this item" (interactive) (let ((state (org-get-todo-state)) (tag (org-get-tags)) (todo (org-entry-get (point "TODO")) post-command-hook) (if (not (eq state nil)) (progn (org-back-to-heading) (org-todo "DONE") (org-set-tags tag) (beginning-of-line) (forward-word) (insert (concat " " todo))) (user-error "not a todo")) (run-hooks 'post-command-hook)))) (defun lik/org-done-keep-todo-and-archive () "Same as `lik/org-done-keep-todo' but archives heading as well." (interactive) (let ((state (org-get-todo-state)) (tag (org-get-tags)) (todo (org-entry-get (point) "TODO")) post-command-hook) (if (not (eq state nil)) (progn (org-back-to-heading) (org-todo "DONE") (org-set-tags tag) (beginning-of-line) (forward-word) (insert (concat " " todo)) (org-archive-subtree-default)) (user-error "Not a TODO.")) (run-hooks 'post-command-hook))) (defun lik/org-archive-ql-search () "Input or select a tag to search in my archive files." (interactive) (let* ((choices '("bv" "sp" "ch" "cl" "es" "Robotics ec" "Weekly ec")) ;; TODO get these with org-current-tag-alist (tag (completing-read "Tag: " choices))) (org-ql-search ;; Recursively get all .org_archive files from my archive directory (directory-files-recursively (expand-file-name "org-archive" org-directory) ".org_archive") ;; Has the matching tags (can be a property or just a tag) and is a todo - done or not `(and (or (property "ARCHIVE_ITAGS" ,tag) (tags ,tag)) (or (todo) (done)))))) (setq org-special-ctrl-a/e t) (general-def :states 'normal :keymaps 'org-mode-map "t" 'org-todo "<return>" 'org-open-at-point-global "K" 'org-shiftup "J" 'org-shiftdown "<f5>" 'org-ctrl-c-ctrl-c) (general-def :states 'insert :keymaps 'org-mode-map "C-o" 'evil-org-open-above "S-<left>" 'org-shiftleft "S-<right>" 'org-shiftright) (general-def :keymaps 'org-mode-map "M-[" 'org-metaleft "M-]" 'org-metaright "C-M-=" 'ap/org-count-words "C-M-r" 'org-refile "M-k" 'org-insert-link "C-c t" 'lik/org-done-keep-todo) ;; Org-src - when editing an org source block (general-def :prefix "," :states 'normal :keymaps 'org-src-mode-map "b" '(nil :which-key "org src") "bc" 'org-edit-src-abort "bb" 'org-edit-src-exit)
org mode comma leader key setup
(defun lik/org-schedule-tomorrow () "org schedule for tomorrow (+1d)" (interactive) (org-schedule t "+1d")) (defun lik/org-refile-this-file () "Org refile to only headers in current file, 5 levels." (interactive) (let ((org-refile-targets '((nil . (:maxlevel . 5))))) (org-refile))) (defun lik/org-set-startup-visibility () "Allows `org-set-startup-visibility' to be used interactively. (it's not an interactive function)" (interactive) (org-set-startup-visibility) (goto-char (point-min))) (defun lik/org-copy-link-to-clipboard () "Copy orgmode link to clipboard (simpleclip)." (interactive) (let ((context (org-element-context))) (if (eq (org-element-type context) 'link) (simpleclip-set-contents (org-element-property :raw-link context)) (user-error "Not a link")))) (defun lik/org-occur-unchecked-boxes (&optional arg) "Show unchecked Org Mode checkboxes. Ignore items with a `\u2020' at EOL unless run with C-u." (interactive "P") (if (equal '(4) arg) (occur "\\[ \\].*\u2020$") (occur "\\[ \\].*[^\u2020]$"))) (defmacro spacemacs|org-emphasize (fname char) "Make function for setting the emphasis in org mode" `(defun ,fname () (interactive) (org-emphasize ,char))) (general-define-key :prefix "," :states '(normal motion) :keymaps '(org-mode-map) "" nil "A" '(org-archive-subtree-default :which-key "org-archive") ;;"a" '(org-agenda :which-key "org agenda") ;;"6" '(org-sort :which-key "sort") ;;"c" '(org-capture :which-key "org-capture") ;;"s" '(org-schedule :which-key "schedule") ;; "S" '(lik/org-schedule-tomorrow :which-key "schedule tmrw") ;;"d" '(org-deadline :which-key "deadline") "g" '(counsel-org-goto :which-key "goto heading") "t" '(counsel-org-tag :which-key "set tags") ;;"p" '(org-set-property :which-key "set property") "r" '(lik/org-refile-this-file :which-key "refile in file") ;;"e" '(org-export-dispatch :which-key "export org") "," '(lik/org-set-startup-visibility :which-key "startup visibility") ; "." '(org-toggle-narrow-to-subtree :which-key "toggle narrow to subtree") "H" '(org-html-convert-region-to-html :which-key "convert region to html") "C" '(lik/org-copy-link-to-clipboard :which-key "copy link to clipboard") "=" '(ap/org-count-words :which-key "ap/org-count-words") "o" '(nil :which-key "org") "oa" '(org-agenda :which-key "org agenda") "oc" '(org-sort :which-key "org sort") "os" '(org-schedule :which-key "org schedule") "oS" '(lik/org-schedule-tomorrow :which-key "schedule tmrw") "od" '(org-deadline :which-key "org deadline") "op" '(org-set-property :which-key "set property") "o6" '(org-sort :which-key "sort") "oe" '(org-export-dispatch :which-key "org export") "o." '(org-toggle-narrow-to-subtree :which-key "toggle narrow to subtree") "or" '(lik/org-refile-this-file :which-key "refile in file") "1" '(org-toggle-link-display :which-key "toggle link display") "2" '(org-toggle-inline-images :which-key "toggle images") "3" '(lik/org-occur-unchecked-boxes :which-key "occur unchecked boxes") "b" '(nil :which-key "babel") "bt" '(org-babel-tangle :which-key "org-babel-tangle") "bb" '(org-edit-special :which-key "org-edit-special") "bc" '(org-edit-src-abort :which-key "org-edit-src-abort") "bk" '(org-babel-remove-result-one-or-many :which-key "org-babel-remove-result-one-or-many") "x" '(nil :which-key "text") "xb" (spacemacs|org-emphasize spacemacs|org-bold ?*) "xb" (spacemacs|org-emphasize spacemacs|org-bold ?*) "xc" (spacemacs|org-emphasize spacemacs|org-code ?~) "xi" (spacemacs|org-emphasize spacemacs|org-italic ?/) "xs" (spacemacs|org-emphasize spacemacs|org-strike-through ?+) "xu" (spacemacs|org-emphasize spacemacs|org-underline ?_) "xv" (spacemacs|org-emphasize spacemacs|org-verbose ?~) ;; I realized that ~~ is the same and better than == (Github won't do ==) ;; insert "i" '(nil :which-key "insert") "il" '(org-insert-link :which-key "org-insert-link") "l" '(org-insert-link :which-key "org-insert-link") ;; More convenient access "iL" '(counsel-org-link :which-key "counsel-org-link") "it" '(lik-hydra-org-table/body :which-key "tables") "is" '(nil :which-key "insert stamp") "iss" '((lambda () (interactive) (call-interactively (org-time-stamp-inactive))) :which-key "org-time-stamp-inactive") "isS" '((lambda () (interactive) (call-interactively (org-time-stamp nil))) :which-key "org-time-stamp") ;; clocking "c" '(nil :which-key "clocking") "ci" '(org-clock-in :which-key "clock in") "co" '(org-clock-out :which-key "clock out") "cj" '(org-clock-goto :which-key "jump to clock") ) ;; Org-agenda (general-define-key :prefix "," :states '(normal motion) :keymaps '(org-agenda-mode-map) "" nil "a" '(org-agenda :which-key "org agenda") "c" '(org-capture :which-key "org-capture") "s" '(org-agenda-schedule :which-key "schedule") "," '(org-agenda-schedule :which-key "schedule") ;; quick access "d" '(org-agenda-deadline :which-key "deadline") "t" '(org-agenda-set-tags :which-key "set tags") ;; clocking "c" '(nil :which-key "clocking") "ci" '(org-agenda-clock-in :which-key "clock in") "co" '(org-agenda-clock-out :which-key "clock out") "cj" '(org-clock-goto :which-key "jump to clock") ) (evil-define-key 'motion org-agenda-mode-map (kbd "f") 'org-agenda-later (kbd "b") 'org-agenda-earlier)
org exporting
;; (setq org-export-backends '(ascii beamer html latex md odt)) (setq org-export-with-broken-links t org-export-with-smart-quotes t org-export-allow-bind-keywords t) ;; from https://stackoverflow.com/questions/23297422/org-mode-timestamp-format-when-exported (defun org-export-filter-timestamp-remove-brackets (timestamp backend info) "removes relevant brackets from timestamp" (cond ((org-export-derived-backend-p backend 'latex) (replace-regexp-in-string "[<>]\\|[][]" "" timestamp)) ((org-export-derived-backend-p backend 'html) (replace-regexp-in-string "&[lg]t;\\|[][]" "" timestamp)))) ;; html specific (setq org-html-validation-link nil) ;; no validation button on html exports ;; latex specific (eval-after-load 'ox '(add-to-list 'org-export-filter-timestamp-functions 'org-export-filter-timestamp-remove-backets)) (use-package ox-hugo :defer 2 :after ox :config (setq org-hugo-base-dir "~/Documents/orgfiles")) ; (use-package ox-moderncv ; :straight nil ; :init (require 'ox-moderncv))
latex classes
(setq org-latex-listings t) (setq org-latex-compiler "lualatex") (setq org-preview-latex-default-process 'dvisvgm) ;; (setq org-latex-compiler "xelatex") ;;xelatex rather than pdflatex ;; latex classes (with-eval-after-load 'ox-latex (add-to-list 'org-latex-classes '("org-plain-latex" "\\documentclass{extarticle} [NO_DEFAULT_PACKAGES] [PACKAGES] [EXTRA]" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
misc org mode
(setq org-clock-mode-line-total 'current) ;; show only timer from current clock session in modeline (setq org-clock-clocked-in-display 'both) (setq org-attach-id-dir ".org-attach/" org-attach-use-inheritance t)
other function(s)
(defun efs/read-file-as-string (path) (with-temp-buffer (insert-file-contents path) (buffer-string))) (push '("conf-unix" . conf-unix) org-src-lang-modes)
vertico
(defun dw/minibuffer-backward-kill (arg) "When minibuffer is completing a file name delete up to parent folder, otherwise delete a character backward" (interactive "p") (if minibuffer-completing-file-name ;; Borrowed from https://github.com/raxod502/selectrum/issues/498#issuecomment-803283608 (if (string-match-p "/." (minibuffer-contents)) (zap-up-to-char (- arg) ?/) (delete-minibuffer-contents)) (delete-backward-char arg))) ;; Enable vertico (use-package vertico :bind (:map minibuffer-local-map ("<backspace>" . dw/minibuffer-backward-kill)) :custom ;; (vertico-scroll-margin 0) ;; Different scroll margin ;; (vertico-count 20) ;; Show more candidates ;; (vertico-resize t) ;; Grow and shrink the Vertico minibuffer ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' (keymap-set vertico-map "?" #'minibuffer-completion-help) (keymap-set vertico-map "M-TAB" #'minibuffer-complete) :init (vertico-mode)) ;; Persist history over Emacs restarts. Vertico sorts by history position. (use-package savehist :init (savehist-mode)) (use-package marginalia :after vertico :ensure t :custom (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) :init (marginalia-mode)) ;; A few more useful configurations... (use-package emacs :custom ;; Support opening new minibuffers from inside existing minibuffers. (enable-recursive-minibuffers t) ;; Hide commands in M-x which do not work in the current mode. Vertico ;; commands are hidden in normal buffers. This setting is useful beyond ;; Vertico. (read-extended-command-predicate #'command-completion-default-include-p) :init ;; Add prompt indicator to `completing-read-multiple'. ;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma. (defun crm-indicator (args) (cons (format "[CRM%s] %s" (replace-regexp-in-string "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" "" crm-separator) (car args)) (cdr args))) (advice-add #'completing-read-multiple :filter-args #'crm-indicator) ;; Do not allow the cursor in the minibuffer prompt (setq minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt)) (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)) (use-package orderless :custom ;; Configure a custom style dispatcher (see the Consult wiki) ;; (orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch)) ;; (orderless-component-separator #'orderless-escapable-split-on-space) (completion-styles '(orderless basic)) (completion-category-defaults nil) (completion-category-overrides '((file (styles partial-completion))))) (setq completion-styles '(basic substring partial-completion flex)) (setq read-file-name-completion-ignore-case t read-buffer-completion-ignore-case t completion-ignore-case t) (setq completion-in-region-function (lambda (&rest args) (apply (if vertico-mode #'consult-completion-in-region) args))) (use-package vertico-directory :after vertico :straight nil ;; More convenient directory navigation commands :bind (:map vertico-map ("RET" . vertico-directory-enter) ("DEL" . vertico-directory-delete-char) ("M-DEL" . vertico-directory-delete-word)) ;; Tidy shadowed file names :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) (vertico-multiform-mode) ;; Configure the display per command. ;; Use a buffer with indices for imenu ;; and a flat (Ido-like) menu for M-x. (setq vertico-multiform-commands '((consult-imenu buffer indexed) (execute-extended-command unobtrusive))) ;; Configure the display per completion category. ;; Use the grid display for files and a buffer ;; for the consult-grep commands. (setq vertico-multiform-categories '((file grid) (consult-grep buffer))) (setq vertico-multiform-commands `((consult-outline buffer ,(lambda (_) (text-scale-set -1))))) ;; Change the default sorting function. ;; See `vertico-sort-function' and `vertico-sort-override-function'. (setq vertico-multiform-commands '((describe-symbol (vertico-sort-function . vertico-sort-alpha)))) (setq vertico-multiform-categories '((symbol (vertico-sort-function . vertico-sort-alpha)) (file (vertico-sort-function . sort-directories-first)))) ;; Sort directories before files (defun sort-directories-first (files) (setq files (vertico-sort-history-length-alpha files)) (nconc (seq-filter (lambda (x) (string-suffix-p "/" x)) files) (seq-remove (lambda (x) (string-suffix-p "/" x)) files))) ;; Configure the buffer display and the buffer display action (setq vertico-multiform-categories '((consult-grep buffer (vertico-buffer-display-action . (display-buffer-same-window))))) ;; Disable preview for consult-grep commands (setq vertico-multiform-categories '((buffer flat (vertico-cycle . t))))
consult
(use-package consult ;; Replace bindings. Lazily loaded by `use-package'. :bind (;; C-c bindings in `mode-specific-map' ("C-c M-x" . consult-mode-command) ("C-c h" . consult-history) ("C-c k" . consult-kmacro) ("C-c m" . consult-man) ("C-c i" . consult-info) ([remap Info-search] . consult-info) ;; C-x bindings in `ctl-x-map' ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command ("C-x b" . consult-buffer) ;; orig. switch-to-buffer ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer ;; Custom M-# bindings for fast register access ("M-#" . consult-register-load) ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) ("C-M-#" . consult-register) ;; Other custom bindings ("M-y" . consult-yank-pop) ;; orig. yank-pop ;; M-g bindings in `goto-map' ("M-g e" . consult-compile-error) ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck ("M-g g" . consult-goto-line) ;; orig. goto-line ("M-g M-g" . consult-goto-line) ;; orig. goto-line ("M-g o" . consult-outline) ;; Alternative: consult-org-heading ("M-g m" . consult-mark) ("M-g k" . consult-global-mark) ("M-g i" . consult-imenu) ("M-g I" . consult-imenu-multi) ;; M-s bindings in `search-map' ("M-s d" . consult-find) ;; Alternative: consult-fd ("M-s c" . consult-locate) ("M-s g" . consult-grep) ("M-s G" . consult-git-grep) ("M-s r" . consult-ripgrep) ("C-s" . consult-line) ("M-s L" . consult-line-multi) ("M-s k" . consult-keep-lines) ("M-s u" . consult-focus-lines) ;; Isearch integration ("M-s e" . consult-isearch-history) :map isearch-mode-map ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string ("M-s l" . consult-line) ;; needed by consult-line to detect isearch ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch ;; Minibuffer history :map minibuffer-local-map ("M-s" . consult-history) ;; orig. next-matching-history-element ("M-r" . consult-history)) ;; orig. previous-matching-history-element ;; Enable automatic preview at point in the *Completions* buffer. This is ;; relevant when you use the default completion UI. :hook (completion-list-mode . consult-preview-at-point-mode) ;; The :init configuration is always executed (Not lazy) :init ;; Optionally configure the register formatting. This improves the register ;; preview for `consult-register', `consult-register-load', ;; `consult-register-store' and the Emacs built-ins. (setq register-preview-delay 0.5 register-preview-function #'consult-register-format) ;; Optionally tweak the register preview window. ;; This adds thin lines, sorting and hides the mode line of the window. (advice-add #'register-preview :override #'consult-register-window) ;; Use Consult to select xref locations with preview (setq xref-show-xrefs-function #'consult-xref xref-show-definitions-function #'consult-xref) ;; Configure other variables and modes in the :config section, ;; after lazily loading the package. :config ;; Optionally configure preview. The default value ;; is 'any, such that any key triggers the preview. ;; (setq consult-preview-key 'any) ;; (setq consult-preview-key "M-.") ;; (setq consult-preview-key '("S-<down>" "S-<up>")) ;; For some commands and buffer sources it is useful to configure the ;; :preview-key on a per-command basis using the `consult-customize' macro. (consult-customize consult-theme :preview-key '(:debounce 0.2 any) consult-ripgrep consult-git-grep consult-grep consult-buffer consult-bookmark consult-recent-file consult-xref consult--source-bookmark consult--source-file-register consult--source-recent-file consult--source-project-recent-file :preview-key 'any) ;; :preview-key "M-.":preview-key 'any) ;; Optionally configure the narrowing key. ;; Both < and C-+ work reasonably well. (setq consult-narrow-key "<") ;; "C-+" ;; Optionally make narrowing help available in the minibuffer. ;; You may want to use `embark-prefix-help-command' or which-key instead. ;; (keymap-set consult-narrow-map (concat consult-narrow-key " ?") #'consult-narrow-help) )
nix mode
; (use-package nix-mode ; :mode ("\\.nix\\'")) ; (use-package org-nix-shell ; :straight '(org-nix-shell ; :type git ; :host github ; :repo "AntonHakansson/org-nix-shell") ; :hook (org-mode . org-nix-shell-mode))
(use-package nix-mode :mode ("\\.nix\\'" "\\.nix.in\\'"))
treemacs
; (use-package treemacs ; :defer t ; ; :init ; (with-eval-after-load 'winum ; (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) ; :config ; (progn ; (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) ; treemacs-deferred-git-apply-delay 0.5 ; treemacs-directory-name-transformer #'identity ; treemacs-display-in-side-window t ; treemacs-eldoc-display 'simple ; treemacs-file-event-delay 2000 ; treemacs-file-extension-regex treemacs-last-period-regex-value ; treemacs-file-follow-delay 0.2 ; treemacs-file-name-transformer #'identity ; treemacs-follow-after-init t ; treemacs-expand-after-init t ; treemacs-find-workspace-method 'find-for-file-or-pick-first ; treemacs-git-command-pipe "" ; treemacs-goto-tag-strategy 'refetch-index ; treemacs-header-scroll-indicators '(nil . "^^^^^^") ; treemacs-hide-dot-git-directory t ; treemacs-indentation 2 ; treemacs-indentation-string " " ; treemacs-is-never-other-window nil ; treemacs-max-git-entries 5000 ; treemacs-missing-project-action 'ask ; treemacs-move-files-by-mouse-dragging t ; treemacs-move-forward-on-expand nil ; treemacs-no-png-images nil ; treemacs-no-delete-other-windows t ; treemacs-project-follow-cleanup nil ; treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory) ; treemacs-position 'left ; treemacs-read-string-input 'from-child-frame ; treemacs-recenter-distance 0.1 ; treemacs-recenter-after-file-follow nil ; treemacs-recenter-after-tag-follow nil ; treemacs-recenter-after-project-jump 'always ; treemacs-recenter-after-project-expand 'on-distance ; treemacs-litter-directories '("/node_modules" "/.venv" "/.cask") ; treemacs-project-follow-into-home nil ; treemacs-show-cursor nil ; treemacs-show-hidden-files t ; treemacs-silent-filewatch nil ; treemacs-silent-refresh nil ; treemacs-sorting 'alphabetic-asc ; treemacs-select-when-already-in-treemacs 'move-back ; treemacs-space-between-root-nodes t ; treemacs-tag-follow-cleanup t ; treemacs-tag-follow-delay 1.5 ; treemacs-text-scale nil ; treemacs-user-mode-line-format nil ; treemacs-user-header-line-format nil ; treemacs-wide-toggle-width 70 ; treemacs-width 35 ; treemacs-width-increment 1 ; treemacs-width-is-initially-locked t ; treemacs-workspace-switch-cleanup nil) ;; The default width and height of the icons is 22 pixels. If you are ;; using a Hi-DPI display, uncomment this to double the icon size. ;;(treemacs-resize-icons 44) ; (treemacs-follow-mode t) ; (treemacs-filewatch-mode t) ; (treemacs-fringe-indicator-mode 'always) ; (when treemacs-python-executable ; (treemacs-git-commit-diff-mode t)) ; (pcase (cons (not (null (executable-find "git"))) ; (not (null treemacs-python-executable))) ; (`(t . t) ; (treemacs-git-mode 'deferred)) ; (`(t . _) ; (treemacs-git-mode 'simple))) ; (treemacs-hide-gitignored-files-mode nil)) ; :bind ; (:map global-map ; ("M-0" . treemacs-select-window) ; ("C-x t 1" . treemacs-delete-other-windows) ; ("C-x t t" . treemacs) ; ("C-x t d" . treemacs-select-directory) ; ("C-x t B" . treemacs-bookmark) ; ("C-x t C-t" . treemacs-find-file) ; ("C-x t M-t" . treemacs-find-tag))) ; (use-package treemacs-evil ; :after (treemacs evil) ; ) ; ; (use-package treemacs-projectile ; :after (treemacs projectile) ; ) ; (use-package treemacs-icons-dired ; :hook (dired-mode . treemacs-icons-dired-enable-once) ; ) ; (use-package treemacs-magit ; :after (treemacs magit) ; ) ; ; (use-package treemacs-tab-bar ;;treemacs-tab-bar if you use tab-bar-mode ; :after (treemacs) ; :config (treemacs-set-scope-type 'Tabs)) ; (treemacs-start-on-boot)
javascript stuff
(setq js-indent-level 2)
start page
; (setq initial-buffer-choice "~/.emacs.d/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 "C-u 1") '(lambda () (interactive) (find-file "~/.dotfiles/config.org")) ; (kbd "C-u 2") '(lambda () (interactive) (find-file "~/.dotfiles/config.el"))) ; map)) ; (add-hook 'start-mode-hook 'org-mode) ; (add-hook 'start-mode-hook 'read-only-mode) ; (add-hook 'start-mode-hook (lambda () (org-display-inline-images t))) ; (provide 'start-mode) ; (add-hook mode (lambda () (display-line-numbers-mode 0))))
dashboard
(use-package dashboard :config (setq initial-buffer-choice (lambda () (get-buffer-create dashboard-buffer-name))) (dashboard-setup-startup-hook) (setq dashboard-banner-logo-title "welcome to emacs") (setq dashboard-startup-banner 'logo) (setq dashboard-center-content t) (setq dashboard-vertically-center-content t) (setq dashboard-items '((recents . 3) (bookmarks . 5) (agenda . 3))) (setq dashboard-agenda-sort-strategy '(time-up habit-down priority-down category-keep)) (setq dashboard-agenda-time-string-format "%d-%m %a"))
perspective
(use-package perspective :bind ( ("C-x k" . persp-kill-buffer*) ("C-x C-b" . persp-list-buffers) ("C-x x s" . persp-switch) ("C-x x n" . persp-next) ("C-x x p" . persp-prev) ("C-x x a" . persp-add-buffer) ("C-x x A" . persp-set-buffer) ("C-x x k" . persp-remove) ("C-x x c" . persp-kill) ("C-x x C" . persp-kill-others)) :custom (persp-mode-prefix-key (kbd "C-z")) :init (persp-mode))
miscellaneous settings
(global-display-line-numbers-mode) (add-to-list 'safe-local-variable-values '(org-roam-directory . "~/Documents/wizr/meetingnotes")) (add-to-list 'safe-local-variable-values '(org-roam-db-location . "~/Documents/wizr/meetingnotes/org-roam.db")) (use-package unfill :defer t) (use-package burly :defer t) (use-package burly :defer t) (use-package ace-window :defer t) (use-package centered-cursor-mode :diminish centered-cursor-mode) (use-package restart-emacs :defer t) (use-package diminish) (use-package bufler :config (setq bufler-filter-buffer-modes nil ;; Don't hide so many buffers bufler-filter-buffer-name-regexps nil) (setf bufler-groups (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) ) (group (dir "~/Dropbox/notes/") (auto-mode) (auto-directory)) (group (dir "~/Dropbox/org/")) ;; Group remaining buffers by directory, then major mode. (auto-directory) (auto-mode))) :general (:keymaps 'bufler-list-mode-map "Q" 'kill-this-buffer)) (use-package hl-prog-extra :commands (hl-prog-extra-mode) :config (setq hl-prog-extra-list (list '("\\<\\(TODO\\|NOTE\\)\\(([^)+]+)\\)?" 0 comment (:weight bold :inherit diff-removed)) ;; Match TKs in quotation marks (hl-prog-extra sees them as strings) '("\\(TK\\)+" 0 string '(:weight bold :inherit font-lock-warning-face)) ;; Match TKs not in quotation marks '("\\(TK\\)+" 0 nil '(:weight bold :inherit font-lock-warning-face)))) (global-hl-prog-extra-mode)) (use-package xwidget :general (general-define-key :states 'normal :keymaps 'xwidget-webkit-mode-map "j" 'xwidget-webkit-scroll-up-line "k" 'xwidget-webkit-scroll-down-line "gg" 'xwidget-webkit-scroll-top "G" 'xwidget-webkit-scroll-bottom)) (use-package mw-thesaurus :defer t :config (add-hook 'mw-thesaurus-mode-hook (lambda () (define-key evil-normal-state-local-map (kbd "q") 'mw-thesaurus--quit)))) (use-package ansi-term :straight nil :general (:keymaps 'term-mode-map "<up>" 'term-previous-input "<down>" 'term-next-input)) ;;; https://github.com/oantolin/epithet ;(use-package epithet ; :straight nil ; :config ; (add-hook 'Info-selection-hook #'epithet-rename-buffer) ; (add-hook 'help-mode-hook #'epithet-rename-buffer)) ;; https://github.com/udyantw/most-used-words ;(use-package most-used-words :straight nil)
deft
(defun lik/deft-kill () (kill-buffer "*Deft*")) (defun lik/deft-evil-fix () (evil-insert-state) (centered-cursor-mode)) (use-package deft :config (setq deft-directory "/home/lik/Documents/notes/") deft-extensions '("org" "txt") deft-recursive t deft-file-limit 40 deft-use-filename-as-title t) (add-hook 'deft-open-file-hook 'jib/deft-kill) ;; Once a file is opened, kill Deft (add-hook 'deft-mode-hook 'jib/deft-evil-fix) ;; Goes into insert mode automaticlly in Deft ;; Removes :PROPERTIES: from descriptions (setq deft-strip-summary-regexp ":PROPERTIES:\n\\(.+\n\\)+:END:\n") :general (general-define-key :states 'normal :keymaps 'deft-mode-map ;; 'q' kills Deft in normal mode "q" 'kill-this-buffer) (general-define-key :states 'insert :keymaps 'deft-mode-map "C-j" 'next-line "C-k" 'previous-line)
popper.el
(use-package popper :bind (("C-`" . popper-toggle-latest) ("M-`" . popper-cycle) ("C-M-`" . popper-toggle-type)) :init (setq popper-reference-buffers '("\\*Messages\\*" "Output\\*$" "\\*Warnings\\*" help-mode compilation-mode)) (popper-mode +1))
coding stuff
(use-package rainbow-mode :defer t) (use-package quickrun :defer t :general (general-define-key :states 'normal :keymaps 'quickrun--mode-map "q" 'quit-window "s-9" 'quickrun-shell))
html/css/js
(use-package web-mode :defer t :init (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) ;; open .html files in web-mode :config (setq web-mode-enable-current-element-highlight t web-mode-enable-curent-column-highlight t) :general (general-def :prefix "," :states '(normal motion) :keymaps 'web-mode-map "" nil "i" '(web-mode-buffer-indent :which-key "web mode indent") "c" '(web-mode-fold-or-unfold :which-key "web mode toggle fold")))
emacs-lisp-mode
(use-package emacs-lisp-mode :straight nil :general (general-define-key :prefix "," :states '(normal motion) :keymaps 'emacs-lisp-mode-map "" nil "e" '(nil :which-key "eval") "es" '(eval-last-sexp :which-key "eval-sexp") "er" '(eval-region :which-key "eval-region") "eb" '(eval-buffer :which-key "eval-buffer") "g" '(counsel-imenu :which-key "imenu") "c" '(check-parens :which-key "check parens") "I" '(indent-region :which-key "indent region") "b" '(nil :which-key "org src") "bc" 'org-edit-src-abort "bb" 'org-edit-src-exit ) )
spacious padding
(straight-use-package 'spacious-padding) (require 'spacious-padding) ;; these are the default values, but i keep them here for visibility (setq spacious-padding-widths '( :internal-border-width 15 :header-line-width 4 :mode-line-width 6 :tab-width 4 :right-divider-width 30 :scroll-bar-width 8 :fringe-width 8)) ;; read the doc string of `spacious-padding-subtle-mode-line' as it ;; is very flexible and provides several examples (setq spacious-padding-subtle-mode-line `( :mode-line-active 'default :mode-line-inactive vertical-border)) (spacious-padding-mode 1) ;; set a key binding if you need to toggle spacious padding (define-key global-map (kbd "<f8>") #'spacious-padding-mode) (define-key global-map (kbd "M-m") #'evil-normal-state)
org-evil
(require 'dash) (global-dash-fontify-mode) (with-eval-after-load 'info-look (dash-register-info-lookup))
(lik/load-theme 'doom-snazzy) (setq truncate-lines t) ; (load "/home/lik/.emacs.d/private.el") ; (setq org-agenda-private-local-path "/tmp/dummy.ics") ;; define a custom command to save the org agenda to a file (add-to-list 'org-agenda-custom-commands '("x" "export to ics" ((agenda "" nil ,(list org-agenda-private-local-path))))) ;; (defun lik/org-agenda-export-to-ics () ;; (set-org-agenda-files) ;; (org-batch-store-agenda-views) ;; (with-current-buffer (find-file-noselect org-agenda-private-local-path) ;; (goto-char (point-min)) ;; (while (re-search-forward "VTODO" nil t) ;; (replace-match "VEVENT")) ;; (save-buffer)))
yuck-mode
(straight-use-package 'yuck-mode) (straight-use-package 'lua-mode) (tab-bar-mode nil) (setq tab-bar-new-tab-choice "*dashboard*" tab-bar-close-button-show t tab-bar-new-button-show t) (straight-use-package 'easy-kill)
eat
(straight-use-package '(eat :type git :host codeberg :repo "akib/emacs-eat" :files ("*.el" ("term" "term/*.el") "*.texi" "*.ti" ("terminfo/e" "terminfo/e*") ("terminfo/65" "terminfo/65/*") ("integration" "integration/*") (:exclude ".dir-locals.el" "*-tests.el"))))
sudo-edit
(straight-use-package 'sudo-edit) (global-prettify-symbols-mode t) (global-hl-line-mode) (setq org-src-tab-acts-natively t) (setq org-src-window-setup 'current-window) (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) ; (use-package expand-region ; :ensure t ; :bind ("M-m" . er/expand-region)) ; (use-package org-auto-tangle ; :defer t ; :hook (org-mode . org-auto-tangle-mode) ; :config ; (setq org-auto-tangle-default t)) ; (use-package crux ; :ensure td ; :bind t ; ("C-k" . crux-smart-kill-line)) ; ("C-c n" . crux-cleanup-buffer-or-region) ; ("C-c f" . crux-recentf-find-file) (setq warning-suppress-types '((project.el) (free variable)))
ledger mode
(use-package ledger-mode :ensure t :init (setq ledger-clear-whole-transactions 1) :config (add-to-list 'evil-emacs-state-modes 'ledger-report-mode) :mode ("\\.dat\\'" "\\.ledger\\'") :bind (:map ledger-mode-map ("C-x C-s" . my/ledger-save)) :preface (defun my/ledger-save () "automatically clean the ledger buffer at each save" (interactive) (save-excursion (when (buffer-modified-p) (with-demoted-errors (ledger-mode-clean-buffer)) (save-buffer))))) (use-package flycheck-ledger :after ledger-mode) (defvar my/org-ledger-expense-template "%(org-read-date) * %^{Payee||blinkit|zomato|swiggy|jio|ather|mantri inn|thanishk|saravanan|bridgeway|equilibrium|curl up and dye|other} Expenses:%^{Category|food:meals|food:dining|vices:smokes|vices:alcohol|entertainment|entertainment:movie|entertainment:comedy|entertainment:music|house|books|office supplies|transportation:evren|transportation:cab|transportation:bus|transportation:other|gym:climbing|gym:regular|medical|selfcare|sim|other} %^{Amount} Assets:%^{account|sbi|canara}" "Template for expense transaction with ledger.") (defvar my/org-ledger-income-template "%(org-read-date) * %^{payee} Income:salary:%^{source} -%^{amount} Assets:sbi " "template for income transaction with ledger") (defvar my/org-ledger-receivable-template "%(org-read-date) * %^{payee} Receivables:%^{From|wizr|other} -%^{amount} Assets:%^{To|sbi|canara|cash}" "template for receivables with ledger") (setq org-capture-templates `(("l" "Ledger") ("le" "Expense" plain (file ,(format "~/.personal/ledger/ledger-%s.dat" (format-time-string "%Y"))), my/org-ledger-expense-template :empty-lines 1) ("li" "Income" plain (file , (format "~/.personal/ledger/ledger-%s.dat" (format-time-string "%Y"))), my/org-ledger-income-template :empty-lines 1) ("lr" "Receivable" plain (file , (format "~/.personal/ledger/ledger-%s.dat" (format-time-string "%Y"))), my/org-ledger-receivable-template :empty-lines 1)))
presentation mode
(straight-use-package 'org-present) (require 'org-faces) (defun lik/org-present-prepare-slide (buffer-name heading) (org-overview) (org-show-entry) (org-show-children)) (defun lik/org-present-start () (setq-local face-remapping-alist '((default (:height 1.5) variable-pitch) (header-line (:height 4.0) variable-pitch) (org-document-title (:height 1.75) org-document-title) (org-code (:height 1.55) org-code) (org-verbatim (:height 1.55) org-verbatim) (org-block (:height 1.25) org-block) (org-block-begin-line (:height 0.7) org-block))) (setq header-line-format " ") (org-present-big) (org-present-hide-cursor) (org-present-read-only) (org-display-inline-images) (visual-fill-column-mode 1) (visual-line-mode 1)) (defun lik/org-present-end () (setq-local face-remapping-alist '((default variable-pitch default))) (setq header-line-format nil) (org-present-small) (org-present-show-cursor) (org-present-read-write) (org-remove-inline-images) (visual-fill-column-mode 0) (visual-line-mode 0)) (add-hook 'org-present-mode-hook 'lik/org-present-start) (add-hook 'org-present-mode-quit-hook 'lik/org-present-end) (add-hook 'org-present-after-navigate-functions 'lik/org-present-prepare-slide)
rust
(straight-use-package 'rust-mode) (use-package rustic :ensure :bind (:map rustic-mode-map ("M-j" . lsp-ui-imenu) ("M-?" . lsp-find-references) ("C-c C-c l" . flycheck-list-errors) ("C-c C-c a" . lsp-execute-code-action) ("C-c C-c r" . lsp-rename) ("C-c C-c q" . lsp-workspace-restart) ("C-c C-c Q" . lsp-workspace-shutdown) ("C-c C-c s" . lsp-rust-analyzer-status)) :config ;; uncomment for less flashiness ;; (setq lsp-eldoc-hook nil) ;; (setq lsp-enable-symbol-highlighting nil) ;; (setq lsp-signature-auto-activate nil) ;; comment to disable rustfmt on save (setq rustic-format-on-save t) (add-hook 'rustic-mode-hook 'lik/rustic-mode-hook)) (defun lik/rustic-mode-hook () ;; so that run C-c C-c C-r works without having to confirm, but don't ;; try to save rust buffers that are not file visiting. once ;; https://github.com/brotzeit/rustic/issues/253 has been resolved this ;; should no longer be necessary (when buffer-file-name (setq-local buffer-save-without-query t)) (add-hook 'before-save-hook 'lsp-format-buffer nil t))
fzf
(use-package fzf ; :init ; (setenv "FZF_DEFAULT_COMMAND" "fd --type f") :config (setq fzf/args "-x --color bw --print-query --margin=1,0 --no-hscroll" fzf/executable "fzf" fzf/git-grep-args "-i --line-number %s" fzf/grep-command "rg --no-heading -nH" fzf/position-bottom t fzf/window-height 30))