neodotfiles/config/doom/config.org
2024-08-21 23:43:48 -04:00

767 lines
33 KiB
Org Mode
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#+TITLE: DRK's Doom Emacs Config
#+AUTHOR: Clay Gomera (Drake)
#+DESCRIPTION: DRK's personal Doom Emacs config.
#+STARTUP: showeverything
#+PROPERTY: header-args :tangle config.el
* TABLE OF CONTENTS :toc:
- [[#about-this-config][ABOUT THIS CONFIG]]
- [[#beacon][BEACON]]
- [[#bookmarks-and-buffers][BOOKMARKS AND BUFFERS]]
- [[#bookmarks][Bookmarks]]
- [[#buffers][Buffers]]
- [[#global-auto-revert][Global Auto Revert]]
- [[#keybindings-within-ibuffer-mode][Keybindings within ibuffer mode]]
- [[#calendar][CALENDAR]]
- [[#clippy][CLIPPY]]
- [[#dap-mode][DAP MODE]]
- [[#dired][DIRED]]
- [[#keybindings-within-dired-with-peep-dired-mode-enabled][Keybindings Within Dired With Peep-Dired-Mode Enabled]]
- [[#making-deleted-files-go-to-trash-can][Making deleted files go to trash can]]
- [[#doom-theme][DOOM THEME]]
- [[#emojis][EMOJIS]]
- [[#fonts][FONTS]]
- [[#insert-date][INSERT DATE]]
- [[#ivy][IVY]]
- [[#ivy-posframe][IVY-POSFRAME]]
- [[#ivy-keybindings][IVY KEYBINDINGS]]
- [[#line-settings][LINE SETTINGS]]
- [[#lsp][LSP]]
- [[#markdown][MARKDOWN]]
- [[#modeline][MODELINE]]
- [[#mouse-support][MOUSE SUPPORT]]
- [[#neotree][NEOTREE]]
- [[#open-specific-files][OPEN SPECIFIC FILES]]
- [[#org-mode][ORG MODE]]
- [[#org-publish][Org-publish]]
- [[#org-auto-tangle][Org-auto-tangle]]
- [[#rainbow-mode][RAINBOW MODE]]
- [[#registers][REGISTERS]]
- [[#shells][SHELLS]]
- [[#splits][SPLITS]]
- [[#winner-mode][WINNER MODE]]
- [[#zap-to-char][ZAP TO CHAR]]
- [[#transparent][TRANSPARENT]]
* ABOUT THIS CONFIG
This is my personal Doom Emacs config. Doom Emacs is a distribution of Emacs
that uses the "evil" keybindings (Vim keybindings) and includes a number of nice
extensions and a bit of configuration out of the box. I am maintaining this
config not just for myself, but also for those that want to explore some of what
is possible with Emacs. I will add a lot of examples of plugins and settings,
some of them I may not even use personally. I do this because many people
following me on YouTube look at my configs as "documentation". This config is
based on DistroTube's config.
* BEACON
Never lose your cursor. When you scroll, your cursor will shine! This is a
global minor-mode. Turn it on everywhere with:
#+begin_src emacs-lisp
(beacon-mode 1)
#+end_src
* BOOKMARKS AND BUFFERS
Doom Emacs uses 'SPC b' for keybindings related to bookmarks and buffers.
** Bookmarks
Bookmarks are somewhat like registers in that they record positions you can jump
to. Unlike registers, they have long names, and they persist automatically from
one Emacs session to the next. The prototypical use of bookmarks is to record
where you were reading in various files.
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix ("b". "buffer")
:desc "List bookmarks" "L" #'list-bookmarks
:desc "Save current bookmarks to bookmark file" "w" #'bookmark-save))
#+END_SRC
** Buffers
Regarding /buffers/, the text you are editing in Emacs resides in an object called
a /buffer/. Each time you visit a file, a buffer is used to hold the files text.
Each time you invoke Dired, a buffer is used to hold the directory listing.
/Ibuffer/ is a program that lists all of your Emacs /buffers/, allowing you to
navigate between them and filter them.
| COMMAND | DESCRIPTION | KEYBINDING |
|-----------------+----------------------+------------|
| ibuffer | Launch ibuffer | SPC b i |
| kill-buffer | Kill current buffer | SPC b k |
| next-buffer | Goto next buffer | SPC b n |
| previous-buffer | Goto previous buffer | SPC b p |
| save-buffer | Save current buffer | SPC b s |
** Global Auto Revert
A buffer can get out of sync with respect to its visited file on disk if that
file is changed by another program. To keep it up to date, you can enable Auto
Revert mode by typing M-x auto-revert-mode, or you can set it to be turned on
globally with 'global-auto-revert-mode'. I have also turned on Global Auto
Revert on non-file buffers, which is especially useful for 'dired' buffers.
#+begin_src emacs-lisp
(global-auto-revert-mode 1)
(setq global-auto-revert-non-file-buffers t)
#+end_src
** Keybindings within ibuffer mode
| COMMAND | DESCRIPTION | KEYBINDING |
|-----------------------------------+----------------------------------------+------------|
| ibuffer-mark-forward | Mark the buffer | m |
| ibuffer-unmark-forward | Unmark the buffer | u |
| ibuffer-do-kill-on-deletion-marks | Kill the marked buffers | x |
| ibuffer-filter-by-content | Ibuffer filter by content | f c |
| ibuffer-filter-by-directory | Ibuffer filter by directory | f d |
| ibuffer-filter-by-filename | Ibuffer filter by filename (full path) | f f |
| ibuffer-filter-by-mode | Ibuffer filter by mode | f m |
| ibuffer-filter-by-name | Ibuffer filter by name | f n |
| ibuffer-filter-disable | Disable ibuffer filter | f x |
| ibuffer-do-kill-lines | Hide marked buffers | g h |
| ibuffer-update | Restore hidden buffers | g H |
#+begin_src emacs-lisp
(evil-define-key 'normal ibuffer-mode-map
(kbd "f c") 'ibuffer-filter-by-content
(kbd "f d") 'ibuffer-filter-by-directory
(kbd "f f") 'ibuffer-filter-by-filename
(kbd "f m") 'ibuffer-filter-by-mode
(kbd "f n") 'ibuffer-filter-by-name
(kbd "f x") 'ibuffer-filter-disable
(kbd "g h") 'ibuffer-do-kill-lines
(kbd "g H") 'ibuffer-update)
#+end_src
* CALENDAR
Let's make a 12-month calendar available so we can have a calendar app that,
when we click on time/date in xmobar, we get a nice 12-month calendar to view.
#+begin_src emacs-lisp
;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months
(defun drk/year-calendar (&optional year)
(interactive)
(require 'calendar)
(let* (
(current-year (number-to-string (nth 5 (decode-time (current-time)))))
(month 0)
(year (if year year (string-to-number (format-time-string "%Y" (current-time))))))
(switch-to-buffer (get-buffer-create calendar-buffer))
(when (not (eq major-mode 'calendar-mode))
(calendar-mode))
(setq displayed-month month)
(setq displayed-year year)
(setq buffer-read-only nil)
(erase-buffer)
;; horizontal rows
(dotimes (j 4)
;; vertical columns
(dotimes (i 3)
(calendar-generate-month
(setq month (+ month 1))
year
;; indentation / spacing between months
(+ 5 (* 25 i))))
(goto-char (point-max))
(insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n))
(widen)
(goto-char (point-max))
(narrow-to-region (point-max) (point-max)))
(widen)
(goto-char (point-min))
(setq buffer-read-only t)))
(defun drk/scroll-year-calendar-forward (&optional arg event)
"Scroll the yearly calendar by year in a forward direction."
(interactive (list (prefix-numeric-value current-prefix-arg)
last-nonmenu-event))
(unless arg (setq arg 0))
(save-selected-window
(if (setq event (event-start event)) (select-window (posn-window event)))
(unless (zerop arg)
(let* (
(year (+ displayed-year arg)))
(drk/year-calendar year)))
(goto-char (point-min))
(run-hooks 'calendar-move-hook)))
(defun drk/scroll-year-calendar-backward (&optional arg event)
"Scroll the yearly calendar by year in a backward direction."
(interactive (list (prefix-numeric-value current-prefix-arg)
last-nonmenu-event))
(drk/scroll-year-calendar-forward (- (or arg 1)) event))
(map! :leader
:desc "Scroll year calendar backward" "<left>" #'drk/scroll-year-calendar-backward
:desc "Scroll year calendar forward" "<right>" #'drk/scroll-year-calendar-forward)
(defalias 'year-calendar 'drk/year-calendar)
#+end_src
* CLIPPY
Gives us a popup box with "Clippy, the paper clip". You can make him say various
things by calling 'clippy-say' function. But the more useful functions of
clippy are the two describe functions provided: 'clippy-describe-function' and
'clippy-describe-variable'. Hit the appropriate keybinding while the point is
over a function/variable to call it. A popup with helpful clippy will appear,
telling you about the function/variable (using describe-function and
describe-variable respectively).
| COMMAND | DESCRIPTION | KEYBINDING |
|--------------------------+---------------------------------------+------------|
| clippy-describe-function | /Clippy describes function under point/ | SPC c h f |
| clippy-describe-variable | /Clippy describes variable under point/ | SPC c h v |
#+begin_src emacs-lisp
(map! :leader
(:prefix ("c h" . "Help info from Clippy")
:desc "Clippy describes function under point" "f" #'clippy-describe-function
:desc "Clippy describes variable under point" "v" #'clippy-describe-variable))
#+end_src
* DAP MODE
dap-mode is a debugger manager for emacs that supports multiple languages.
#+begin_src emacs-lisp
(require 'dap-netcore)
(require 'dap-dlv-go)
(map! :leader
(:prefix ("d" . "dap-mode")
:desc "Toggle breakpoint" "t" #'dap-breakpoint-toggle
:desc "Continue execution" "c" #'dap-continue
:desc "Step in" "n" #'dap-step-in
:desc "Step out" "N" #'dap-step-out
:desc "See all breakpoints" "b" #'dap-ui-breakpoints-toggle
:desc "Change variable value" "s" #'dap-ui-set-variable-value
:desc "Evaluate expression at point" "e" #'dap-eval-thing-at-point
:desc "Evaluate expression" "E" #'dap-eval
:desc "Run debugger" "r" #'dap-debug
:desc "Restart debugger" "R" #'dap-debug-restart
:desc "Stop debugger" "d" #'dap-disconnect))
(use-package dap-mode
:init
(dap-auto-configure-mode)
:custom
(dap-netcore-download-url "https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-linux-amd64.tar.gz"))
#+end_src
* DIRED
Dired is the file manager within Emacs.
#+begin_src emacs-lisp
;; With dired-open plugin, you can launch external programs for certain
;; extensions For example, I set all .png files to open in 'vimiv' and all .mp4
;; files to open in 'mpv'
(setq dired-open-extensions '(("gif" . "vimiv")
("jpg" . "vimiv")
("png" . "vimiv")
("mkv" . "mpv")
("mp3" . "mpv")
("mp4" . "mpv")))
#+end_src
** Keybindings Within Dired With Peep-Dired-Mode Enabled
If peep-dired is enabled, you will get image previews as you go up/down with 'j'
and 'k'
| COMMAND | DESCRIPTION | KEYBINDING |
|----------------------+------------------------------------------+------------|
| peep-dired | /Toggle previews within dired/ | SPC d p |
| peep-dired-next-file | /Move to next file in peep-dired-mode/ | j |
| peep-dired-prev-file | /Move to previous file in peep-dired-mode/ | k |
#+BEGIN_SRC emacs-lisp
(evil-define-key 'normal peep-dired-mode-map
(kbd "j") 'peep-dired-next-file
(kbd "k") 'peep-dired-prev-file)
(add-hook 'peep-dired-hook 'evil-normalize-keymaps)
#+END_SRC
** Making deleted files go to trash can
#+begin_src emacs-lisp
(setq delete-by-moving-to-trash t
trash-directory "~/.local/share/Trash/files/")
#+end_src
* DOOM THEME
Setting the theme to doom-one. To try out new themes, I set a keybinding for
counsel-load-theme with 'SPC h t'.
#+BEGIN_SRC emacs-lisp
(setq doom-theme 'doom-gruvbox)
(map! :leader
:desc "Load new theme" "h t" #'load-theme)
#+END_SRC
* EMOJIS
Emojify is an Emacs extension to display emojis. It can display github style
emojis like :smile: or plain ascii ones like :).
#+begin_src emacs-lisp
(use-package emojify
:hook (after-init . global-emojify-mode))
#+end_src
* FONTS
Settings related to fonts within Doom Emacs:
+ 'doom-font' -- standard monospace font that is used for most things in Emacs.
+ 'doom-variable-pitch-font' -- variable font which is useful in some Emacs plugins.
+ 'doom-big-font' -- used in doom-big-font-mode; useful for presentations.
+ 'font-lock-comment-face' -- for comments.
+ 'font-lock-keyword-face' -- for keywords with special significanclike 'setq' in elisp.
#+BEGIN_SRC emacs-lisp
(setq doom-font (font-spec :family "Mononoki Nerd Font" :size 18)
doom-variable-pitch-font (font-spec :family "Mononoki Nerd Font" :size 18)
doom-big-font (font-spec :family "Mononoki Nerd Font" :size 24))
(after! doom-themes
(setq doom-themes-enable-bold t
doom-themes-enable-italic t))
(custom-set-faces!
'(font-lock-comment-face :slant italic)
'(font-lock-keyword-face :slant italic))
#+END_SRC
* INSERT DATE
Some custom functions to insert the date. The function 'insert-todays-date' can
be used one of three different ways: (1) just the keybinding without the
universal argument prefix, (2) with one universal argument prefix, or (3) with
two universal argument prefixes. The universal argument prefix is 'SPC-u' in
Doom Emacs (C-u in standard GNU Emacs). The function 'insert-any-date' only
outputs to one format, which is the same format as 'insert-todays-date' without
a prefix.
| COMMAND | EXAMPLE OUTPUT | KEYBINDING |
|------------------------+---------------------------+-----------------------|
| drk/insert-todays-date | Friday, November 19, 2021 | SPC i d t |
| drk/insert-todays-date | 11-19-2021 | SPC u SPC i d t |
| drk/insert-todays-date | 2021-11-19 | SPC u SPC u SPC i d t |
| drk/insert-any-date | Friday, November 19, 2021 | SPC i d a |
#+begin_src emacs-lisp
(defun drk/insert-todays-date (prefix)
(interactive "P")
(let ((format (cond
((not prefix) "%A, %B %d, %Y")
((equal prefix '(4)) "%m-%d-%Y")
((equal prefix '(16)) "%Y-%m-%d"))))
(insert (format-time-string format))))
(require 'calendar)
(defun drk/insert-any-date (date)
"Insert DATE using the current locale."
(interactive (list (calendar-read-date)))
(insert (calendar-date-string date)))
(map! :leader
(:prefix ("i d" . "Insert date")
:desc "Insert any date" "a" #'drk/insert-any-date
:desc "Insert todays date" "t" #'drk/insert-todays-date))
#+end_src
* IVY
Ivy is a generic completion mechanism for Emacs.
** IVY-POSFRAME
Ivy-posframe is an ivy extension, which lets ivy use posframe to show its
candidate menu. Some of the settings below involve:
+ ivy-posframe-display-functions-alist -- sets the display position for specific
programs
+ ivy-posframe-height-alist -- sets the height of the list displayed for
specific programs
Available functions (positions) for 'ivy-posframe-display-functions-alist'
+ ivy-posframe-display-at-frame-center
+ ivy-posframe-display-at-window-center
+ ivy-posframe-display-at-frame-bottom-left
+ ivy-posframe-display-at-window-bottom-left
+ ivy-posframe-display-at-frame-bottom-window-center
+ ivy-posframe-display-at-point
+ ivy-posframe-display-at-frame-top-center
=NOTE:= If the setting for 'ivy-posframe-display' is set to 'nil' (false),
anything that is set to 'ivy-display-function-fallback' will just default to
their normal position in Doom Emacs (usually a bottom split). However, if this
is set to 't' (true), then the fallback position will be centered in the window.
#+BEGIN_SRC emacs-lisp
(setq ivy-posframe-display-functions-alist
'((swiper . ivy-posframe-display-at-point)
(complete-symbol . ivy-posframe-display-at-point)
(counsel-M-x . ivy-display-function-fallback)
(counsel-esh-history . ivy-posframe-display-at-window-center)
(counsel-describe-function . ivy-display-function-fallback)
(counsel-describe-variable . ivy-display-function-fallback)
(counsel-find-file . ivy-display-function-fallback)
(counsel-recentf . ivy-display-function-fallback)
(counsel-register . ivy-posframe-display-at-frame-bottom-window-center)
(dmenu . ivy-posframe-display-at-frame-top-center)
(nil . ivy-posframe-display))
ivy-posframe-height-alist
'((swiper . 20)
(dmenu . 20)
(t . 10)))
(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it.
#+END_SRC
** IVY KEYBINDINGS
By default, Doom Emacs does not use 'SPC v', so the format I use for these
bindings is 'SPC v' plus 'key'.
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix ("v" . "Ivy")
:desc "Ivy push view" "v p" #'ivy-push-view
:desc "Ivy switch view" "v s" #'ivy-switch-view))
#+END_SRC
* LINE SETTINGS
I set comment-line to 'SPC TAB TAB' which is a rather comfortable keybinding for
me on my ZSA Moonlander keyboard. The standard Emacs keybinding for
comment-line is 'C-x C-;'. The other keybindings are for commands that toggle
on/off various line-related settings. Doom Emacs uses 'SPC t' for "toggle"
commands, so I choose 'SPC t' plus 'key' for those bindings.
| COMMAND | DESCRIPTION | KEYBINDING |
|--------------------------+-------------------------------------------+-------------|
| comment-line | /Comment or uncomment lines/ | SPC TAB TAB |
| hl-line-mode | /Toggle line highlighting in current frame/ | SPC t h |
| global-hl-line-mode | /Toggle line highlighting globally/ | SPC t H |
| doom/toggle-line-numbers | /Toggle line numbers/ | SPC t l |
| toggle-truncate-lines | /Toggle truncate lines/ | SPC t t |
#+BEGIN_SRC emacs-lisp
(setq display-line-numbers-type t)
(map! :leader
:desc "Comment or uncomment lines" "TAB TAB" #'comment-line
(:prefix ("t" . "toggle")
:desc "Toggle line numbers" "l" #'doom/toggle-line-numbers
:desc "Toggle line highlight in frame" "h" #'hl-line-mode
:desc "Toggle line highlight globally" "H" #'global-hl-line-mode
:desc "Toggle truncate lines" "t" #'toggle-truncate-lines))
#+END_SRC
* LSP
Autostart lsp for programming languages
- C#:
#+begin_src emacs-lisp
(add-hook 'csharp-mode-hook #'lsp-deferred)
#+end_src
- Go:
#+begin_src emacs-lisp
(add-hook 'go-mode-hook #'lsp-deferred)
#+end_src
- Rust:
#+begin_src emacs-lisp
(add-hook 'rust-mode-hook #'lsp-deferred)
#+end_src
* MARKDOWN
#+begin_src emacs-lisp
(custom-set-faces
'(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "Mononoki Nerd Font"))))
'(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7))))
'(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6))))
'(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5))))
'(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4))))
'(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3))))
'(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2)))))
#+end_src
* MODELINE
The modeline is the bottom status bar that appears in Emacs windows. For more
information on what is available to configure in the Doom modeline, check out:
https://github.com/seagle0128/doom-modeline
#+begin_src emacs-lisp
(set-face-attribute 'mode-line nil :font "Mononoki Nerd Font-14")
(setq doom-modeline-height 30 ;; sets modeline height
doom-modeline-bar-width 5 ;; sets right bar width
doom-modeline-persp-name t ;; adds perspective name to modeline
doom-modeline-persp-icon t) ;; adds folder icon next to persp name
#+end_src
* MOUSE SUPPORT
Adding mouse support in the terminal version of Emacs.
#+begin_src emacs-lisp
(xterm-mouse-mode 1)
#+end_src
* NEOTREE
1. SPC + e to toggle neotree
2. Make neotree prettier
3. Every time when the neotree window is opened, let it find current file and jump to node.
4. When running projectile-switch-project (SPC p p), neotree will change root automatically.
#+begin_src emacs-lisp
(map! :leader
:desc "Toggle neotree" "e" #'neotree-toggle)
(setq neo-theme 'nerd)
(setq neo-smart-open t)
(setq projectile-switch-project-action 'neotree-projectile-action)
#+end_src
* OPEN SPECIFIC FILES
Keybindings to open files that I work with all the time using the find-file
command, which is the interactive file search that opens with 'C-x C-f' in GNU
Emacs or 'SPC f f' in Doom Emacs. These keybindings use find-file
non-interactively since we specify exactly what file to open. The format I use
for these bindings is 'SPC =' plus 'key' since Doom Emacs does not use 'SPC ='.
| PATH TO FILE | DESCRIPTION | KEYBINDING |
|--------------------------------+-----------------------+------------|
| ~/org/agenda.org | /Edit agenda file/ | SPC = a |
| ~/.config/doom/config.org" | /Edit doom config.org/ | SPC = c |
| ~/.config/doom/init.el" | /Edit doom init.el/ | SPC = i |
| ~/.config/doom/packages.el" | /Edit doom packages.el/ | SPC = p |
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix ("=" . "open file")
:desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/org/agenda.org"))
:desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org"))
:desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el"))
:desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el"))))
#+END_SRC
* ORG MODE
I wrapped most of this block in (after! org). Without this, my settings might
be evaluated too early, which will result in my settings being overwritten by
Doom's defaults. I have also enabled org-journal, org-superstar and org-roam by
adding (+journal +pretty +roam2) to the org section of my Doom Emacs init.el.
#+BEGIN_SRC emacs-lisp
(map! :leader
:desc "Org babel tangle" "m B" #'org-babel-tangle)
(after! org
(setq org-directory "~/org/"
org-agenda-files '("~/org/agenda.org")
org-default-notes-file (expand-file-name "notes.org" org-directory)
org-ellipsis ""
org-superstar-headline-bullets-list '("" "" "" "" "" "" "")
org-superstar-item-bullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists
org-log-done 'time
org-hide-emphasis-markers t
;; ex. of org-link-abbrev-alist in action
;; [[arch-wiki:Name_of_Page][Description]]
org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list
'(("google" . "http://www.google.com/search?q=")
("arch-wiki" . "https://wiki.archlinux.org/index.php/")
("ddg" . "https://duckduckgo.com/?q=")
("wiki" . "https://en.wikipedia.org/wiki/"))
org-todo-keywords ; This overwrites the default Doom org-todo-keywords
'((sequence
"TODO(t)" ; A task that is ready to be tackled
"BLOG(b)" ; Blog writing assignments
"GYM(g)" ; Things to accomplish at the gym
"GAME(j)" ; Things to accomplish at the gym
"PROJ(p)" ; A project that contains other tasks
"VIDEO(v)" ; Video assignments
"WAIT(w)" ; Something is holding up this task
"|" ; The pipe necessary to separate "active" states and "inactive" states
"DONE(d)" ; Task has been completed
"CANCELLED(c)" )))) ; Task has been cancelled
(setq org-agenda-custom-commands
'(("p" "Priority view"
((tags "PRIORITY=\"A\""
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "High priority unfinished tasks:")))
(tags "PRIORITY=\"B\""
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "Medium priority unfinished tasks:")))
(tags "PRIORITY=\"C\""
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "Low priority unfinished tasks:")))))
("i" "INTEC view"
((tags "homeworks"
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "Pending homeworks:")))
(tags "studies"
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "Pending studies:")))
(tags "exam"
((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
(org-agenda-overriding-header "Pending exams:")))))
))
(setq
org-agenda-block-separator 985827
org-fancy-priorities-list '("󰈼" "󰈻" "󰈽")
org-priority-faces
'((?A :foreground "#fb4934" :weight bold)
(?B :foreground "#fabd2f" :weight bold)
(?C :foreground "#83a598" :weight bold)))
#+END_SRC
** Org-publish
#+begin_src emacs-lisp
(setq org-publish-use-timestamps-flag nil)
(setq org-export-with-broken-links t)
#+end_src
** Org-auto-tangle
=org-auto-tangle= allows you to add the option =#+auto_tangle: t= in your Org file
so that it automatically tangles when you save the document.
#+begin_src emacs-lisp
(use-package! org-auto-tangle
:defer t
:hook (org-mode . org-auto-tangle-mode)
:config
(setq org-auto-tangle-default t))
#+end_src
* RAINBOW MODE
Rainbox mode displays the actual color for any hex value color. It's such a
nice feature that I wanted it turned on all the time, regardless of what mode I
am in. The following creates a global minor mode for rainbow-mode and enables
it.
#+begin_src emacs-lisp
(define-globalized-minor-mode global-rainbow-mode rainbow-mode
(lambda () (rainbow-mode 1)))
(global-rainbow-mode 1 )
#+end_src
* REGISTERS
Emacs registers are compartments where you can save text, rectangles and
positions for later use. Once you save text or a rectangle in a register, you
can copy it into the buffer once or many times; once you save a position in a
register, you can jump back to that position once or many times. The default
GNU Emacs keybindings for these commands (with the exception of
counsel-register) involves 'C-x r' followed by one or more other keys. I wanted
to make this a little more user friendly, and since I am using Doom Emacs, I
choose to replace the 'C-x r' part of the key chords with 'SPC r'.
| COMMAND | DESCRIPTION | KEYBINDING |
|----------------------------------+----------------------------------+------------|
| copy-to-register | /Copy to register/ | SPC r c |
| frameset-to-register | /Frameset to register/ | SPC r f |
| insert-register | /Insert contents of register/ | SPC r i |
| jump-to-register | /Jump to register/ | SPC r j |
| list-registers | /List registers/ | SPC r l |
| number-to-register | /Number to register/ | SPC r n |
| counsel-register | /Interactively choose a register/ | SPC r r |
| view-register | /View a register/ | SPC r v |
| window-configuration-to-register | /Window configuration to register/ | SPC r w |
| increment-register | /Increment register/ | SPC r + |
| point-to-register | /Point to register/ | SPC r SPC |
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix ("r" . "registers")
:desc "Copy to register" "c" #'copy-to-register
:desc "Frameset to register" "f" #'frameset-to-register
:desc "Insert contents of register" "i" #'insert-register
:desc "Jump to register" "j" #'jump-to-register
:desc "List registers" "l" #'list-registers
:desc "Number to register" "n" #'number-to-register
:desc "Interactively choose a register" "r" #'counsel-register
:desc "View a register" "v" #'view-register
:desc "Window configuration to register" "w" #'window-configuration-to-register
:desc "Increment register" "+" #'increment-register
:desc "Point to register" "SPC" #'point-to-register))
#+END_SRC
* SHELLS
Settings for the various shells and terminal emulators within Emacs.
+ 'shell-file-name' -- sets the shell to be used in M-x shell, M-x term, M-x
ansi-term and M-x vterm.
#+BEGIN_SRC emacs-lisp
(setq shell-file-name "/bin/fish"
vterm-max-scrollback 5000)
(map! :leader
:desc "Vterm popup toggle" "v t" #'+vterm/toggle)
#+END_SRC
* SPLITS
I set splits to default to opening on the right using 'prefer-horizontal-split'.
I set a keybinding for 'clone-indirect-buffer-other-window' for when I want to
have the same document in two splits. The text of the indirect buffer is always
identical to the text of its base buffer; changes made by editing either one are
visible immediately in the other. But in all other respects, the indirect
buffer and its base buffer are completely separate. For example, I can fold one
split but other will be unfolded.
#+BEGIN_SRC emacs-lisp
(defun prefer-horizontal-split ()
(set-variable 'split-height-threshold nil t)
(set-variable 'split-width-threshold 40 t)) ; make this as low as needed
(add-hook 'markdown-mode-hook 'prefer-horizontal-split)
(map! :leader
:desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window)
#+END_SRC
* WINNER MODE
Winner mode has been included with GNU Emacs since version 20. This is a global
minor mode and, when activated, it allows you to “undo” (and “redo”) changes in
the window configuration with the key commands 'SCP w <left>' and 'SPC w
<right>'.
#+BEGIN_SRC emacs-lisp
(map! :leader
(:prefix ("w" . "window")
:desc "Winner redo" "<right>" #'winner-redo
:desc "Winner undo" "<left>" #'winner-undo))
#+END_SRC
* ZAP TO CHAR
Emacs provides a 'zap-to-char' command that kills from the current point to a
character. It is bound to 'M-z' in standard GNU Emacs but since Doom Emacs uses
'SPC' as its leader key and does not have 'SPC z' binded to anything, it just
makes since to use it for 'zap-to-char'. Note that 'zap-to-char' can be used
with the universal argument 'SPC u' to modify its behavior. Examples of
'zap-to-char' usage are listed in the table below:
| KEYBINDING | WHAT IS DOES |
|---------------------------+------------------------------------------------------------|
| SPC z e | deletes all chars to the next occurrence of 'e' |
| SPC u 2 SPC z e | deletes all chars to the second occurrence of 'e' |
| SPC u - SPC z e | deletes all chars to the previous occurrence of 'e' |
| SPC u -2 SPC z e | deletes all chars to the fourth previous occurrence of 'e' |
| SPC u 1 0 0 SPC u SPC z e | deletes all chars to the 100th occurrence of 'e' |
=TIP:= The universal argument (SPC u) can only take a single integer by default.
If you need to use a multi-digit number (like 100 in the last example in the
table above), then you must terminate the universal argument with another 'SPC
u' after typing the number.
'zap-up-to-char' is an alternative command that does not zap the char specified.
It is binded to 'SPC Z'. It can also be used in conjunction with the universal
argument 'SPC u' in similar fashion to the the 'zap-to-char' examples above.
=NOTE:= Vim (evil mode) has similar functionality builtin. You can delete to the
next occurrence of 'e' by using 'dte' in normal. To delete to the next
occurrence of 'e' including the 'e', then you would use 'dfe'. And you can
modify 'dt' and 'df' by prefixing them with numbers, so '2dte' would delete to
the second occurrence of 'e'.
#+BEGIN_SRC emacs-lisp
(map! :leader
:desc "Zap to char" "z" #'zap-to-char
:desc "Zap up to char" "Z" #'zap-up-to-char)
#+END_SRC
* TRANSPARENT
Transparent window
#+BEGIN_SRC emacs-lisp
(set-frame-parameter nil 'alpha-background 95) ; For current frame
(add-to-list 'default-frame-alist '(alpha-background . 95)) ; For all new frames henceforth
; load path correctly
(when (daemonp)
(exec-path-from-shell-initialize))
; Launch new clients in the main workspace
(after! persp-mode
(setq persp-emacsclient-init-frame-behaviour-override
`(+workspace-current-name))
)
#+END_SRC