From e43252707516aeb2a8d563d7d78c4388d7ad9205 Mon Sep 17 00:00:00 2001 From: Derek Taylor Date: Tue, 20 Apr 2021 17:55:56 -0500 Subject: [PATCH] Adding GNU Emacs configs. --- .emacs.d/config.org | 769 ++++++++++++++++++++++++++++++++++++++++ .emacs.d/emacs-dash.png | Bin 0 -> 36692 bytes .emacs.d/init.el | 53 +-- 3 files changed, 786 insertions(+), 36 deletions(-) create mode 100644 .emacs.d/config.org create mode 100644 .emacs.d/emacs-dash.png diff --git a/.emacs.d/config.org b/.emacs.d/config.org new file mode 100644 index 0000000..5d93756 --- /dev/null +++ b/.emacs.d/config.org @@ -0,0 +1,769 @@ +#+TITLE: DT's GNU Emacs Config +#+AUTHOR: Derek Taylor (DT) +#+DESCRIPTION: DT's personal Emacs config. +#+STARTUP: showeverything +#+EXPORT_FILE_NAME: /home/dt/Org/html/config.html +#+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-readtheorg.setup +#+OPTIONS: num:nil ^:{} + +* TABLE OF CONTENTS :TOC: +- [[#important-put-this-in-your-initel][IMPORTANT! PUT THIS IN YOUR INIT.EL]] +- [[#about-this-config][ABOUT THIS CONFIG]] +- [[#a-few-programs-to-load-first][A FEW PROGRAMS TO LOAD FIRST]] + - [[#setup-packageel-to-work-with-melpa][Setup Package.el To Work With MELPA]] + - [[#use-package][Use-Package]] + - [[#evil-mode][Evil Mode]] + - [[#general-keybindings][General Keybindings]] +- [[#all-the-icons][ALL THE ICONS]] +- [[#buffers-and-bookmarks][BUFFERS AND BOOKMARKS]] +- [[#dashboard][DASHBOARD]] + - [[#configuring-dashboard][Configuring Dashboard]] + - [[#dashboard-in-emacsclient][Dashboard in Emacsclient]] +- [[#elfeed][ELFEED]] +- [[#evaluate-elisp-expressions][EVALUATE ELISP EXPRESSIONS]] +- [[#file-manager-dired][FILE MANAGER (DIRED)]] + - [[#keybindings-to-open-dired][Keybindings To Open Dired]] + - [[#keybindings-within-dired][Keybindings Within Dired]] + - [[#keybindings-for-peep-dired-mode][Keybindings For Peep-Dired-Mode]] +- [[#files][FILES]] + - [[#file-related-keybindings][File-related Keybindings]] + - [[#installing-some-useful-file-related-modules][Installing Some Useful File-related Modules]] + - [[#useful-file-functions][Useful File Functions]] +- [[#fonts][FONTS]] + - [[#setting-the-font-face][Setting The Font Face]] + - [[#zooming-in-and-out][Zooming In and Out]] +- [[#general-keybindings-1][GENERAL KEYBINDINGS]] +- [[#graphical-user-interface-tweaks][GRAPHICAL USER INTERFACE TWEAKS]] + - [[#disable-menubar-toolbars-and-scrollbars][Disable Menubar, Toolbars and Scrollbars]] + - [[#display-line-numbers-and-truncated-lines][Display Line Numbers and Truncated Lines]] + - [[#change-modeline-to-dooms-modeline][Change Modeline To Doom's Modeline]] +- [[#ivy-counselswiper][IVY (COUNSEL/SWIPER)]] + - [[#installing-ivy-and-basic-setup][Installing Ivy And Basic Setup]] + - [[#making-m-x-great-again][Making M-x Great Again!]] + - [[#ivy-posframe][Ivy-posframe]] +- [[#language-support][LANGUAGE SUPPORT]] +- [[#magit][MAGIT]] +- [[#org-mode][ORG MODE]] + - [[#defining-a-few-things][Defining A Few Things]] + - [[#enabling-org-bullets][Enabling Org Bullets]] + - [[#org-link-abbreviations][Org Link Abbreviations]] + - [[#org-todo-keywords][Org Todo Keywords]] + - [[#source-code-block-tag-expansion][Source Code Block Tag Expansion]] + - [[#source-code-block-syntax-highlighting][Source Code Block Syntax Highlighting]] + - [[#automatically-create-table-of-contents][Automatically Create Table of Contents]] +- [[#projectile][PROJECTILE]] +- [[#registers][REGISTERS]] +- [[#scrolling][SCROLLING]] +- [[#shells][SHELLS]] + - [[#eshell][Eshell]] + - [[#vterm][Vterm]] +- [[#splits-and-window-controls][SPLITS AND WINDOW CONTROLS]] +- [[#theme][THEME]] +- [[#which-key][WHICH KEY]] + +* IMPORTANT! PUT THIS IN YOUR INIT.EL +I don't want to use init.el to config Emacs. I want to use an org file to config Emacs because I like literate configs with lots of comments. The following code block should be your init.el. This tells init.el to use the source code blocks from this file (config.org). + +#+begin_example +(org-babel-load-file + (expand-file-name + "config.org" + user-emacs-directory)) +#+end_example + +* ABOUT THIS CONFIG +This is my personal Emacs config. I patterned my config to mimic Doom Emacs, which 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 and Odysee look at my configs as "documentation". + +* A FEW PROGRAMS TO LOAD FIRST +The order in which the various Emacs modules load is very important. So the very first code block is going to contain essential modules that many other modules will depend on later in this config. + +** Setup Package.el To Work With MELPA +#+begin_src emacs-lisp +(require 'package) +(add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/")) +(package-refresh-contents) +(package-initialize) +#+end_src + +** Use-Package +Install use-package and enable ':ensure t' globally. The ':ensure' keyword causes the package(s) within use-package statements to be installed automatically if not already present on your system. To avoid having to add ':ensure t' to every use-package statement in this config, I set 'use-package-always-ensure'. + +#+begin_src emacs-lisp +(unless (package-installed-p 'use-package) + (package-install 'use-package)) +(setq use-package-always-ensure t) +#+end_src + +** Evil Mode +Evil is an extensible 'vi' layer for Emacs. It emulates the main features of Vim, and provides facilities for writing custom extensions. Evil Collection is also installed since it adds 'evil' bindings to parts of Emacs that the standard Evil package does not cover, such as: calenda, help-mode adn ibuffer. + +#+begin_src emacs-lisp +(use-package evil + :init ;; tweak evil's configuration before loading it + (setq evil-want-integration t) ;; This is optional since it's already set to t by default. + (setq evil-want-keybinding nil) + (setq evil-vsplit-window-right t) + (setq evil-split-window-below t) + (evil-mode)) +(use-package evil-collection + :after evil + :config + (setq evil-collection-mode-list '(dashboard dired ibuffer)) + (evil-collection-init)) +#+end_src + +** General Keybindings +General.el allows us to set keybindings. As a longtime Doom Emacs user, I have grown accustomed to using SPC as the prefix key. General makes setting keybindings (especially with SPC) much easier. All of the keybindings we set later in the config depend on general being loaded. + +#+begin_src emacs-lisp +(use-package general + :config + (general-evil-setup t)) +#+end_src + +* ALL THE ICONS +This is an icon set that can be used with dashboard, dired, ibuffer and other Emacs programs. + +#+begin_src emacs-lisp +(use-package all-the-icons) +#+end_src + +* BUFFERS AND BOOKMARKS + +#+begin_src emacs-lisp +(nvmap :prefix "SPC" + "b b" '(ibuffer :which-key "Ibuffer") + "b c" '(clone-indirect-buffer-other-window :which-key "Clone indirect buffer other window") + "b k" '(kill-current-buffer :which-key "Kill current buffer") + "b n" '(next-buffer :which-key "Next buffer") + "b p" '(previous-buffer :which-key "Previous buffer") + "b B" '(ibuffer-list-buffers :which-key "Ibuffer list buffers") + "b K" '(kill-buffer :which-key "Kill buffer")) +#+end_src + +* DASHBOARD +Emacs Dashboard is an extensible startup screen showing you recent files, bookmarks, agenda items and an Emacs banner. + +** 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 "Emacs Is More Than A Text Editor!") + ;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner + (setq dashboard-startup-banner "/home/dt/.emacs.d/emacs-dash.png") ;; use custom image as banner + (setq dashboard-center-content nil) ;; set to 't' for centered content + (setq dashboard-items '((recents . 5) + (agenda . 5 ) + (bookmarks . 3) + (projects . 3) + (registers . 3))) + :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 initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) +#+end_src + +* ELFEED +An RSS newsfeed reader for Emacs. + +#+begin_src emacs-lisp +(use-package elfeed + :config + (setq elfeed-search-feed-face ":foreground #fff :weight bold" + elfeed-feeds (quote + (("https://www.reddit.com/r/linux.rss" reddit linux) + ("https://www.reddit.com/r/commandline.rss" reddit commandline) + ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) + ("https://www.reddit.com/r/emacs.rss" reddit emacs) + ("https://www.gamingonlinux.com/article_rss.php" gaming linux) + ("https://hackaday.com/blog/feed/" hackaday linux) + ("https://opensource.com/feed" opensource linux) + ("https://linux.softpedia.com/backend.xml" softpedia linux) + ("https://itsfoss.com/feed/" itsfoss linux) + ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) + ("https://www.phoronix.com/rss.php" phoronix linux) + ("http://feeds.feedburner.com/d0od" omgubuntu linux) + ("https://www.computerworld.com/index.rss" computerworld linux) + ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) + ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) + ("https://betanews.com/feed" betanews linux) + ("http://lxer.com/module/newswire/headlines.rss" lxer linux) + ("https://distrowatch.com/news/dwd.xml" distrowatch linux))))) + +(use-package elfeed-goodies + :init + (elfeed-goodies/setup) + :config + (setq elfeed-goodies/entry-pane-size 0.5)) + +(add-hook 'elfeed-show-mode-hook 'visual-line-mode) +(evil-define-key 'normal elfeed-show-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(evil-define-key 'normal elfeed-search-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +#+end_src + +* EVALUATE ELISP EXPRESSIONS +I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e' for 'eww' keybindings). + +| 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 +(nvmap :states '(normal visual) :keymaps 'override :prefix "SPC" + "e b" '(eval-buffer :which-key "Eval elisp in buffer") + "e d" '(eval-defun :which-key "Eval defun") + "e e" '(eval-expression :which-key "Eval elisp expression") + "e l" '(eval-last-sexp :which-key "Eval last sexression") + "e r" '(eval-region :which-key "Eval region")) +#+end_src + +* FILE MANAGER (DIRED) +Dired is the file manager within Emacs. Below, I setup keybindings for image previews (peep-dired). I've chosen the format of 'SPC d' plus 'key'. + +** 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 +| 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 | + +** Keybindings For Peep-Dired-Mode +| 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 +(use-package all-the-icons-dired) +(use-package dired-open) +(use-package peep-dired) + +(nvmap :states '(normal visual) :keymaps 'override :prefix "SPC" + "d d" '(dired :which-key "Open dired") + "d j" '(dired-jump :which-key "Dired jump to current") + "d p" '(peep-dired :which-key "Peep-dired")) + +(with-eval-after-load 'dired + ;;(define-key dired-mode-map (kbd "M-p") 'peep-dired) + (evil-define-key 'normal dired-mode-map (kbd "h") 'dired-up-directory) + (evil-define-key 'normal dired-mode-map (kbd "l") 'dired-open-file) ; use dired-find-file instead if not using dired-open package + (evil-define-key 'normal peep-dired-mode-map (kbd "j") 'peep-dired-next-file) + (evil-define-key 'normal peep-dired-mode-map (kbd "k") 'peep-dired-prev-file)) + +(add-hook 'peep-dired-hook 'evil-normalize-keymaps) +;; Get file icons in dired +(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) +;; With dired-open plugin, you can launch external programs for certain extensions +;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv' +(setq dired-open-extensions '(("gif" . "sxiv") + ("jpg" . "sxiv") + ("png" . "sxiv") + ("mkv" . "mpv") + ("mp4" . "mpv"))) +#+end_src + +* FILES +** File-related Keybindings + +#+begin_src emacs-lisp +(nvmap :states '(normal visual) :keymaps 'override :prefix "SPC" + "." '(find-file :which-key "Find file") + "f f" '(find-file :which-key "Find file") + "f r" '(counsel-recentf :which-key "Recent files") + "f s" '(save-buffer :which-key "Save file") + "f u" '(sudo-edit-find-file :which-key "Sudo find file") + "f y" '(dt/show-and-copy-buffer-path :which-key "Yank file path") + "f C" '(copy-file :which-key "Copy file") + "f D" '(delete-file :which-key "Delete file") + "f R" '(rename-file :which-key "Rename file") + "f S" '(write-file :which-key "Save file as...") + "f U" '(sudo-edit :which-key "Sudo edit file")) +#+end_src + +** Installing Some Useful File-related Modules +Though 'recentf' is one way to find recent files although I prefer using 'counsel-recentf'. + +#+begin_src emacs-lisp +(use-package recentf + :config + (recentf-mode)) +(use-package sudo-edit) ;; Utilities for opening files with sudo + +#+end_src + +** Useful File Functions +#+begin_src emacs-lisp +(defun dt/show-and-copy-buffer-path () + "Show and copy the full path to the current file in the minibuffer." + (interactive) + ;; list-buffers-directory is the variable set in dired buffers + (let ((file-name (or (buffer-file-name) list-buffers-directory))) + (if file-name + (message (kill-new file-name)) + (error "Buffer not visiting a file")))) +(defun dt/show-buffer-path-name () + "Show the full path to the current file in the minibuffer." + (interactive) + (let ((file-name (buffer-file-name))) + (if file-name + (progn + (message file-name) + (kill-new file-name)) + (error "Buffer not visiting a file")))) +#+end_src + +* FONTS +Defining our fonts. Right now I'm using Source Code Pro (SauceCodePro) from the nerd-fonts repository. Installed from the AUR, it does =NOT= include all variations of the font (such as italics). You can download the italics Source Code Pro font from the nerd-fonts GitHub though. + +** Setting The Font Face +#+begin_src emacs-lisp +(set-face-attribute 'default nil + :font "Source Code Pro" + :height 110 + :weight 'medium) +(set-face-attribute 'variable-pitch nil + :font "Ubuntu Nerd Font" + :height 120 + :weight 'medium) +(set-face-attribute 'fixed-pitch nil + :font "Source Code Pro" + :height 110 + :weight 'medium) +;; Makes commented text and keywords italics. +;; This is working in emacsclient but not emacs. +;; Your font must have an italic face available. +(set-face-attribute 'font-lock-comment-face nil + :slant 'italic) +(set-face-attribute 'font-lock-keyword-face nil + :slant 'italic) + +;; Uncomment the following line if line spacing needs adjusting. +(setq-default line-spacing 0.12) + +;; Needed if using emacsclient. Otherwise, your fonts will be smaller than expected. +(add-to-list 'default-frame-alist '(font . "Source Code Pro-11")) +;; changes certain keywords to symbols, such as lamda! +(setq global-prettify-symbols-mode t) +#+end_src + +** Zooming In and Out +You can use the bindings CTRL plus =/- for zooming in/out. You can also use CTRL plus the mouse wheel for zooming in/out. + +#+begin_src emacs-lisp +;; zoom in/out like we do everywhere else. +(global-set-key (kbd "C-=") 'text-scale-increase) +(global-set-key (kbd "C--") 'text-scale-decrease) +(global-set-key (kbd "") 'text-scale-increase) +(global-set-key (kbd "") 'text-scale-decrease) +#+end_src + +* GENERAL KEYBINDINGS +General.el allows us to set keybindings. As a longtime Doom Emacs user, I have grown accustomed to using SPC as the prefix key. It certainly is easier on the hands than constantly using CTRL for a prefix. + +#+begin_src emacs-lisp +(nvmap :states '(normal visual) :keymaps 'override :prefix "SPC" + "SPC" '(counsel-M-x :which-key "M-x") + "c c" '(compile :which-key "Compile") + "c C" '(recompile :which-key "Recompile") + "h r r" '((lambda () (interactive) (load-file "~/.emacs.d/init.el")) :which-key "Reload emacs config") + "m e" '(org-export-dispatch :which-key "Org export dispatch") + "m B" '(org-babel-tangle :which-key "Org babel tangle") + "t t" '(toggle-truncate-lines :which-key "Toggle truncate lines")) +#+end_src + +* GRAPHICAL USER INTERFACE TWEAKS +Let's make GNU Emacs look a little better. + +** Disable Menubar, Toolbars and Scrollbars +#+begin_src emacs-lisp +(menu-bar-mode -1) +(tool-bar-mode -1) +(scroll-bar-mode -1) +#+end_src + +** Display Line Numbers and Truncated Lines +#+begin_src emacs-lisp +(global-display-line-numbers-mode 1) +(global-visual-line-mode t) +#+end_src + +** Change Modeline To Doom's Modeline +#+begin_src emacs-lisp +(use-package doom-modeline) +(doom-modeline-mode 1) +#+end_src + +* IVY (COUNSEL/SWIPER) +Ivy, counsel and swiper are a generic completion mechanism for Emacs. Ivy-rich allows us to add descriptions alongside the commands in M-x. + +** Installing Ivy And Basic Setup +#+begin_src emacs-lisp +(use-package counsel + :after ivy + :config (counsel-mode)) +(use-package ivy + :defer 0.1 + :diminish + :bind + (("C-c C-r" . ivy-resume) + ("C-x B" . ivy-switch-buffer-other-window)) + :custom + (setq ivy-count-format "(%d/%d) ") + (setq ivy-use-virtual-buffers t) + (setq enable-recursive-minibuffers t) + :config + (ivy-mode)) +(use-package ivy-rich + :after ivy + :custom + (ivy-virtual-abbreviate 'full + ivy-rich-switch-buffer-align-virtual-buffer t + ivy-rich-path-style 'abbrev) + :config + (ivy-set-display-transformer 'ivy-switch-buffer + 'ivy-rich-switch-buffer-transformer) + (ivy-rich-mode 1)) ;; this gets us descriptions in M-x. +(use-package swiper + :after ivy + :bind (("C-s" . swiper) + ("C-r" . swiper))) +#+end_src + +** Making M-x Great Again! +The following line removes the annoying '^' in things like counsel-M-x and other ivy/counsel prompts. The default '^' string means that if you type something immediately after this string only completion candidates that begin with what you typed are shown. Most of the time, I'm searching for a command without knowing what it begins with though. + +#+begin_src emacs-lisp +(setq ivy-initial-inputs-alist nil) +#+end_src + +Smex is a package the makes M-x remember our history. Now M-x will show our last used commands first. +#+begin_src emacs-lisp +(use-package smex) +(smex-initialize) +#+end_src + +** 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 + (use-package ivy-posframe + :init + (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))) + :config + (ivy-posframe-mode 1)) ; 1 enables posframe-mode, 0 disables it. +#+end_src + +* LANGUAGE SUPPORT +Adding packages for programming langauges, so we can have nice things like syntax highlighting. + +#+begin_src emacs-lisp +(use-package haskell-mode) +#+end_src + +* MAGIT +A git client for Emacs. Often cited as a killer feature for Emacs. + +#+begin_src emacs-lisp +(use-package magit) + #+end_src + +* ORG MODE +Org Mode is =THE= killer feature within Emacs. But it does need some tweaking. + +** Defining A Few Things +#+begin_src emacs-lisp +(add-hook 'org-mode-hook 'org-indent-mode) +(setq org-directory "~/Org/" + org-agenda-files '("~/Org/agenda.org") + org-default-notes-file (expand-file-name "notes.org" org-directory) + org-ellipsis " ▼ " + org-log-done 'time + org-journal-dir "~/Org/journal/" + org-journal-date-format "%B %d, %Y (%A) " + org-journal-file-format "%Y-%m-%d.org" + org-hide-emphasis-markers t) +(setq org-src-preserve-indentation nil + org-src-tab-acts-natively t + org-edit-src-content-indentation 0) +#+end_src + +** Enabling Org Bullets +Org-bullets gives us attractive bullets rather than asterisks. + +#+begin_src emacs-lisp +(use-package org-bullets) +(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) +#+end_src + +** Org Link Abbreviations +This allows for the use of abbreviations that will get expanded out into a lengthy URL. + +#+begin_src emacs-lisp +;; An example of how this works. +;; [[arch-wiki:Name_of_Page][Description]] +(setq 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/"))) +#+end_src + +** Org Todo Keywords +This lets us create the various TODO tags that we can use in Org. + +#+begin_src emacs-lisp + (setq 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 + +** Source Code Block Tag Expansion +Org-tempo is a package that allows for '" '(winner-undo :which-key "Winner undo") + "w " '(winner-redo :which-key "Winner redo")) +#+end_src + +* THEME +We need a nice colorscheme. The Doom Emacs guys have a nice collection of themes, so let's install them! + +#+begin_src emacs-lisp +(use-package doom-themes) +(setq doom-themes-enable-bold t ; if nil, bold is universally disabled + doom-themes-enable-italic t) ; if nil, italics is universally disabled +(load-theme 'doom-one t) +#+end_src + +* WHICH KEY +Which-key is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. + +=NOTE:= Which-key has an annoying bug that in some fonts and font sizes, the bottom row in which key gets covered up by the modeline. + +#+begin_src emacs-lisp +(use-package which-key + :init + (setq which-key-side-window-location 'bottom + which-key-sort-order #'which-key-key-order-alpha + which-key-sort-uppercase-first nil + which-key-add-column-padding 1 + which-key-max-display-columns nil + which-key-min-display-lines 6 + which-key-side-window-slot -10 + which-key-side-window-max-height 0.25 + which-key-idle-delay 0.8 + which-key-max-description-length 25 + which-key-allow-imprecise-window-fit t + which-key-separator " → " )) +(which-key-mode) +#+end_src diff --git a/.emacs.d/emacs-dash.png b/.emacs.d/emacs-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..931758fcdf779bc7371bff1ae4e1c2c34d82e139 GIT binary patch literal 36692 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 P00000NkvXXu0mjfJI177 literal 0 HcmV?d00001 diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 9ac6c41..1852049 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -1,37 +1,18 @@ -;;; init.el -*- lexical-binding: t; -*- -;; -;; Author: Henrik Lissner -;; URL: https://github.com/hlissner/doom-emacs -;; -;; ================= =============== =============== ======== ======== -;; \\ . . . . . . .\\ //. . . . . . .\\ //. . . . . . .\\ \\. . .\\// . . // -;; ||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\/ . . .|| -;; || . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . || -;; ||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .|| -;; || . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\ . . . . || -;; ||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\_ . .|. .|| -;; || . _|| || || || || ||_ . || || . _|| || || || |\ `-_/| . || -;; ||_-' || .|/ || || \|. || `-_|| ||_-' || .|/ || || | \ / |-_.|| -;; || ||_-' || || `-_|| || || ||_-' || || | \ / | `|| -;; || `' || || `' || || `' || || | \ / | || -;; || .===' `===. .==='.`===. .===' /==. | \/ | || -;; || .==' \_|-_ `===. .===' _|_ `===. .===' _-|/ `== \/ | || -;; || .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \/ | || -;; || .==' _-' '-__\._-' '-_./__-' `' |. /| | || -;; ||.==' _-' `' | /==.|| -;; ==' _-' \/ `== -;; \ _-' `-_ / -;; `'' ``' -;; -;; These demons are not part of GNU Emacs. -;; -;;; License: MIT +(org-babel-load-file + (expand-file-name + "config.org" + user-emacs-directory)) -;; In the strange case that early-init.el wasn't loaded (e.g. you're using -;; Chemacs 1? Or you're loading this file directly?), we do it explicitly: -(unless (boundp 'doom-version) - (load (concat (file-name-directory load-file-name) "early-init") - nil t)) - -;; And let 'er rip! -(doom-initialize) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(package-selected-packages + '(elfeed-goodies sudo-edit ox-man dired smex org-tempo all-the-icons-dired which-key vterm use-package toc-org projectile peep-dired org-bullets magit-todos magit-lfs ivy-rich ivy-posframe haskell-mode general evil-collection eshell-syntax-highlighting doom-themes doom-modeline dired-open dashboard counsel))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + )