2022-01-11 03:24:51 +00:00
|
|
|
|
#+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:
|
2023-05-23 23:54:34 +00:00
|
|
|
|
- [[#about-this-config][About this config]]
|
|
|
|
|
- [[#beacon][Beacon]]
|
|
|
|
|
- [[#bookmarks-and-buffers][Bookmarks and buffers]]
|
2022-01-11 03:24:51 +00:00
|
|
|
|
- [[#bookmarks][Bookmarks]]
|
|
|
|
|
- [[#buffers][Buffers]]
|
2022-07-05 20:57:42 +00:00
|
|
|
|
- [[#global-auto-revert][Global Auto Revert]]
|
2022-01-11 03:24:51 +00:00
|
|
|
|
- [[#keybindings-within-ibuffer-mode][Keybindings within ibuffer mode]]
|
2023-05-23 23:54:34 +00:00
|
|
|
|
- [[#calendar][Calendar]]
|
|
|
|
|
- [[#dashboard][Dashboard]]
|
2022-01-11 03:24:51 +00:00
|
|
|
|
- [[#configuring-dashboard][Configuring Dashboard]]
|
|
|
|
|
- [[#dashboard-in-emacsclient][Dashboard in Emacsclient]]
|
2023-05-23 23:54:34 +00:00
|
|
|
|
- [[#dired][Dired]]
|
2022-01-11 03:24:51 +00:00
|
|
|
|
- [[#keybindings-to-open-dired][Keybindings To Open Dired]]
|
|
|
|
|
- [[#keybindings-within-dired][Keybindings Within 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]]
|
2023-05-23 23:54:34 +00:00
|
|
|
|
- [[#doom-theme][Doom theme]]
|
|
|
|
|
- [[#emojis][Emojis]]
|
|
|
|
|
- [[#evaluate-elisp-expressions][Evaluate elisp expressions]]
|
|
|
|
|
- [[#eww][Eww]]
|
|
|
|
|
- [[#fonts][Fonts]]
|
|
|
|
|
- [[#imenu][Imenu]]
|
|
|
|
|
- [[#insert-date][Insert date]]
|
|
|
|
|
- [[#ivy][Ivy]]
|
|
|
|
|
- [[#ivy-posframe][Ivy-posframe]]
|
|
|
|
|
- [[#ivy-keybindings][Ivy keybindings]]
|
|
|
|
|
- [[#line-settings][Line settings]]
|
|
|
|
|
- [[#markdown][Markdown]]
|
|
|
|
|
- [[#minimap][Minimap]]
|
|
|
|
|
- [[#modeline][Modeline]]
|
|
|
|
|
- [[#mouse-support][Mouse support]]
|
|
|
|
|
- [[#neotree][Neotree]]
|
|
|
|
|
- [[#open-specific-files][Open specific files]]
|
|
|
|
|
- [[#org-mode][Org mode]]
|
2022-07-05 20:57:42 +00:00
|
|
|
|
- [[#org-fonts][Org fonts]]
|
2022-01-11 03:24:51 +00:00
|
|
|
|
- [[#org-export][Org-export]]
|
|
|
|
|
- [[#org-journal][Org-journal]]
|
|
|
|
|
- [[#org-publish][Org-publish]]
|
2022-07-05 20:57:42 +00:00
|
|
|
|
- [[#org-auto-tangle][Org-auto-tangle]]
|
2023-05-23 23:54:34 +00:00
|
|
|
|
- [[#perspective][Perspective]]
|
|
|
|
|
- [[#rainbow-mode][Rainbow mode]]
|
|
|
|
|
- [[#registers][Registers]]
|
|
|
|
|
- [[#shells][Shells]]
|
|
|
|
|
- [[#splits][Splits]]
|
|
|
|
|
- [[#winner-mode][Winner mode]]
|
|
|
|
|
- [[#zap-to-char][Zap to char]]
|
|
|
|
|
- [[#transparency][Transparency]]
|
|
|
|
|
|
|
|
|
|
* 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. This config is a fork of
|
|
|
|
|
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:
|
2022-03-02 04:51:50 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(beacon-mode 1)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Bookmarks and buffers
|
2022-01-11 03:24:51 +00:00
|
|
|
|
Doom Emacs uses 'SPC b' for keybindings related to bookmarks and buffers.
|
|
|
|
|
|
|
|
|
|
** Bookmarks
|
2023-05-23 23:54:34 +00:00
|
|
|
|
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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+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
|
2023-05-23 23:54:34 +00:00
|
|
|
|
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 file’s 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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 |
|
|
|
|
|
|
2022-07-05 20:57:42 +00:00
|
|
|
|
** Global Auto Revert
|
2023-05-23 23:54:34 +00:00
|
|
|
|
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.
|
2022-07-05 20:57:42 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(global-auto-revert-mode 1)
|
|
|
|
|
(setq global-auto-revert-non-file-buffers t)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2022-01-11 03:24:51 +00:00
|
|
|
|
** 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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
This is a modification of: http://homepage3.nifty.com/oatu/emacs/calendar.html
|
|
|
|
|
See also: https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months
|
|
|
|
|
(defun dt/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 dt/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)))
|
|
|
|
|
(dt/year-calendar year)))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(run-hooks 'calendar-move-hook)))
|
|
|
|
|
|
|
|
|
|
(defun dt/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))
|
|
|
|
|
(dt/scroll-year-calendar-forward (- (or arg 1)) event))
|
|
|
|
|
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Scroll year calendar backward" "<left>" #'dt/scroll-year-calendar-backward
|
|
|
|
|
:desc "Scroll year calendar forward" "<right>" #'dt/scroll-year-calendar-forward)
|
|
|
|
|
|
|
|
|
|
(defalias 'year-calendar 'dt/year-calendar)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
Let's also play around with calfw.
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(use-package! calfw)
|
|
|
|
|
(use-package! calfw-org)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Dashboard
|
|
|
|
|
Emacs Dashboard is an extensible startup screen showing you recent files,
|
|
|
|
|
bookmarks, agenda items and an Emacs banner.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
** Configuring Dashboard
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(use-package dashboard
|
|
|
|
|
:init ;; tweak dashboard config before loading it
|
|
|
|
|
(setq dashboard-set-heading-icons t)
|
|
|
|
|
(setq dashboard-set-file-icons t)
|
|
|
|
|
(setq dashboard-banner-logo-title "\nKEYBINDINGS:\
|
|
|
|
|
\nFind file (SPC .) \
|
|
|
|
|
Open buffer list (SPC b i)\
|
|
|
|
|
\nFind recent files (SPC f r) \
|
|
|
|
|
Open the eshell (SPC e s)\
|
|
|
|
|
\nOpen dired file manager (SPC d d) \
|
|
|
|
|
List of keybindings (SPC h b b)")
|
|
|
|
|
;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner
|
2022-01-26 20:40:22 +00:00
|
|
|
|
(setq initial-buffer-choice (lambda () (get-buffer "*dashboard*")))
|
|
|
|
|
(setq dashboard-startup-banner "~/.config/doom/emacs-dash.txt") ;; use custom image as banner
|
2022-01-11 03:24:51 +00:00
|
|
|
|
(setq dashboard-center-content nil) ;; set to 't' for centered content
|
|
|
|
|
(setq dashboard-items '((recents . 5)
|
|
|
|
|
(agenda . 5 )
|
|
|
|
|
(bookmarks . 5)
|
|
|
|
|
(projects . 5)
|
|
|
|
|
(registers . 5)))
|
|
|
|
|
:config
|
|
|
|
|
(dashboard-setup-startup-hook)
|
|
|
|
|
(dashboard-modify-heading-icons '((recents . "file-text")
|
|
|
|
|
(bookmarks . "book"))))
|
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
** Dashboard in Emacsclient
|
|
|
|
|
This setting ensures that emacsclient always opens on *dashboard* rather than *scratch*.
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(setq doom-fallback-buffer "*dashboard*")
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Dired
|
|
|
|
|
Dired is the file manager within Emacs. Below, I setup keybindings for image
|
|
|
|
|
previews (peep-dired). Doom Emacs does not use 'SPC d' for any of its
|
|
|
|
|
keybindings, so I've chosen the format of 'SPC d' plus 'key'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
** Keybindings To Open Dired
|
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|------------+------------------------------------+------------|
|
|
|
|
|
| dired | /Open dired file manager/ | SPC d d |
|
|
|
|
|
| dired-jump | /Jump to current directory in dired/ | SPC d j |
|
|
|
|
|
|
|
|
|
|
** Keybindings Within Dired
|
|
|
|
|
*** Basic dired commands
|
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|-------------------------+---------------------------------------------+------------|
|
|
|
|
|
| dired-view-file | /View file in dired/ | SPC d v |
|
|
|
|
|
| dired-up-directory | /Go up in directory tree/ | h |
|
|
|
|
|
| dired-find-file | /Go down in directory tree (or open if file)/ | l |
|
|
|
|
|
| dired-next-line | Move down to next line | j |
|
|
|
|
|
| dired-previous-line | Move up to previous line | k |
|
|
|
|
|
| dired-mark | Mark file at point | m |
|
|
|
|
|
| dired-unmark | Unmark file at point | u |
|
|
|
|
|
| dired-do-copy | Copy current file or marked files | C |
|
|
|
|
|
| dired-do-rename | Rename current file or marked files | R |
|
|
|
|
|
| dired-hide-details | Toggle detailed listings on/off | ( |
|
|
|
|
|
| dired-git-info-mode | Toggle git information on/off | ) |
|
|
|
|
|
| dired-create-directory | Create new empty directory | + |
|
|
|
|
|
| dired-diff | Compare file at point with another | = |
|
|
|
|
|
| dired-subtree-toggle | Toggle viewing subtree at point | TAB |
|
|
|
|
|
|
|
|
|
|
*** Dired commands using regex
|
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|-------------------------+----------------------------+------------|
|
|
|
|
|
| dired-mark-files-regexp | Mark files using regex | % m |
|
|
|
|
|
| dired-do-copy-regexp | Copy files using regex | % C |
|
|
|
|
|
| dired-do-rename-regexp | Rename files using regex | % R |
|
|
|
|
|
| dired-mark-files-regexp | Mark all files using regex | * % |
|
|
|
|
|
|
|
|
|
|
*** File permissions and ownership
|
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|-----------------+----------------------------------+------------|
|
|
|
|
|
| dired-do-chgrp | Change the group of marked files | g G |
|
|
|
|
|
| dired-do-chmod | Change the mode of marked files | M |
|
|
|
|
|
| dired-do-chown | Change the owner of marked files | O |
|
|
|
|
|
| dired-do-rename | Rename file or all marked files | R |
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("d" . "dired")
|
|
|
|
|
:desc "Open dired" "d" #'dired
|
|
|
|
|
:desc "Dired jump to current" "j" #'dired-jump)
|
|
|
|
|
(:after dired
|
|
|
|
|
(:map dired-mode-map
|
|
|
|
|
:desc "Peep-dired image previews" "d p" #'peep-dired
|
|
|
|
|
:desc "Dired view file" "d v" #'dired-view-file)))
|
|
|
|
|
|
|
|
|
|
(evil-define-key 'normal dired-mode-map
|
|
|
|
|
(kbd "M-RET") 'dired-display-file
|
|
|
|
|
(kbd "h") 'dired-up-directory
|
|
|
|
|
(kbd "l") 'dired-open-file ; use dired-find-file instead of dired-open.
|
|
|
|
|
(kbd "m") 'dired-mark
|
|
|
|
|
(kbd "t") 'dired-toggle-marks
|
|
|
|
|
(kbd "u") 'dired-unmark
|
|
|
|
|
(kbd "C") 'dired-do-copy
|
|
|
|
|
(kbd "D") 'dired-do-delete
|
|
|
|
|
(kbd "J") 'dired-goto-file
|
|
|
|
|
(kbd "M") 'dired-do-chmod
|
|
|
|
|
(kbd "O") 'dired-do-chown
|
|
|
|
|
(kbd "P") 'dired-do-print
|
|
|
|
|
(kbd "R") 'dired-do-rename
|
|
|
|
|
(kbd "T") 'dired-do-touch
|
|
|
|
|
(kbd "Y") 'dired-copy-filenamecopy-filename-as-kill ; copies filename to kill ring.
|
|
|
|
|
(kbd "+") 'dired-create-directory
|
|
|
|
|
(kbd "-") 'dired-up-directory
|
|
|
|
|
(kbd "% l") 'dired-downcase
|
|
|
|
|
(kbd "% u") 'dired-upcase
|
|
|
|
|
(kbd "; d") 'epa-dired-do-decrypt
|
|
|
|
|
(kbd "; e") 'epa-dired-do-encrypt)
|
|
|
|
|
;; Get file icons in dired
|
|
|
|
|
(add-hook 'dired-mode-hook 'all-the-icons-dired-mode)
|
|
|
|
|
;; With dired-open plugin, you can launch external programs for certain extensions
|
|
|
|
|
;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv'
|
|
|
|
|
(setq dired-open-extensions '(("gif" . "sxiv")
|
|
|
|
|
("jpg" . "sxiv")
|
|
|
|
|
("png" . "sxiv")
|
|
|
|
|
("mkv" . "mpv")
|
|
|
|
|
("mp4" . "mpv")))
|
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
** Keybindings Within Dired With Peep-Dired-Mode Enabled
|
2023-05-23 23:54:34 +00:00
|
|
|
|
If peep-dired is enabled, you will get image previews as you go up/down with 'j'
|
|
|
|
|
and 'k'
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Doom theme
|
|
|
|
|
Setting the theme to doom-gruvbox. To try out new themes, I set a keybinding for
|
|
|
|
|
counsel-load-theme with 'SPC h t'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2023-01-23 00:19:10 +00:00
|
|
|
|
(setq doom-theme 'doom-gruvbox)
|
2022-01-11 03:24:51 +00:00
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Load new theme" "h t" #'counsel-load-theme)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Emojis
|
|
|
|
|
Emojify is an Emacs extension to display emojis. It can display github style
|
|
|
|
|
emojis like :smile: or plain ascii ones like :).
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(use-package emojify
|
|
|
|
|
:hook (after-init . global-emojify-mode))
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Evaluate elisp expressions
|
|
|
|
|
Changing some keybindings from their defaults to better fit with Doom Emacs, and
|
|
|
|
|
to avoid conflicts with my window managers which sometimes use the control key
|
|
|
|
|
in their keybindings. By default, Doom Emacs does not use 'SPC e' for anything,
|
|
|
|
|
so I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e'
|
|
|
|
|
for 'eww' keybindings).
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|-----------------+----------------------------------------------+------------|
|
|
|
|
|
| eval-buffer | /Evaluate elisp in buffer/ | SPC e b |
|
|
|
|
|
| eval-defun | /Evaluate the defun containing or after point/ | SPC e d |
|
|
|
|
|
| eval-expression | /Evaluate an elisp expression/ | SPC e e |
|
|
|
|
|
| eval-last-sexp | /Evaluate elisp expression before point/ | SPC e l |
|
|
|
|
|
| eval-region | /Evaluate elisp in region/ | SPC e r |
|
|
|
|
|
|
|
|
|
|
#+Begin_src emacs-lisp
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("e". "evaluate/EWW")
|
|
|
|
|
:desc "Evaluate elisp in buffer" "b" #'eval-buffer
|
|
|
|
|
:desc "Evaluate defun" "d" #'eval-defun
|
|
|
|
|
:desc "Evaluate elisp expression" "e" #'eval-expression
|
|
|
|
|
:desc "Evaluate last sexpression" "l" #'eval-last-sexp
|
|
|
|
|
:desc "Evaluate elisp in region" "r" #'eval-region))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Eww
|
|
|
|
|
EWW is the Emacs Web Wowser, the builtin browser in Emacs. Below I set urls to
|
|
|
|
|
open in a specific browser (eww) with browse-url-browser-function. By default,
|
|
|
|
|
Doom Emacs does not use 'SPC e' for anything, so I choose to use the format 'SPC
|
|
|
|
|
e' plus 'key' for these (I also use 'SPC e' for 'eval' keybindings). I chose to
|
|
|
|
|
use 'SPC s w' for eww-search-words because Doom Emacs uses 'SPC s' for 'search'
|
|
|
|
|
commands.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq browse-url-browser-function 'eww-browse-url)
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Search web for text between BEG/END"
|
|
|
|
|
"s w" #'eww-search-words
|
|
|
|
|
(:prefix ("e" . "evaluate/EWW")
|
|
|
|
|
:desc "Eww web browser" "w" #'eww
|
|
|
|
|
:desc "Eww reload page" "R" #'eww-reload))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Fonts
|
2022-01-11 03:24:51 +00:00
|
|
|
|
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 15)
|
2022-07-05 20:57:42 +00:00
|
|
|
|
doom-variable-pitch-font (font-spec :family "mononoki Nerd Font" :size 15)
|
2022-01-11 03:24:51 +00:00
|
|
|
|
doom-big-font (font-spec :family "mononoki Nerd Font" :size 20))
|
|
|
|
|
(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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Imenu
|
|
|
|
|
Imenu produces menus for accessing locations in documents, typically in the
|
|
|
|
|
current buffer. You can access the locations using an ordinary menu (menu bar or
|
|
|
|
|
other) or using minibuffer completion, or you can install 'imenu-list' and have
|
|
|
|
|
the imenu displayed as a vertical split that you can toggle show/hide.
|
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|-------------------------+----------------------------------+------------|
|
|
|
|
|
| counsel-imenu | /Menu to jump to places in buffer/ | SPC s i |
|
|
|
|
|
| imenu-list-smart-toggle | /Toggle imenu shown in a sidebar/ | SPC t i |
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(setq imenu-list-focus-after-activation t)
|
|
|
|
|
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("s" . "Search")
|
|
|
|
|
:desc "Menu to jump to places in buffer" "i" #'counsel-imenu))
|
|
|
|
|
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("t" . "Toggle")
|
|
|
|
|
:desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle))
|
|
|
|
|
|
|
|
|
|
#+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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| COMMAND | EXAMPLE OUTPUT | KEYBINDING |
|
|
|
|
|
|-----------------------+---------------------------+-----------------------|
|
|
|
|
|
| dt/insert-todays-date | Friday, November 19, 2021 | SPC i d t |
|
|
|
|
|
| dt/insert-todays-date | 11-19-2021 | SPC u SPC i d t |
|
|
|
|
|
| dt/insert-todays-date | 2021-11-19 | SPC u SPC u SPC i d t |
|
|
|
|
|
| dt/insert-any-date | Friday, November 19, 2021 | SPC i d a |
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(defun dt/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 dt/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" #'dt/insert-any-date
|
|
|
|
|
:desc "Insert todays date" "t" #'dt/insert-todays-date))
|
|
|
|
|
#+end_src
|
2022-03-02 04:51:50 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Ivy
|
2022-01-11 03:24:51 +00:00
|
|
|
|
Ivy is a generic completion mechanism for Emacs.
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
** 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
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
# Available functions (positions) for 'ivy-posframe-display-functions-alist'
|
2022-01-11 03:24:51 +00:00
|
|
|
|
+ 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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
=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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
** Ivy keybindings
|
|
|
|
|
By default, Doom Emacs does not use 'SPC v', so the format I use for these
|
|
|
|
|
bindings is 'SPC v' plus 'key'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Markdown
|
2022-07-05 20:57:42 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(custom-set-faces
|
|
|
|
|
'(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "variable-pitch"))))
|
|
|
|
|
'(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7))))
|
|
|
|
|
'(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6))))
|
|
|
|
|
'(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5))))
|
|
|
|
|
'(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4))))
|
|
|
|
|
'(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3))))
|
|
|
|
|
'(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2)))))
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Minimap
|
|
|
|
|
A minimap sidebar displaying a smaller version of the current buffer on either
|
|
|
|
|
the left or right side. It highlights the currently shown region and updates its
|
|
|
|
|
position automatically. Be aware that this minimap program does not work in Org
|
|
|
|
|
documents. This is not unusual though because I have tried several minimap
|
|
|
|
|
programs and none of them can handle Org.
|
2022-03-02 04:51:50 +00:00
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|--------------+-------------------------------------------+------------|
|
|
|
|
|
| minimap-mode | /Toggle minimap-mode/ | SPC t m |
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(setq minimap-window-location 'right)
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("t" . "toggle")
|
|
|
|
|
:desc "Toggle minimap-mode" "m" #'minimap-mode))
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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:
|
2022-01-11 03:24:51 +00:00
|
|
|
|
https://github.com/seagle0128/doom-modeline
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
2022-07-05 20:57:42 +00:00
|
|
|
|
(set-face-attribute 'mode-line nil :font "mononoki Nerd Font-13")
|
2022-01-11 03:24:51 +00:00
|
|
|
|
(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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Mouse support
|
2022-01-11 03:24:51 +00:00
|
|
|
|
Adding mouse support in the terminal version of Emacs.
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(xterm-mouse-mode 1)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Neotree
|
|
|
|
|
Neotree is a file tree viewer. When you open neotree, it jumps to the current
|
|
|
|
|
file thanks to neo-smart-open. The neo-window-fixed-size setting makes the
|
|
|
|
|
neotree width be adjustable. Doom Emacs had no keybindings set for neotree.
|
|
|
|
|
Since Doom Emacs uses 'SPC t' for 'toggle' keybindings, I used 'SPC t n' for
|
|
|
|
|
toggle-neotree.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|----------------+---------------------------+------------|
|
|
|
|
|
| neotree-toggle | /Toggle neotree/ | SPC t n |
|
|
|
|
|
| neotree- dir | /Open directory in neotree/ | SPC d n |
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(after! neotree
|
|
|
|
|
(setq neo-smart-open t
|
|
|
|
|
neo-window-fixed-size nil))
|
|
|
|
|
(after! doom-themes
|
|
|
|
|
(setq doom-neotree-enable-variable-pitch t))
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Toggle neotree file viewer" "t n" #'neotree-toggle
|
|
|
|
|
:desc "Open directory in neotree" "d n" #'neotree-dir)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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 ='.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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 |
|
|
|
|
|
| ~/.config/doom/eshell/aliases" | /Edit eshell aliases/ | SPC = e a |
|
|
|
|
|
| ~/.config/doom/eshell/profile" | /Edit eshell profile/ | SPC = e 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"))))
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("= e" . "open eshell files")
|
|
|
|
|
:desc "Edit eshell aliases" "a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases"))
|
|
|
|
|
:desc "Edit eshell profile" "p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
=NOTE:= I have the location of my Org directory and Roam directory in $HOME/nc/
|
|
|
|
|
which is a Nextcloud folder that allows me to instantly sync all of my Org work
|
|
|
|
|
between my home computer and my office computer.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Org babel tangle" "m B" #'org-babel-tangle)
|
|
|
|
|
(after! org
|
|
|
|
|
(setq org-directory "~/nc/Org/"
|
|
|
|
|
org-agenda-files '("~/nc/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
|
|
|
|
|
"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
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2022-07-05 20:57:42 +00:00
|
|
|
|
** Org fonts
|
2023-05-23 23:54:34 +00:00
|
|
|
|
I have created an interactive function for each color scheme (M-x
|
|
|
|
|
dt/org-colors-*). These functions will set appropriate colors and font
|
|
|
|
|
attributes for org-level fonts and the org-table font.
|
|
|
|
|
|
2022-01-11 03:24:51 +00:00
|
|
|
|
#+begin_src emacs-lisp
|
2022-07-05 20:57:42 +00:00
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-doom-one ()
|
|
|
|
|
"Enable Doom One colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#51afef" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#c678dd" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#98be65" bold)
|
|
|
|
|
(org-level-4 1.4 "#da8548" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#5699af" normal)
|
|
|
|
|
(org-level-6 1.2 "#a9a1e1" normal)
|
|
|
|
|
(org-level-7 1.1 "#46d9ff" normal)
|
|
|
|
|
(org-level-8 1.0 "#ff6c6b" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-dracula ()
|
|
|
|
|
"Enable Dracula colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#8be9fd" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#bd93f9" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#50fa7b" bold)
|
|
|
|
|
(org-level-4 1.4 "#ff79c6" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#9aedfe" normal)
|
|
|
|
|
(org-level-6 1.2 "#caa9fa" normal)
|
|
|
|
|
(org-level-7 1.1 "#5af78e" normal)
|
|
|
|
|
(org-level-8 1.0 "#ff92d0" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-gruvbox-dark ()
|
|
|
|
|
"Enable Gruvbox Dark colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#458588" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#b16286" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#98971a" bold)
|
|
|
|
|
(org-level-4 1.4 "#fb4934" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#83a598" normal)
|
|
|
|
|
(org-level-6 1.2 "#d3869b" normal)
|
|
|
|
|
(org-level-7 1.1 "#d79921" normal)
|
|
|
|
|
(org-level-8 1.0 "#8ec07c" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-monokai-pro ()
|
|
|
|
|
"Enable Monokai Pro colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#78dce8" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#ab9df2" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#a9dc76" bold)
|
|
|
|
|
(org-level-4 1.4 "#fc9867" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#ff6188" normal)
|
|
|
|
|
(org-level-6 1.2 "#ffd866" normal)
|
|
|
|
|
(org-level-7 1.1 "#78dce8" normal)
|
|
|
|
|
(org-level-8 1.0 "#ab9df2" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-nord ()
|
|
|
|
|
"Enable Nord colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#81a1c1" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#b48ead" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#a3be8c" bold)
|
|
|
|
|
(org-level-4 1.4 "#ebcb8b" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#bf616a" normal)
|
|
|
|
|
(org-level-6 1.2 "#88c0d0" normal)
|
|
|
|
|
(org-level-7 1.1 "#81a1c1" normal)
|
|
|
|
|
(org-level-8 1.0 "#b48ead" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-oceanic-next ()
|
|
|
|
|
"Enable Oceanic Next colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#6699cc" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#c594c5" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#99c794" bold)
|
|
|
|
|
(org-level-4 1.4 "#fac863" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#5fb3b3" normal)
|
|
|
|
|
(org-level-6 1.2 "#ec5f67" normal)
|
|
|
|
|
(org-level-7 1.1 "#6699cc" normal)
|
|
|
|
|
(org-level-8 1.0 "#c594c5" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-palenight ()
|
|
|
|
|
"Enable Palenight colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#82aaff" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#c792ea" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#c3e88d" bold)
|
|
|
|
|
(org-level-4 1.4 "#ffcb6b" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#a3f7ff" normal)
|
|
|
|
|
(org-level-6 1.2 "#e1acff" normal)
|
|
|
|
|
(org-level-7 1.1 "#f07178" normal)
|
|
|
|
|
(org-level-8 1.0 "#ddffa7" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-solarized-dark ()
|
|
|
|
|
"Enable Solarized Dark colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#268bd2" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#d33682" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#859900" bold)
|
|
|
|
|
(org-level-4 1.4 "#b58900" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#cb4b16" normal)
|
|
|
|
|
(org-level-6 1.2 "#6c71c4" normal)
|
|
|
|
|
(org-level-7 1.1 "#2aa198" normal)
|
|
|
|
|
(org-level-8 1.0 "#657b83" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-solarized-light ()
|
|
|
|
|
"Enable Solarized Light colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#268bd2" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#d33682" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#859900" bold)
|
|
|
|
|
(org-level-4 1.4 "#b58900" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#cb4b16" normal)
|
|
|
|
|
(org-level-6 1.2 "#6c71c4" normal)
|
|
|
|
|
(org-level-7 1.1 "#2aa198" normal)
|
|
|
|
|
(org-level-8 1.0 "#657b83" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
(defun dt/org-colors-tomorrow-night ()
|
|
|
|
|
"Enable Tomorrow Night colors for Org headers."
|
|
|
|
|
(interactive)
|
|
|
|
|
(dolist
|
|
|
|
|
(face
|
|
|
|
|
'((org-level-1 1.7 "#81a2be" ultra-bold)
|
|
|
|
|
(org-level-2 1.6 "#b294bb" extra-bold)
|
|
|
|
|
(org-level-3 1.5 "#b5bd68" bold)
|
|
|
|
|
(org-level-4 1.4 "#e6c547" semi-bold)
|
|
|
|
|
(org-level-5 1.3 "#cc6666" normal)
|
|
|
|
|
(org-level-6 1.2 "#70c0ba" normal)
|
|
|
|
|
(org-level-7 1.1 "#b77ee0" normal)
|
|
|
|
|
(org-level-8 1.0 "#9ec400" normal)))
|
|
|
|
|
(set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face)))
|
|
|
|
|
(set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf"))
|
|
|
|
|
|
|
|
|
|
;; Load our desired dt/org-colors-* theme on startup
|
2023-01-23 00:19:10 +00:00
|
|
|
|
(dt/org-colors-tomorrow-night)
|
2022-07-05 20:57:42 +00:00
|
|
|
|
|
2022-01-11 03:24:51 +00:00
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
** Org-export
|
2023-05-23 23:54:34 +00:00
|
|
|
|
We need ox-man for "Org eXporting" to manpage format and ox-gemini for exporting
|
|
|
|
|
to gemtext (for the gemini protocol).
|
|
|
|
|
|
|
|
|
|
=NOTE:= I also enable ox-publish for converting an Org site into an HTML site,
|
|
|
|
|
but that is done in init.el (org +publish).
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(use-package ox-man)
|
|
|
|
|
(use-package ox-gemini)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
|
|
** Org-journal
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(setq org-journal-dir "~/nc/Org/journal/"
|
|
|
|
|
org-journal-date-prefix "* "
|
|
|
|
|
org-journal-time-prefix "** "
|
|
|
|
|
org-journal-date-format "%B %d, %Y (%A) "
|
|
|
|
|
org-journal-file-format "%Y-%m-%d.org")
|
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
|
** Org-publish
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(setq org-publish-use-timestamps-flag nil)
|
|
|
|
|
(setq org-export-with-broken-links t)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2022-07-05 20:57:42 +00:00
|
|
|
|
** 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
2022-07-05 20:57:42 +00:00
|
|
|
|
(use-package! org-auto-tangle
|
|
|
|
|
:defer t
|
|
|
|
|
:hook (org-mode . org-auto-tangle-mode)
|
|
|
|
|
:config
|
|
|
|
|
(setq org-auto-tangle-default t))
|
|
|
|
|
|
2022-01-11 03:24:51 +00:00
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Perspective
|
|
|
|
|
Perspective provides multiple named workspaces (or "perspectives") in Emacs,
|
|
|
|
|
similar to having multiple desktops in window managers like Awesome and XMonad.
|
|
|
|
|
Each perspective has its own buffer list and its own window layout, making it
|
|
|
|
|
easy to work on many separate projects without getting lost in all the buffers.
|
|
|
|
|
Switching to a perspective activates its window configuration, and when in a
|
|
|
|
|
perspective, only its buffers are available (by default). Doom Emacs uses 'SPC
|
|
|
|
|
some_key' for binding some of the perspective commands, so I used this binging
|
|
|
|
|
format for the perspective bindings that I created..
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| COMMAND | DESCRIPTION | KEYBINDING |
|
|
|
|
|
|----------------------------+-------------------------------------+------------|
|
|
|
|
|
| persp-switch | Switch to perspective NAME | SPC DEL |
|
|
|
|
|
| persp-switch-to-buffer | Switch to buffer in perspective | SPC , |
|
|
|
|
|
| persp-next | Switch to next perspective | SPC ] |
|
|
|
|
|
| persp-prev | Switch to previous perspective | SPC [ |
|
|
|
|
|
| persp-add-buffer | Add a buffer to current perspective | SPC + |
|
|
|
|
|
| persp-remove-by-name | Remove perspective by name | SPC - |
|
|
|
|
|
| +workspace/switch-to-{0-9} | Switch to workspace /n/ | SPC 0-9 |
|
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Switch to perspective NAME" "DEL" #'persp-switch
|
|
|
|
|
:desc "Switch to buffer in perspective" "," #'persp-switch-to-buffer
|
|
|
|
|
:desc "Switch to next perspective" "]" #'persp-next
|
|
|
|
|
:desc "Switch to previous perspective" "[" #'persp-prev
|
|
|
|
|
:desc "Add a buffer current perspective" "+" #'persp-add-buffer
|
|
|
|
|
:desc "Remove perspective by name" "-" #'persp-remove-by-name)
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+begin_src emacs-lisp
|
|
|
|
|
(define-globalized-minor-mode global-rainbow-mode rainbow-mode
|
|
|
|
|
(lambda () (rainbow-mode 1)))
|
|
|
|
|
(global-rainbow-mode 1 )
|
|
|
|
|
#+end_src
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Shells
|
2022-01-11 03:24:51 +00:00
|
|
|
|
Settings for the various shells and terminal emulators within Emacs.
|
2023-05-23 23:54:34 +00:00
|
|
|
|
+ 'shell-file-name' -- sets the shell to be used in M-x shell, M-x term, M-x
|
|
|
|
|
ansi-term and M-x vterm.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
+ 'eshell-aliases-file' -- sets an aliases file for the eshell.
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2023-05-23 23:54:34 +00:00
|
|
|
|
(setq shell-file-name "/bin/bash"
|
2022-01-11 03:24:51 +00:00
|
|
|
|
vterm-max-scrollback 5000)
|
|
|
|
|
(setq eshell-rc-script "~/.config/doom/eshell/profile"
|
|
|
|
|
eshell-aliases-file "~/.config/doom/eshell/aliases"
|
|
|
|
|
eshell-history-size 5000
|
|
|
|
|
eshell-buffer-maximum-lines 5000
|
|
|
|
|
eshell-hist-ignoredups t
|
|
|
|
|
eshell-scroll-to-bottom-on-input t
|
|
|
|
|
eshell-destroy-buffer-when-process-dies t
|
|
|
|
|
eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh"))
|
|
|
|
|
(map! :leader
|
|
|
|
|
:desc "Eshell" "e s" #'eshell
|
|
|
|
|
:desc "Eshell popup toggle" "e t" #'+eshell/toggle
|
|
|
|
|
:desc "Counsel eshell history" "e h" #'counsel-esh-history
|
|
|
|
|
:desc "Vterm popup toggle" "v t" #'+vterm/toggle)
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+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
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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>'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
|
(map! :leader
|
|
|
|
|
(:prefix ("w" . "window")
|
|
|
|
|
:desc "Winner redo" "<right>" #'winner-redo
|
|
|
|
|
:desc "Winner undo" "<left>" #'winner-undo))
|
|
|
|
|
#+END_SRC
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* 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:
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
| 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' |
|
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
=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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
'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.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
=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'.
|
2022-01-11 03:24:51 +00:00
|
|
|
|
|
|
|
|
|
#+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
|
2022-12-17 01:48:07 +00:00
|
|
|
|
|
2023-05-23 23:54:34 +00:00
|
|
|
|
* Transparency
|
2023-01-23 05:25:33 +00:00
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2023-05-23 23:54:34 +00:00
|
|
|
|
(set-frame-parameter (selected-frame) 'alpha '(98 . 80))
|
|
|
|
|
(add-to-list 'default-frame-alist '(alpha . (98 . 80)))
|
2023-01-23 05:25:33 +00:00
|
|
|
|
#+END_SRC
|