diff --git a/Emacs/.config/emacs/+org.el b/Emacs/.config/emacs/+org.el
deleted file mode 100644
index aa5e755..0000000
--- a/Emacs/.config/emacs/+org.el
+++ /dev/null
@@ -1,78 +0,0 @@
-(defun dx:org-insert-item (direction)
- "Shamelessly copied from Doom Emacs, better insert item"
- (let* ((context
- (save-excursion
- (when (bolp)
- (back-to-indentation)
- (forward-char))
- (org-element-lineage
- (org-element-context)
- '(table table-row headline inlinetask item plain-list)
- t)))
- (type (org-element-type context)))
- (cond ((memq type '(item plain-list))
- (let ((marker (org-element-property :bullet context))
- (pad (save-excursion
- (org-beginning-of-item)
- (back-to-indentation)
- (- (point) (line-beginning-position)))))
- (save-match-data
- (pcase direction
- (`below
- (org-end-of-item)
- (backward-char)
- (end-of-line)
- (if (and marker (string-match "\\([0-9]+\\)\\([).] *\\)" marker))
- (let ((l (line-number-at-pos)))
- (org-insert-item)
- (when (= l (line-number-at-pos))
- (org-next-item)
- (org-end-of-line)))
- (insert "\n" (make-string pad 32) (or marker ""))))
- (`above
- (org-beginning-of-item)
- (if (and marker (string-match-p "[0-9]+[).]" marker))
- (org-insert-item)
- (insert (make-string pad 32) (or marker ""))
- (save-excursion (insert "\n")))))))
- (when (org-element-property :checkbox context)
- (insert "[ ] ")))
-
- ((memq type '(table table-row))
- (pcase direction
- ('below (save-excursion (org-table-insert-row t))
- (org-table-next-row))
- ('above (save-excursion (org-shiftmetadown))
- (+org/table-previous-row))))
-
- ((let ((level (or (org-current-level) 1)))
- (pcase direction
- (`below
- (let (org-insert-heading-respect-content)
- (goto-char (line-end-position))
- (org-end-of-subtree)
- (insert "\n" (make-string level ?*) " ")))
- (`above
- (org-back-to-heading)
- (insert (make-string level ?*) " ")
- (save-excursion (insert "\n"))))
- (when-let* ((todo-keyword (org-element-property :todo-keyword context))
- (todo-type (org-element-property :todo-type context)))
- (org-todo (cond ((eq todo-type 'done)
- (car (+org-get-todo-keywords-for todo-keyword)))
- (todo-keyword)
- ('todo)))))))
-
- (when (org-invisible-p)
- (org-show-hidden-entry))
- (when (and (bound-and-true-p evil-local-mode)
- (not (evil-emacs-state-p)))
- (evil-insert 1))))
-
-(defun dx:org-insert-item-below ()
- (interactive)
- (dx:org-insert-item 'below))
-
-(defun dx:org-insert-item-above ()
- (interactive)
- (dx:org-insert-item 'above))
diff --git a/Emacs/.config/emacs/Grayscale-theme.el b/Emacs/.config/emacs/Grayscale-theme.el
new file mode 100644
index 0000000..9cacbc7
--- /dev/null
+++ b/Emacs/.config/emacs/Grayscale-theme.el
@@ -0,0 +1,56 @@
+(deftheme Grayscale
+ "Created 2020-08-01.")
+
+(custom-theme-set-faces
+ 'Grayscale
+ '(cursor ((((background light)) (:background "black")) (((background dark)) (:background "white"))))
+ '(fixed-pitch ((t (:family "Monospace"))))
+ '(variable-pitch ((((type w32)) (:foundry "outline" :family "Arial")) (t (:family "Sans Serif"))))
+ '(escape-glyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
+ '(homoglyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
+ '(minibuffer-prompt ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "medium blue"))))
+ '(highlight ((((class color) (min-colors 88) (background light)) (:background "darkseagreen2")) (((class color) (min-colors 88) (background dark)) (:background "darkolivegreen")) (((class color) (min-colors 16) (background light)) (:background "darkseagreen2")) (((class color) (min-colors 16) (background dark)) (:background "darkolivegreen")) (((class color) (min-colors 8)) (:foreground "black" :background "green")) (t (:inverse-video t))))
+ '(region ((t (:extend t :background "gray20"))))
+ '(shadow ((((class color grayscale) (min-colors 88) (background light)) (:foreground "grey50")) (((class color grayscale) (min-colors 88) (background dark)) (:foreground "grey70")) (((class color) (min-colors 8) (background light)) (:foreground "green")) (((class color) (min-colors 8) (background dark)) (:foreground "yellow"))))
+ '(secondary-selection ((((class color) (min-colors 88) (background light)) (:extend t :background "yellow1")) (((class color) (min-colors 88) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 16) (background light)) (:extend t :background "yellow")) (((class color) (min-colors 16) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 8)) (:extend t :foreground "black" :background "cyan")) (t (:inverse-video t))))
+ '(trailing-whitespace ((((class color) (background light)) (:background "red1")) (((class color) (background dark)) (:background "red1")) (t (:inverse-video t))))
+ '(font-lock-builtin-face ((((class grayscale) (background light)) (:weight bold :foreground "LightGray")) (((class grayscale) (background dark)) (:weight bold :foreground "DimGray")) (((class color) (min-colors 88) (background light)) (:foreground "dark slate blue")) (((class color) (min-colors 88) (background dark)) (:foreground "LightSteelBlue")) (((class color) (min-colors 16) (background light)) (:foreground "Orchid")) (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue")) (((class color) (min-colors 8)) (:weight bold :foreground "blue")) (t (:weight bold))))
+ '(font-lock-comment-delimiter-face ((t (:slant italic :foreground "gray24"))))
+ '(font-lock-comment-face ((t (:slant italic :foreground "#868686"))))
+ '(font-lock-constant-face ((t (:family "Source Code Pro" :height 0.9 :weight bold :foreground "#868686"))))
+ '(font-lock-doc-face ((t (:inherit (font-lock-string-face)))))
+ '(font-lock-function-name-face ((t (:weight semi-bold))))
+ '(font-lock-keyword-face ((t (:family "Fira Code" :height 0.95 :weight bold :foreground "DeepSkyBlue4"))))
+ '(font-lock-negation-char-face ((t nil)))
+ '(font-lock-preprocessor-face ((t (:family "Source Code Pro" :foreground "#868686"))))
+ '(font-lock-regexp-grouping-backslash ((t (:inherit (bold)))))
+ '(font-lock-regexp-grouping-construct ((t (:inherit (bold)))))
+ '(font-lock-string-face ((t (:family "Fira Code" :foreground "yellow4"))))
+ '(font-lock-type-face ((t (:family "Hack" :height 0.95 :foreground "chartreuse"))))
+ '(font-lock-variable-name-face ((t (:family "Source Code Variable" :foreground "#e6e6e6"))))
+ '(font-lock-warning-face ((t (:inherit (error)))))
+ '(button ((t (:inherit (link)))))
+ '(link ((t (:underline (:color foreground-color :style line) :foreground "cyan1"))))
+ '(link-visited ((t (:foreground "violet" :inherit (link)))))
+ '(fringe ((((class color) (background light)) (:background "grey95")) (((class color) (background dark)) (:background "grey10")) (t (:background "gray"))))
+ '(header-line ((t (:box nil :foreground "grey90" :background "grey20" :inherit (mode-line)))))
+ '(tooltip ((t (:foreground "black" :background "lightyellow" :inherit (variable-pitch)))))
+ '(mode-line ((t (:box (:line-width -1 :color nil :style released-button) :foreground "white" :background "black"))))
+ '(mode-line-buffer-id ((t (:weight bold))))
+ '(mode-line-emphasis ((t (:weight bold))))
+ '(mode-line-highlight ((((class color) (min-colors 88)) (:box (:line-width 2 :color "grey40" :style released-button))) (t (:inherit (highlight)))))
+ '(mode-line-inactive ((t (:weight light :box (:line-width -1 :color "grey40" :style nil) :foreground "grey30" :background "grey7" :inherit (mode-line)))))
+ '(isearch ((t (:foreground "brown4" :background "white"))))
+ '(isearch-fail ((((class color) (min-colors 88) (background light)) (:background "RosyBrown1")) (((class color) (min-colors 88) (background dark)) (:background "red4")) (((class color) (min-colors 16)) (:background "red")) (((class color) (min-colors 8)) (:background "red")) (((class color grayscale)) (:foreground "grey")) (t (:inverse-video t))))
+ '(lazy-highlight ((((class color) (min-colors 88) (background light)) (:background "paleturquoise")) (((class color) (min-colors 88) (background dark)) (:background "paleturquoise4")) (((class color) (min-colors 16)) (:background "turquoise3")) (((class color) (min-colors 8)) (:background "turquoise3")) (t (:underline (:color foreground-color :style line)))))
+ '(match ((((class color) (min-colors 88) (background light)) (:background "yellow1")) (((class color) (min-colors 88) (background dark)) (:background "RoyalBlue3")) (((class color) (min-colors 8) (background light)) (:foreground "black" :background "yellow")) (((class color) (min-colors 8) (background dark)) (:foreground "white" :background "blue")) (((type tty) (class mono)) (:inverse-video t)) (t (:background "gray"))))
+ '(next-error ((t (:inherit (region)))))
+ '(query-replace ((t (:inherit (isearch)))))
+ '(default ((t (:family "Source Code Pro" :foundry "ADBO" :width normal :height 113 :weight normal :slant normal :underline nil :overline nil :extend nil :strike-through nil :box nil :inverse-video nil :foreground "#b6b6b6" :background "#000000" :stipple nil :inherit nil))))
+ '(company-tooltip ((t (:background "navy blue" :foreground "white"))))
+ '(company-tooltip-selection ((t (:background "gray31"))))
+ '(company-tooltip-annotation ((t (:foreground "grey" :slant italic))))
+ '(company-preview ((((background light)) (:inherit (company-tooltip-selection company-tooltip))) (((background dark)) (:foreground "wheat" :background "blue4"))))
+ '(company-preview-common ((t (:inherit company-preview :foreground "grey")))))
+
+(provide-theme 'Grayscale)
diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org
index c99bbe7..52c7425 100644
--- a/Emacs/.config/emacs/config.org
+++ b/Emacs/.config/emacs/config.org
@@ -1,248 +1,576 @@
-#+TITLE: Config for Emacs
+#+TITLE: Emacs configuration
#+AUTHOR: Oreodave
-#+DESCRIPTION: My bespoke config for Emacs
-#+PROPERTY: header-args :tangle yes
+#+DESCRIPTION: My new Emacs configuration
-* Notes
- This setup uses emacs 27, with use-package and melpa.
- Code structure is pretty simple:
- - parent packages or packages that other packages leverage greatly are configured first.
- I use =:after= as a depdence generator: in most circumstances.
-
-* Init
-** Set some details
- Some basic details set for the purposes of Emacs
- #+BEGIN_SRC emacs-lisp
- (setq user-emacs-directory (expand-file-name "~/.config/emacs/")
- ring-bell-function 'ignore
- inhibit-startup-screen t)
- #+END_SRC
-
-** Turn off those annoying bars
- Annoying menu bars, tool bars, etc
+* Initial
+** Setup straight
+ Bootstrap of straight (from github)
+ #+BEGIN_SRC emacs-lisp
+ (defvar bootstrap-version)
+ (let ((bootstrap-file
+ (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
+ (bootstrap-version 5))
+ (unless (file-exists-p bootstrap-file)
+ (with-current-buffer
+ (url-retrieve-synchronously
+ "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
+ 'silent 'inhibit-cookies)
+ (goto-char (point-max))
+ (eval-print-last-sexp)))
+ (load bootstrap-file nil 'nomessage))
+ #+END_SRC
+** Setup use package
+ Straight clone use-package and state that all use-package statements implicity use straight.
+ #+BEGIN_SRC emacs-lisp
+ (straight-use-package 'use-package)
+ (setq straight-use-package-by-default t)
+ #+END_SRC
+** Setup alpha and yes-or-no-p
+ This just sets the alpha to 85% and all yes or no questions to single letter responses.
+ #+BEGIN_SRC emacs-lisp
+ (add-to-list 'default-frame-alist '(alpha . 85))
+ (fset 'yes-or-no-p 'y-or-n-p)
+ #+END_SRC
+** Hs Minor mode
+ Turn on hs minor mode for all prog-mode.
+ #+BEGIN_SRC emacs-lisp
+ (add-hook 'prog-mode-hook #'hs-minor-mode)
+ #+END_SRC
+** Set backup directory
+ Set the backup directory to =user-emacs-directory=/saves so I don't get those annoying '~' files.
+ #+BEGIN_SRC emacs-lisp
+ (setq backup-directory-alist `(("." . "~/.config/emacs/saves")))
+ #+END_SRC
+** Turn off the bars
+ Turn off all the bars, don't need them anymore!
#+BEGIN_SRC emacs-lisp
(tool-bar-mode -1)
(scroll-bar-mode -1)
- (tab-bar-mode -1)
(menu-bar-mode -1)
#+END_SRC
-
-** Set fonts and alpha
- Make two constants that hold the values for font and alpha, then set them in Emacs.
+** Themes
+ Load my custom "Grayscale" theme (look at [[file:Grayscale-theme.el][this file]]).
#+BEGIN_SRC emacs-lisp
- (defconst dx:font "IBM Plex Mono-12" "Default font for Emacs")
- (defconst dx:alpha 0.9 "Default alpha transparency for Emacs")
-
- (add-to-list 'default-frame-alist (cons 'font dx:font))
- (add-to-list 'default-frame-alist (cons 'alpha dx:alpha))
- (set-face-attribute 'default t :font dx:font)
-
- (add-hook 'prog-mode-hook #'hs-minor-mode)
- (add-hook 'prog-mode-hook #'display-line-numbers-mode)
+ (load-theme 'Grayscale t)
#+END_SRC
-** Set some useful variables
- Truncate lines, display number lines and stop making backup files (for now).
+* Emacs Mode-line
+ Firstly, declare a variable for the number of spaces between each module in the modeline.
+ #+BEGIN_SRC emacs-lisp
+ (defconst +modeline/sep-spaces 4 "Number of spaces separating modules.")
+ #+END_SRC
+
+ Then, declare a list of reserved characters for which the previously declared seperator won't be applied when placed at the end of a module string.
+ #+BEGIN_SRC emacs-lisp
+ (defconst +modeline/reserved-chars (list "[" "(")
+ "Characters that, when at the end of a module string, won't have the separator applied to them.")
+ #+END_SRC
+
+ Now declare a function that applies the separator with respect to the reserved characters to any one string.
+ #+BEGIN_SRC emacs-lisp
+ (defun +modeline/handle-string (STR)
+ (condition-case nil
+ (progn
+ (string-blank-p STR)
+ (cond ((cl-member (car (last (split-string STR "" t))) +modeline/reserved-chars :test #'string=) STR)
+ (t (concat STR (cl-reduce #'concat (cl-loop for i from 1 to +modeline/sep-spaces collect " "))))))
+ (error STR)))
+ #+END_SRC
+
+ Finally, set the mode-line-format.
+ #+BEGIN_SRC emacs-lisp
+ (setq-default
+ mode-line-format
+ (mapcar #'+modeline/handle-string
+ (list "%l:%c"
+ "%p["
+ '(:eval (upcase
+ (substring
+ (format "%s" (if (bound-and-true-p evil-state) evil-state ""))
+ 0 1)))
+ "]"
+ "%+%b("
+ '(:eval (format "%s" major-mode))
+ ")"
+ "%I"
+ vc-mode
+ mode-line-end-spaces)))
+ #+END_SRC
+* Custom Functions
+ These are custom functions I have defined
+** New line function
+ Vim bindings don't have a nice way of adding new lines before or after the current line while staying in normal mode.
+ You can use =o/O= to enter insert mode at a new line, but this isn't the same as being able to stay in normal mode, and only adds extra keypresses if your only purpose was to open up some lines.
+ As this is Emacs I can extend it as I wish, so I decided to define a new line function that won't remove me from normal state.
+
+ The logic is pretty simple:
+ - Use the predefined vim functions for opening new lines above and below with insert mode
+ - Given the argument =BACKWARD= to assess whether to open lines above or below
+ - Return to previous location
+ - Enter normal state
+
#+BEGIN_SRC emacs-lisp
- (setq completion-ignore-case t
- truncate-lines t
- display-line-numbers-type t
- make-backup-files nil)
- #+END_SRC
-** ido mode
- Setup ido mode, easy to use completion framework.
- #+BEGIN_SRC emacs-lisp
- (ido-mode +1)
+ (with-eval-after-load "evil"
+ (defun dx:newline (&optional BACKWARD)
+ (interactive)
+ (let ((old (point)))
+ (cond ((and BACKWARD (= BACKWARD 1)) (evil-open-below 1))
+ (t (evil-open-above 1)))
+ (goto-char (+ old 1))
+ (evil-normal-state))))
#+END_SRC
+** Generate tags
+ For some reason, I can't seem to rely on the =projectile-regenerate-tags= function, so define my own.
+
+ Steps are as follows:
+ - Consider the =root= to be either =default-directory= or the =projectile-project-root= depending on if it's loaded and set.
+ - Start a process (shell command) by changing to =root= and executing =ctags -Re=
+ #+BEGIN_SRC emacs-lisp
+ (defun dx:generate-tags ()
+ (interactive)
+ (let ((root (if (bound-and-true-p projectile-project-root)
+ projectile-project-root
+ default-directory)))
+ (start-process-shell-command "" nil (format "cd %s; ctags -Re ." root))))
+ #+END_SRC
* Keybindings
-** Keychord
- Setup key chord, pretty basic config.
+** Global map
+ Any functions that are already loaded, set them to the global map.
#+BEGIN_SRC emacs-lisp
- (use-package key-chord
- :ensure t
- :config
- (key-chord-mode +1))
+ (bind-keys
+ :map global-map
+ ("