+major refactors to vanilla Emacs config
Developed quite a bit of the config. I've added a literate org config, loaded through the init.el file. Furthermore, I've added some basic general maps and have gained a much better understanding of Emacs than before. This refactor is one of the main reasons I decided to so heavily refactor my doom config.
This commit is contained in:
78
Emacs/.config/emacs/+org.el
Normal file
78
Emacs/.config/emacs/+org.el
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
(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))
|
||||||
248
Emacs/.config/emacs/config.org
Normal file
248
Emacs/.config/emacs/config.org
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
#+TITLE: Config for Emacs
|
||||||
|
#+AUTHOR: Oreodave
|
||||||
|
#+DESCRIPTION: My bespoke config for Emacs
|
||||||
|
#+PROPERTY: header-args :tangle yes
|
||||||
|
|
||||||
|
* 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
|
||||||
|
#+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.
|
||||||
|
#+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)
|
||||||
|
#+END_SRC
|
||||||
|
** Set some useful variables
|
||||||
|
Truncate lines, display number lines and stop making backup files (for now).
|
||||||
|
#+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)
|
||||||
|
#+END_SRC
|
||||||
|
* Keybindings
|
||||||
|
** Keychord
|
||||||
|
Setup key chord, pretty basic config.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package key-chord
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(key-chord-mode +1))
|
||||||
|
#+END_SRC
|
||||||
|
** General
|
||||||
|
Setup for general, keybinding library.
|
||||||
|
I use the function =general-evil-setup= to use the =*map= family of keymapping functions.
|
||||||
|
In this case I setup two defines: =gmap= and =lmap=.
|
||||||
|
=gmap= is for all global maps while lmap is for local, mode based keybindings
|
||||||
|
I also have a good bit of bindings setup here, such that any default emacs functions that I use regularly is setup here.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package general
|
||||||
|
:ensure t
|
||||||
|
:init
|
||||||
|
;; Definers
|
||||||
|
(general-def :states 'normal
|
||||||
|
"SPC" nil)
|
||||||
|
(general-create-definer gmap :prefix "SPC")
|
||||||
|
(general-create-definer lmap :prefix "SPC m")
|
||||||
|
(general-evil-setup t)
|
||||||
|
)
|
||||||
|
#+END_SRC
|
||||||
|
* Which key
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package which-key
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(which-key-mode +1))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Evil
|
||||||
|
Basic evil configuration with some keychords.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package evil
|
||||||
|
:ensure t
|
||||||
|
:after key-chord general
|
||||||
|
:config
|
||||||
|
(evil-mode +1)
|
||||||
|
(key-chord-define evil-insert-state-map "jk" #'evil-normal-state)
|
||||||
|
;; Keybindgs
|
||||||
|
(gmap "SPC" #'execute-extended-command)
|
||||||
|
;; Files
|
||||||
|
(gmap
|
||||||
|
:infix "f"
|
||||||
|
"f" #'find-file
|
||||||
|
"p" #'(lambda () (interactive) (find-file "~/.config/emacs/init.el"))
|
||||||
|
"-" #'dired
|
||||||
|
"s" #'save-buffer)
|
||||||
|
;; Buffers
|
||||||
|
(gmap
|
||||||
|
:infix "b"
|
||||||
|
"b" #'switch-to-buffer
|
||||||
|
"d" #'kill-buffer
|
||||||
|
"n" #'next-buffer
|
||||||
|
"p" #'previous-buffer
|
||||||
|
"i" #'ibuffer)
|
||||||
|
;; Other
|
||||||
|
(gmap
|
||||||
|
"c" #'compile)
|
||||||
|
(vmap
|
||||||
|
:keymaps 'emacs-lisp-mode-map
|
||||||
|
"gr" #'eval-region)
|
||||||
|
)
|
||||||
|
#+END_SRC
|
||||||
|
** Evil surround
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package evil-surround
|
||||||
|
:ensure t
|
||||||
|
:after evil
|
||||||
|
:config
|
||||||
|
(global-evil-surround-mode +1))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Helpful
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package helpful
|
||||||
|
:after general
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(gmap
|
||||||
|
:infix "h"
|
||||||
|
"f" #'helpful-callable
|
||||||
|
"v" #'helpful-variable
|
||||||
|
"k" #'helpful-key))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Yasnippet
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package yasnippet
|
||||||
|
:ensure t
|
||||||
|
:after general
|
||||||
|
:config
|
||||||
|
(add-hook 'prog-mode-hook #'yas-minor-mode)
|
||||||
|
(gmap
|
||||||
|
"is" #'yas-insert-snippet))
|
||||||
|
|
||||||
|
(use-package yasnippet-snippets
|
||||||
|
:ensure t
|
||||||
|
:after yasnippet)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Doom-themes
|
||||||
|
Setup for doom themes.
|
||||||
|
Allow bold themes but not italic (italic is harder to read).
|
||||||
|
Allow doom themes to configure org mode to fix fonts on headers, etc.
|
||||||
|
Define a function that does the same thing as =counsel-load-function-action= without the dependency on counsel.
|
||||||
|
Load a theme using said function, in this case =doom-monokai-classic=.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package doom-themes
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(setq doom-themes-enable-bold t
|
||||||
|
doom-themes-enable-italic nil)
|
||||||
|
(doom-themes-org-config)
|
||||||
|
(defun dx:load-theme (theme)
|
||||||
|
"Load a given theme into Emacs, while unloading the rest"
|
||||||
|
(mapc #'disable-theme custom-enabled-themes)
|
||||||
|
(load-theme theme t))
|
||||||
|
(dx:load-theme 'doom-monokai-classic))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Org-mode
|
||||||
|
** Vanilla org mode
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(load (concat user-emacs-directory "+org.el"))
|
||||||
|
(nmap
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
"M-j" #'org-metadown
|
||||||
|
"M-k" #'org-metaup
|
||||||
|
"C-RET" #'dx:org-insert-item-below))
|
||||||
|
#+END_SRC
|
||||||
|
** Evil org mode
|
||||||
|
Setup evil org mode, which allows for some nicer abstractions of the interace.
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package evil-org
|
||||||
|
:ensure t
|
||||||
|
:after org
|
||||||
|
:config
|
||||||
|
(add-hook 'org-mode-hook 'evil-org-mode)
|
||||||
|
(add-hook 'evil-org-mode-hook
|
||||||
|
(lambda ()
|
||||||
|
(evil-org-set-key-theme)))
|
||||||
|
(require 'evil-org-agenda)
|
||||||
|
(evil-org-agenda-set-keys))
|
||||||
|
#+END_SRC
|
||||||
|
* Magit
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package magit
|
||||||
|
:ensure t
|
||||||
|
:after general
|
||||||
|
:config
|
||||||
|
(gmap
|
||||||
|
"g" #'magit-status))
|
||||||
|
|
||||||
|
|
||||||
|
#+END_SRC
|
||||||
|
* Ace window
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package ace-window
|
||||||
|
:ensure t
|
||||||
|
:after general
|
||||||
|
:config
|
||||||
|
(gmap "o" #'ace-window)
|
||||||
|
(setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)
|
||||||
|
aw-dispatch-always t))
|
||||||
|
|
||||||
|
|
||||||
|
#+END_SRC
|
||||||
|
* Counsel
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package counsel
|
||||||
|
:ensure t
|
||||||
|
:after general
|
||||||
|
:config
|
||||||
|
(gmap
|
||||||
|
:infix "s"
|
||||||
|
"s" #'swiper
|
||||||
|
"r" #'counsel-rg)
|
||||||
|
(general-def
|
||||||
|
:keymaps 'ivy-minibuffer-map
|
||||||
|
"C-j" #'ivy-next-line-or-history
|
||||||
|
"C-k" #'ivy-previous-line-or-history))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
|
||||||
@@ -9,147 +9,30 @@
|
|||||||
(unless (fboundp 'use-package)
|
(unless (fboundp 'use-package)
|
||||||
(package-install 'use-package))
|
(package-install 'use-package))
|
||||||
|
|
||||||
(setq user-emacs-directory (expand-file-name "~/.config/emacs/")
|
(setq package-quickstart t)
|
||||||
ring-bell-function 'ignore
|
(use-package org
|
||||||
inhibit-startup-screen t)
|
|
||||||
|
|
||||||
(tool-bar-mode -1)
|
|
||||||
(scroll-bar-mode -1)
|
|
||||||
(tab-bar-mode -1)
|
|
||||||
(load-theme 'tango-dark)
|
|
||||||
(add-hook 'prog-mode-hook #'hs-minor-mode)
|
|
||||||
|
|
||||||
(use-package evil
|
|
||||||
:ensure t
|
:ensure t
|
||||||
:config
|
:config
|
||||||
(evil-mode +1))
|
(org-babel-load-file "~/.config/emacs/config.org" t))
|
||||||
|
|
||||||
(use-package evil-surround
|
(custom-set-variables
|
||||||
:ensure t
|
;; custom-set-variables was added by Custom.
|
||||||
:after (evil)
|
;; If you edit it by hand, you could mess it up, so be careful.
|
||||||
:config
|
;; Your init file should contain only one such instance.
|
||||||
(evil-surround-mode +1))
|
;; If there is more than one, they won't work right.
|
||||||
|
'(custom-safe-themes
|
||||||
(use-package which-key
|
'("71e5acf6053215f553036482f3340a5445aee364fb2e292c70d9175fb0cc8af7" "d74c5485d42ca4b7f3092e50db687600d0e16006d8fa335c69cf4f379dbd0eee" default))
|
||||||
:ensure t
|
'(package-selected-packages
|
||||||
:config
|
'(evil-org doom-themes general evil-surround evil evil-mode ace-window magit counsel which-key yasnippet use-package))
|
||||||
(which-key-mode +1))
|
'(safe-local-variable-values
|
||||||
|
'((org-babel-default-header-args:elisp
|
||||||
(use-package general
|
(:results . "none"))))
|
||||||
:ensure t
|
'(send-mail-function 'smtpmail-send-it)
|
||||||
:config
|
'(smtpmail-smtp-server "smtp.gmail.com")
|
||||||
(general-create-definer leader
|
'(smtpmail-smtp-service 25))
|
||||||
:prefix "SPC"
|
(custom-set-faces
|
||||||
:states 'normal
|
;; custom-set-faces was added by Custom.
|
||||||
:keymaps 'override)
|
;; If you edit it by hand, you could mess it up, so be careful.
|
||||||
|
;; Your init file should contain only one such instance.
|
||||||
(general-create-definer localleader
|
;; If there is more than one, they won't work right.
|
||||||
:prefix ","
|
)
|
||||||
:states 'normal
|
|
||||||
:keymaps 'override)
|
|
||||||
|
|
||||||
(general-def
|
|
||||||
"M-s" nil
|
|
||||||
"M-s" #'occur)
|
|
||||||
|
|
||||||
(leader
|
|
||||||
"!" #'async-shell-command
|
|
||||||
"f" '(:ignore t :wk "File")
|
|
||||||
"s" '(:ignore t :wk "Search")
|
|
||||||
"b" '(:ignore t :wk "Buffer"))
|
|
||||||
|
|
||||||
(general-def
|
|
||||||
:states 'visual
|
|
||||||
"gr" #'eval-region)
|
|
||||||
|
|
||||||
(leader
|
|
||||||
:infix "b"
|
|
||||||
"n" #'next-buffer
|
|
||||||
"p" #'previous-buffer
|
|
||||||
"b" #'counsel-switch-buffer
|
|
||||||
"i" #'ibuffer)
|
|
||||||
|
|
||||||
(leader
|
|
||||||
:infix "o"
|
|
||||||
"-" #'dired)
|
|
||||||
|
|
||||||
(leader
|
|
||||||
:infix "f"
|
|
||||||
"s" #'save-buffer
|
|
||||||
"f" #'find-file
|
|
||||||
"p" #'((lambda () (interactive) (find-file "~/.config/emacs/init.el"))
|
|
||||||
:wk "Open init.el")))
|
|
||||||
|
|
||||||
(use-package counsel
|
|
||||||
:ensure t
|
|
||||||
:general
|
|
||||||
(leader
|
|
||||||
"SPC" #'counsel-M-x)
|
|
||||||
(leader
|
|
||||||
:infix "s"
|
|
||||||
"s" #'(swiper :wk "Search buffer")
|
|
||||||
"r" #'(counsel-rg :wk "Ripgrep"))
|
|
||||||
(general-def
|
|
||||||
:keymaps 'ivy-minibuffer-map
|
|
||||||
"C-j" #'ivy-next-line-or-history
|
|
||||||
"C-k" #'ivy-previous-line-or-history)
|
|
||||||
:init
|
|
||||||
(counsel-mode +1))
|
|
||||||
|
|
||||||
(use-package org :ensure t)
|
|
||||||
|
|
||||||
(use-package magit :ensure t)
|
|
||||||
|
|
||||||
(use-package evil-magit :ensure t)
|
|
||||||
|
|
||||||
(use-package telephone-line
|
|
||||||
:ensure t
|
|
||||||
:hook (after-init . telephone-line-mode)
|
|
||||||
:init
|
|
||||||
; Faces
|
|
||||||
(defface my-accent-dark '((t (:foreground "Black" :background "Cadet Blue"))) "")
|
|
||||||
(defface my-evil-dark '((t (:foreground "White" :background "Black"))) "")
|
|
||||||
(defface my-accent-light '((t (:foreground "black" :background "Light Slate Grey"))) "")
|
|
||||||
(defface my-evil-light '((t (:foreground "black" :background "Sky Blue"))) "")
|
|
||||||
|
|
||||||
;; Set telephone line faces
|
|
||||||
(setq telephone-line-faces
|
|
||||||
'((evil . (my-evil-dark . my-evil-dark))
|
|
||||||
(modal . telephone-line-modal-face)
|
|
||||||
(ryo . telephone-line-ryo-modal-face)
|
|
||||||
(accent . (my-accent-dark . telephone-line-accent-inactive))
|
|
||||||
(nil mode-line . mode-line-inactive)))
|
|
||||||
|
|
||||||
; Seperators
|
|
||||||
(setq telephone-line-primary-left-separator 'telephone-line-abs-left
|
|
||||||
telephone-line-secondary-left-separator 'telephone-line-identity-hollow-left
|
|
||||||
telephone-line-primary-right-separator 'telephone-line-abs-right
|
|
||||||
telephone-line-secondary-right-separator 'telephone-line-identity-hollow-right)
|
|
||||||
|
|
||||||
; LSP segment
|
|
||||||
(telephone-line-defsegment +oreoline-lsp-segment ()
|
|
||||||
(if (bound-and-true-p lsp-mode)
|
|
||||||
(propertize "")
|
|
||||||
(propertize "")))
|
|
||||||
|
|
||||||
; LHS
|
|
||||||
(setq telephone-line-lhs
|
|
||||||
'((evil . (telephone-line-evil-tag-segment
|
|
||||||
telephone-line-buffer-modified-segment))
|
|
||||||
(accent . (telephone-line-vc-segment
|
|
||||||
telephone-line-filesize-segment
|
|
||||||
telephone-line-buffer-name-segment
|
|
||||||
telephone-line-erc-modified-channels-segment
|
|
||||||
telephone-line-process-segment))
|
|
||||||
(nil . ())))
|
|
||||||
|
|
||||||
; RHS
|
|
||||||
(setq telephone-line-rhs
|
|
||||||
'((nil . (telephone-line-misc-info-segment))
|
|
||||||
(accent . (telephone-line-major-mode-segment
|
|
||||||
+oreoline-lsp-segment
|
|
||||||
telephone-line-flycheck-segment))
|
|
||||||
(evil . (telephone-line-airline-position-segment))))
|
|
||||||
(telephone-line-mode +1)
|
|
||||||
:config
|
|
||||||
(size-indication-mode +1))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user