diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2020-08-01 12:57:09 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2020-08-01 12:57:09 +0100 |
commit | d3f66b80caf87c8b1a08bf3ab5ed23dcd8a485df (patch) | |
tree | 91aedb3bf668076fc39a3867bfbc5563f873635d /Emacs/.config | |
parent | 614f83458bfc9eee9647ca5061620e8776ef3b85 (diff) | |
download | dotfiles-d3f66b80caf87c8b1a08bf3ab5ed23dcd8a485df.tar.gz dotfiles-d3f66b80caf87c8b1a08bf3ab5ed23dcd8a485df.tar.bz2 dotfiles-d3f66b80caf87c8b1a08bf3ab5ed23dcd8a485df.zip |
+brand new Emacs config
This one is a lot more closer to Emacs core, it doesn't use general
or the SPC leader as I'm used to but instead the default meta-key
chord bindings to work better. I don't use a lot of features in Emacs
that Doom used to provide in bindings, so I'm stripping them away and
slowly adding stuff I like.
Diffstat (limited to 'Emacs/.config')
-rw-r--r-- | Emacs/.config/emacs/+org.el | 78 | ||||
-rw-r--r-- | Emacs/.config/emacs/Grayscale-theme.el | 56 | ||||
-rw-r--r-- | Emacs/.config/emacs/config.org | 746 | ||||
-rw-r--r-- | Emacs/.config/emacs/init.el | 34 |
4 files changed, 605 insertions, 309 deletions
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") + (load-theme 'Grayscale t) + #+END_SRC +* 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 - (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) + 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 - (add-hook 'prog-mode-hook #'hs-minor-mode) - (add-hook 'prog-mode-hook #'display-line-numbers-mode) + 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 + (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 +** Global map + Any functions that are already loaded, set them to the global map. + #+BEGIN_SRC emacs-lisp + (bind-keys + :map global-map + ("<menu>" . nil) + ("M-v" . (lambda () (interactive) (dx:newline 1))) + ("M-V" . (lambda () (interactive) (dx:newline))) + ("C-c !" . async-shell-command) + ("C-c c" . compile) + ("M-s i" . imenu) + ("M-n f" . narrow-to-defun) + ("M-n w" . widen) + ("M-n r" . narrow-to-region)) #+END_SRC -** Set some useful variables - Truncate lines, display number lines and stop making backup files (for now). +** Menu map + Any keys I want to map to <menu>, the weird little menu interaction button on some keyboards. #+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. + (bind-keys + :prefix "<menu>" + :prefix-map dx:menu-map + ("<menu>" . execute-extended-command) + ("p" . (lambda () (interactive) (find-file (concat user-emacs-directory "config.org")))) + ("#" . (lambda () (interactive) (projectile-find-file))) + ("/" . counsel-rg) + ("." . imenu)) + #+END_SRC +* Evil +** Evil default + Setup the evil package, with some basic keybinds. #+BEGIN_SRC emacs-lisp - (ido-mode +1) + (use-package evil + :init + (setq evil-want-keybinding nil) + :config + (evil-mode +1) + (bind-key "TAB" #'evil-jump-item evil-normal-state-map) + (evil-define-key 'visual 'emacs-lisp-mode-map "gr" #'eval-region)) #+END_SRC -* Keybindings -** Keychord - Setup key chord, pretty basic config. +** Evil surround + #+BEGIN_SRC emacs-lisp + (use-package evil-surround + :after evil + :config + (global-evil-surround-mode)) + #+END_SRC +** Evil commentary #+BEGIN_SRC emacs-lisp - (use-package key-chord - :ensure t + (use-package evil-commentary + :after evil :config - (key-chord-mode +1)) + (evil-commentary-mode)) #+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. +** Evil mc + Setup for multicursors in Evil mode. + Don't let evil-mc setup it's own keymap because it uses 'gr' as its prefix, which I don't like. + Instead, bind some useful functions to my personal =dx:evil-mc-map= which is bound to 'gz'. + Furthermore, define a function =dx:evil-mc-cursor-here= which pauses cursors upon placing a cursor at the current position. #+BEGIN_SRC emacs-lisp - (use-package general - :ensure t + (use-package evil-mc + :after evil + :bind (("M-p" . evil-mc-skip-and-goto-prev-cursor) + :map dx:evil-mc-map + ("q" . evil-mc-undo-all-cursors) + ("d" . evil-mc-make-and-goto-next-match) + ("j" . evil-mc-make-cursor-move-next-line) + ("k" . evil-mc-make-cursor-move-prev-line) + ("j" . evil-mc-make-cursor-move-next-line) + ("m" . evil-mc-make-all-cursors) + ("z" . dx:evil-mc-cursor-here) + ("r" . evil-mc-resume-cursors) + ("s" . evil-mc-pause-cursors)) :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. + (defvar evil-mc-key-map (make-sparse-keymap)) + (define-prefix-command 'dx:evil-mc-map) + (bind-key "gz" dx:evil-mc-map evil-normal-state-map) + (bind-key "gz" dx:evil-mc-map evil-visual-state-map) + :config + (global-evil-mc-mode +1) + (defun dx:evil-mc-cursor-here () + (interactive) + (evil-mc-make-cursor-here) + (evil-mc-pause-cursors))) + #+END_SRC +** Evil collection + Setup evil collection, but don't turn on the mode. + Instead, I'll turn on setups for specific modes I think benefit from it. + #+BEGIN_SRC emacs-lisp + (use-package evil-collection + :after evil) + #+END_SRC +* IBuffer #+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) -) + (use-package ibuffer + :bind ("<menu> ," . ibuffer) + :after evil-collection + :config + (evil-collection-ibuffer-setup)) + #+END_SRC +* Dired + Setup for dired. + Firstly, as it's an inbuilt package don't let straight try and download it. + Make dired-hide-details-mode the default mode when dired-mode, as it removes the clutter. + Create a keymap =dx:dired-map= which is bound to the prefix "C-c d", binding useful dired functions. + Setup evil collection for dired (even though dired doesn't really conflict with evil, there are some black corners I'd like to adjust) + #+BEGIN_SRC emacs-lisp + (use-package dired + :straight nil + :hook (dired-mode . dired-hide-details-mode) + :bind-keymap* ("C-c d" . dx:dired-map) + :after evil-collection + :init + (defvar dx:dired-map (make-sparse-keymap) "dx:dired-map") + :config + (bind-keys + :map dx:dired-map + ("f" . find-dired) + ("D" . dired-other-window) + ("d" . dired-jump)) + (evil-collection-dired-setup)) #+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 + Basic setup, will be fully integrated in counsel. #+BEGIN_SRC emacs-lisp - (use-package helpful - :after general - :ensure t - :config - (gmap - :infix "h" - "f" #'helpful-callable - "v" #'helpful-variable - "k" #'helpful-key)) + (use-package helpful + :commands (helpful-callable helpful-variable)) + #+END_SRC +* Which-key + Pretty simple, just activate after init. + #+BEGIN_SRC emacs-lisp + (use-package which-key + :hook (after-init . which-key-mode)) + #+END_SRC +* Avy + Avy is an incredibly useful package that I have just started to understand. + For now, I have two bindings for =avy-goto-line= and =avy-goto-char-2= as I use them often. + #+BEGIN_SRC emacs-lisp + (use-package avy + :bind (("M-g" . #'avy-goto-char-2) + ("M-l" . #'avy-goto-line))) + #+END_SRC +* Hydra + I haven't found a use for it yet, so don't tangle this. + #+BEGIN_SRC emacs-lisp :tangle no + (use-package hydra) #+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)) + Yasnippet is a great package for snippets, which I use heavily in programming and org-mode. + I setup here the global mode for yasnippet and a collection of snippets for ease of use. +** Yasnippet default + Setup global mode after evil mode has been loaded + #+BEGIN_SRC emacs-lisp + (use-package yasnippet + :after evil + :hook (after-init . yas-global-mode) + :bind ("C-c i" . yas-insert-snippet)) + #+END_SRC +** Yasnippet snippets + Collection of snippets, activate after yasnippet has been loaded. + #+BEGIN_SRC emacs-lisp + (use-package yasnippet-snippets + :after yasnippet) + #+END_SRC +* Keychord + Keychord is only really here for this one chord I wish to define: "jk" for exiting insert state. + Otherwise, I don't really need it. + #+BEGIN_SRC emacs-lisp + (use-package key-chord + :after evil + :config + (key-chord-define evil-insert-state-map "jk" #'evil-normal-state) + (key-chord-mode +1)) + #+END_SRC +* Ivy + Ivy is a completion framework for Emacs, and my preferred (sometimes second favourite) one. + It has a great set of features with little to no pain with setting up. +** Ivy + Setup for ivy, in preparation for counsel. + Turn on ivy-mode just after init. + Setup vim-like bindings for the minibuffer ("C-(j|k)" for down|up the selection list) + Also setup evil-collection for ivy. + #+BEGIN_SRC emacs-lisp + (use-package ivy + :after evil-collection + :hook (after-init . ivy-mode) + :bind (:map ivy-minibuffer-map + ("C-j" . ivy-next-line-or-history) + ("C-k" . ivy-previous-line-or-history) + :map ivy-switch-buffer-map + ("C-j" . ivy-next-line-or-history) + ("C-k" . ivy-previous-line-or-history)) + :config + (evil-collection-ivy-setup)) -(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=. + #+END_SRC +** Counsel + Setup for counsel. + Load after ivy and helpful. + + Bind: + - Swiper to "C-s" + - Switch buffer to "C-x b" + - Counsel ripgrep to "M-s r" (search namespace) + + Along with that, set the help function and variable functions to their helpful counterparts. + #+BEGIN_SRC emacs-lisp + (use-package counsel + :after (ivy helpful) + :bind (("C-s" . counsel-grep-or-swiper) + ("C-x b" . counsel-switch-buffer) + ("M-s r" . counsel-rg)) + :config + (setq ivy-initial-inputs-alist nil + counsel-describe-function-function #'helpful-callable + counsel-describe-variable-function #'helpful-variable)) + #+END_SRC +** Counsel etags + Counsel etags allows me to search generated tag files for tags. + I already have a function defined [[*Generate tags][here]] to generate the tags, so it's just searching them which I find to be a bit of a hassle, and where this package comes in. + #+BEGIN_SRC emacs-lisp + (use-package counsel-etags + :after counsel + :bind ("M-s t" . counsel-etags-find-tag)) + #+END_SRC +* Projectile +** Projectile default + Setup projectile, along with the tags command. + Also bind "C-c C-p" to the projectile command map for quick access. + #+BEGIN_SRC emacs-lisp + (use-package projectile + :after evil + :hook (prog-mode . projectile-mode) + :bind-keymap* ("C-c C-p" . projectile-command-map) + :init + (setq projectile-tags-command "ctags -Re -f \"%s\" %s \"%s\"") + :config + (projectile-global-mode)) + #+END_SRC +** Counsel projectile + Counsel projectile provides the ivy interface to projectile commands, which is really useful. + #+BEGIN_SRC emacs-lisp + (use-package counsel-projectile + :after (projectile counsel) + :config + (counsel-projectile-mode +1)) + #+END_SRC +* Magit + Magit is *the* git porcelain for Emacs, which perfectly encapsulates the git cli. + In this case, I just need to setup the bindings for it. + As magit will definitely load after evil (as it must be run by a binding, and evil will load after init), I can use evil-collection freely. #+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 + (use-package magit + :bind (("C-x g g" . magit-status) + ("C-x g c" . magit-clone) + ("C-x g l" . magit-log))) -* Org-mode -** Vanilla org mode + (use-package evil-magit + :after magit) + #+END_SRC +* Company + Company is the auto complete system I use. + I don't like having heavy setups for company, as it only makes it worse to use. + In this case, just setup some evil binds for company #+BEGIN_SRC emacs-lisp - (use-package org - :ensure t + (use-package company + :hook (prog-mode . company-mode) + :bind (("C-SPC" . company-complete) + :map company-active-map + ("C-j" . company-select-next) + ("C-k" . company-select-previous))) + #+END_SRC +* Elfeed + Elfeed is the perfect RSS feed reader, integrated into Emacs perfectly. + I've got a set of feeds that I use for a large variety of stuff, mostly media and entertainment. + I've also bound "C-c r" to elfeed for loading the system. + #+BEGIN_SRC emacs-lisp + (use-package elfeed + :bind ("C-c r" . elfeed) + :init + (setq +rss/feed-urls + '(("Arch Linux" "https://www.archlinux.org/feeds/news/" Linux) + ("LEMMiNO" "https://www.youtube.com/feeds/videos.xml?channel_id=UCRcgy6GzDeccI7dkbbBna3Q" YouTube Stories) + ("Dark Sominium" "https://www.youtube.com/feeds/videos.xml?channel_id=UC_e39rWdkQqo5-LbiLiU10g" YouTube Stories) + ("Dark Sominium Music" "https://www.youtube.com/feeds/videos.xml?channel_id=UCkLiZ_zLynyNd5fd62hg1Kw" YouTube Music) + ("Nexpo" "https://www.youtube.com/feeds/videos.xml?channel_id=UCpFFItkfZz1qz5PpHpqzYBw" YouTube) + ("Techquickie" "https://www.youtube.com/feeds/videos.xml?channel_id=UC0vBXGSyV14uvJ4hECDOl0Q" YouTube) + ("Captain Sinbad" "https://www.youtube.com/feeds/videos.xml?channel_id=UC8XKyvQ5Ne_bvYbgv8LaIeg" YouTube) + ("3B1B" "https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw" YouTube) + ("Fredrik Knusden" "https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w" YouTube Stories) + ("Barely Sociable" "https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw" YouTube Stories) + ("Atrocity Guide" "https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw" YouTube Stories) + ("Phillip Defranco" "https://www.youtube.com/feeds/videos.xml?channel_id=UClFSU9_bUb4Rc6OYfTt5SPw" YouTube News) + ("Hacker News" "http://morss.aryadevchavali.com/news.ycombinator.com/rss" Social) + ("Hacker Factor" "https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2" Social) + ("BBC Top News" "http://morss.aryadevchavali.com/feeds.bbci.co.uk/news/rss.xml" News) + ("BBC Tech News" "http://morss.aryadevchavali.com/feeds.bbci.co.uk/news/technology/rss.xml" News))) + (setq elfeed-db-directory (concat user-emacs-directory "elfeed")) :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)) + (evil-collection-elfeed-setup) + (evil-define-key 'normal elfeed-search-mode-map "gr" #'elfeed-update) + (evil-define-key 'normal elfeed-search-mode-map "s" #'elfeed-search-live-filter) + (evil-define-key 'normal elfeed-search-mode-map "<return>" #'elfeed-search-show-entry) + (setq elfeed-feeds (mapc #'(lambda (item) (append (list (nth 1 item)) (cdr (cdr item)))) +rss/feed-urls))) #+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 +* Org mode +** Org default with evil + Setup for org mode, currently basically nothing. + Has evil-org for evil bindings. #+BEGIN_SRC emacs-lisp - (use-package magit - :ensure t - :after general - :config - (gmap - "g" #'magit-status)) - + (use-package org + :hook (org-mode . yas-minor-mode) + :bind (:map org-mode-map + ([remap imenu] . counsel-org-goto))) + (use-package evil-org + :hook (org-mode . evil-org-mode)) #+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)) +** Org superstar + #+BEGIN_SRC emacs-lisp + (use-package org-superstar + :hook (org-mode . org-superstar-mode)) + #+END_SRC +** Flyspell + #+BEGIN_SRC emacs-lisp + (use-package flyspell + :hook (org-mode . flyspell-mode)) + (use-package flyspell-correct-ivy + :after flyspell + :bind (:map org-mode-map + ("C-c C-a" . flyspell-correct-at-point))) + #+END_SRC +* Major modes and Programming + Setups for common major modes and languages + Here are some basic packages for programming first +** Smartparens + Smartparens is a smarter electric-parens, it's much more aware of stuff and easier to use. + #+BEGIN_SRC emacs-lisp + (use-package smartparens + :after evil + :config + (setq sp-highlight-pair-overlay nil + sp-highlight-wrap-overlay t + sp-highlight-wrap-tag-overlay t) + (smartparens-global-mode)) + #+END_SRC +** Show-paren-mode + Show parenthesis for Emacs + #+BEGIN_SRC emacs-lisp + (add-hook 'prog-mode-hook #'show-paren-mode) + #+END_SRC +** Eglot + Eglot is a library of packages to communicate with LSP servers for better programming capabilities. + Interactions with a server provide results to the client, done through JSON. + #+BEGIN_SRC emacs-lisp + (use-package eglot + :hook (c++-mode . eglot-ensure) + :hook (c-mode . eglot-ensure) + :bind (:map eglot-mode-map + ("<f2>" . eglot-rename) + ("C-c C-A" . eglot-code-actions) + ("C-c f" . eglot-format)) + :config + (add-to-list 'eglot-server-programs '((c-mode c++-mode) "clangd"))) + #+END_SRC +** Flycheck + Flycheck is the checking system for Emacs. + I don't necessarily like having all my code checked all the time, so I haven't added a hook to prog-mode as it would be better for me to decide when I want checking and when I don't. + #+BEGIN_SRC emacs-lisp + (use-package flycheck + :commands flycheck-mode + :bind ("C-c x" . flycheck-list-errors)) + #+END_SRC +** Activate tabs + Set tabs to nil by default, with normal tab size set to 2. + #+BEGIN_SRC emacs-lisp + (setq-default indent-tabs-mode nil + tab-width 2) + #+END_SRC + + Add a function to activate tabs mode. + #+BEGIN_SRC emacs-lisp + (defun dx:activate-tabs () + (interactive) + (setq indent-tabs-mode t)) + #+END_SRC +** C/C++ +*** C Offset + #+BEGIN_SRC emacs-lisp + (setq-default c-basic-offset 2) + #+END_SRC +*** Clang format + use-package clang-format for ease of use formatting, binding to "C-c '" for both C and C++ mode maps. + #+BEGIN_SRC emacs-lisp + (use-package clang-format + :after cc-mode + :config + (bind-key "C-c '" #'clang-format-region c-mode-map) + (bind-key "C-c '" #'clang-format-region c++-mode-map)) + #+END_SRC +*** Tabs mode for C and C++ + Add tabs to both C and C++ modes via =activate-tabs= function. + #+BEGIN_SRC emacs-lisp + (add-hook 'c-mode-hook #'dx:activate-tabs) + (add-hook 'c++-mode-hook #'dx:activate-tabs) + #+END_SRC +*** Custom user style + Add a custom style which follows something like a 'Microsoft Style' in that it opens braces everywhere (for ease of reading). + #+BEGIN_SRC emacs-lisp + (c-add-style + "user" + '((c-basic-offset . 2) + (c-comment-only-line-offset . 0) + (c-hanging-braces-alist (brace-list-open) + (brace-entry-open) + (substatement-open after) + (block-close . c-snug-do-while) + (arglist-cont-nonempty)) + (c-cleanup-list brace-else-brace) + (c-offsets-alist + (statement-block-intro . +) + (knr-argdecl-intro . 0) + (substatement-open . 0) + (substatement-label . 0) + (access-label . 0) + (label . 0) + (statement-cont . +)))) -#+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 + #+END_SRC + +*** Set default styles + Set the default style for modes + #+BEGIN_SRC emacs-lisp + (setq c-default-style '((java-mode . "java") + (awk-mode . "awk") + (other . "user"))) + #+END_SRC + diff --git a/Emacs/.config/emacs/init.el b/Emacs/.config/emacs/init.el index d560765..5015f68 100644 --- a/Emacs/.config/emacs/init.el +++ b/Emacs/.config/emacs/init.el @@ -1,35 +1,25 @@ -;;; init.el -- My custom emacs config -;;; Commentary: -;;; Simple Emacs config that uses org-babel to execute org files which contain a literate config -;;; Code: - -(require 'package) -(add-to-list 'package-archives (cons "melpa" "https://melpa.org/packages/") t) -(package-initialize) -(unless (fboundp 'use-package) - (package-install 'use-package)) - -(setq package-quickstart t) -(use-package org - :ensure t - :config - (org-babel-load-file "~/.config/emacs/config.org" t)) +;; Load literate +(require 'ob-tangle) +(setq user-emacs-directory "~/.config/emacs/") +(mapc #'(lambda (x) (org-babel-load-file (concat user-emacs-directory x))) (list "config.org")) +;; Programming (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. + '(ansi-color-names-vector + ["#000000" "#5f8787" "#dd9999" "#a06666" "#888888" "#999999" "#888888" "#c1c1c1"]) + '(ansi-term-color-vector + [unspecified "#2e2e2e" "#bc8383" "#7f9f7f" "#d0bf8f" "#6ca0a3" "#dc8cc3" "#8cd0d3" "#b6b6b6"]) '(custom-safe-themes - '("71e5acf6053215f553036482f3340a5445aee364fb2e292c70d9175fb0cc8af7" "d74c5485d42ca4b7f3092e50db687600d0e16006d8fa335c69cf4f379dbd0eee" default)) + '("0266c89aae71e5b03453145509ee4dd09817377c6df69c384e2e313da86fabd8" "7a89dff27d761c077685970ff22f17d66edef90ac0b083332cfe326af8592dfd" "4de73368daa1be83e74165ae20a393cf205f2023c3dab3fffec6fbf8c742fee7" "b236a062b2e913c08e456cdc3743029951e3fc3e3cb7a579018271e2927b91f7" "6724d9651afb36fbb52d1d2e5a612da7d3f6e8739c30fbc818441798d5526113" "30c98a55535d742be02b7d44f00965ee6acbb892a945f428f1875a210c51d536" "311ac10c551b531e895c110583108d667de691aa46a26a5d324339d22911e94b" "28cd8971a2cfe634ef4a42d5bfb305b8865761017372d5d202bd08590da198d9" "6e1a7768b8023e6c2075e4af23aefba3b3e5db18b06dbb1b18ef1949d6af9d94" "7cc79b0c9da3ad3150256023b9023f363719274939656f57f3d1eae6120c4c13" "12670281275ea7c1b42d0a548a584e23b9c4e1d2dabb747fd5e2d692bcd0d39b" "6a0edb6b0f4c6d0566325cf91a1a34daa179e1979136ce0a528bf83aff9b7719" "b3bcf1b12ef2a7606c7697d71b934ca0bdd495d52f901e73ce008c4c9825a3aa" "c968804189e0fc963c641f5c9ad64bca431d41af2fb7e1d01a2a6666376f819c" "d873c4ec3fa23a2eee0a08ccbb6266ea9511edf2e738e63bd2b7f867dde43cb6" default)) '(package-selected-packages - '(evil-org doom-themes general evil-surround evil evil-mode ace-window magit counsel which-key yasnippet use-package)) + '(magit evil-magit evil-commentary evil-surround use-package)) '(safe-local-variable-values '((org-babel-default-header-args:elisp - (:results . "none")))) - '(send-mail-function 'smtpmail-send-it) - '(smtpmail-smtp-server "smtp.gmail.com") - '(smtpmail-smtp-service 25)) + (:results . "none"))))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. |