├── .eshell-aliases ├── .gitignore ├── LICENSE ├── README.md ├── bin └── .gitkeep ├── bindings ├── bindings.el └── modes │ ├── cider.el │ ├── company.el │ ├── corfu.el │ ├── eglot.el │ ├── evil.el │ ├── hydras.el │ ├── lsp.el │ ├── projectile.el │ ├── tide.el │ └── vdiff.el ├── config ├── config-auto-complete.el ├── config-auxiliary-modes.el ├── config-clojure.el ├── config-company.el ├── config-consult.el ├── config-core.el ├── config-corfu.el ├── config-csharp.el ├── config-eglot.el ├── config-erc.el ├── config-eshell.el ├── config-evil.el ├── config-explorer.el ├── config-eyecandy.el ├── config-flycheck.el ├── config-go.el ├── config-helm.el ├── config-ido.el ├── config-ivy.el ├── config-js.el ├── config-lisp.el ├── config-lsp.el ├── config-misc.el ├── config-org.el ├── config-os.el ├── config-pairs.el ├── config-projectile.el ├── config-spelling.el ├── config-stylus.el ├── config-term.el ├── config-tree-sitter.el ├── config-typescript.el ├── config-util.el ├── config-vcs.el ├── config-web.el └── config-yasnippet.el ├── core └── core-boot.el ├── elisp ├── etags-select.el └── framemove.el ├── extra └── plantuml-server │ ├── package.json │ └── server.js ├── init.el └── snippets ├── html-mode ├── a.yasnippet ├── content.yasnippet ├── div.yasnippet ├── divc.yasnippet ├── in.yasnippet ├── script.yasnippet ├── section.yasnippet ├── t.yasnippet └── ta.yasnippet ├── js2-mode ├── .yas-parents ├── cl.yasnippet ├── f.yasnippet ├── fe.yasnippet ├── for.yasnippet ├── if.yasnippet ├── ng1.yasnippet ├── ng2.yasnippet ├── ng3.yasnippet ├── ng4.yasnippet ├── r.yasnippet ├── r_.yasnippet ├── rjquery.yasnippet ├── us.yasnippet ├── v.yasnippet └── while.yasnippet ├── typescript-mode ├── cl.yasnippet ├── component.yasnippet ├── debugger.yasnippet ├── import-all.yasnippet ├── import-default.yasnippet └── import-exports.yasnippet └── web-mode └── .yas-parents /.eshell-aliases: -------------------------------------------------------------------------------- 1 | alias grh git reset HEAD\~ 2 | alias ....... cd ../../../../../.. 3 | alias ...... cd ../../../../.. 4 | alias ..... cd ../../../.. 5 | alias .... cd ../../.. 6 | alias ... cd ../.. 7 | alias .. cd .. 8 | alias vim find-file $* 9 | alias sudo *sudo $* 10 | alias mist mvn install -DskipTests 11 | alias mcist mvn clean install -DskipTests 12 | alias mci mvn clean install 13 | alias ll ls -lh 14 | alias la ls -lah 15 | alias gst git status 16 | alias gsr git svn rebase 17 | alias gsp git stash pop 18 | alias gsc git svn dcommit 19 | alias gs git stash 20 | alias grb git rebase $* 21 | alias gp git pull $* 22 | alias gl2 git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all 23 | alias gl git log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all 24 | alias gd git diff --color $* 25 | alias gco git checkout $* 26 | alias gbr git branch $* 27 | alias gP git push $* 28 | alias g git $* 29 | alias d dired $1 30 | alias ag ag --vimgrep --color $* 31 | alias gf git fetch --all --prune 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | elpa 3 | auto-save-list 4 | eshell 5 | el-get 6 | custom.el 7 | node_modules 8 | *.elc 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2014 Bailey Ling 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dotemacs 2 | 3 | This is my personal KISS Emacs config. 4 | 5 | # intro 6 | 7 | There are many emacs configs, what makes this one different? 8 | 9 | ## kiss 10 | 11 | This is a keep it simple stupid config. It is built with 3 simple building blocks; small enough that it is white magic instead of black magic. 12 | 13 | ### simple building block 1 14 | 15 | ``` cl 16 | (defun require-package (package) 17 | "Ensures that PACKAGE is installed." 18 | (unless (or (package-installed-p package) 19 | (require package nil 'noerror)) 20 | (unless (assoc package package-archive-contents) 21 | (package-refresh-contents)) 22 | (package-install package))) 23 | ``` 24 | 25 | The code here is self-explanatory. This is how you declare what packages you want to install and use. This was taken from [Purcell][1]'s config. 26 | 27 | ### simple building block 2 28 | 29 | `with-eval-after-load` lets you defer execution of code until after a feature has been loaded. This is used extensively throughout the config, so wrapping macro has been written for ease of use. This is what keeps the config loading fast. 30 | 31 | Another useful feature is that it can also be used to run code if a package has been installed by using `-autoloads`; e.g. 32 | 33 | ```cl 34 | (after 'magit 35 | ;; execute after magit has been loaded 36 | ) 37 | (after "magit-autoloads" 38 | ;; execute if magit is installed/available 39 | ) 40 | (after [evil magit] 41 | ;; execute after evil and magit have been loaded 42 | ) 43 | ``` 44 | 45 | This was taken from [milkypostman][2]. 46 | 47 | ### simple building block 3 48 | 49 | At the bottom of the `init.el` is the following gem: 50 | 51 | ``` cl 52 | (cl-loop for file in (reverse (directory-files-recursively config-directory "\\.el$")) 53 | do (load file))) 54 | ``` 55 | 56 | Basically, it recursively finds anything in `config/` and loads it. If you want to add additional configuration for a new language, simply create `new-language.el` in `config/` and it will automatically be loaded. Files are loaded in reverse order so that any functions defined will be available in child nodes. 57 | 58 | ### other building blocks 59 | 60 | #### bindings in one place 61 | 62 | Another decision is to keep all keybindings in one place: `/bindings/**/*.el`. Because of this, things like [use-package][3] aren't particularly useful here because it doesn't add much value over `(require-package)` and `after`. 63 | 64 | Keybindings are the single most differentiating factor between configs. By defining them in one place, if you want to use/fork this config, you can simply change the bindings to your liking and still use all the other preconfigured packages as is. If you're not an Evil user, delete `config-evil.el` and you will get a pure Emacs experience. 65 | 66 | #### lazy installation of major mode packages 67 | 68 | By combining `after`, `require-package`, and `auto-mode-alist`, packages are installed only when necessary. If you never open a Javascript file, none of those packages will be installed. 69 | 70 | # install 71 | 72 | `git clone https://github.com/bling/dotemacs.git ~/.emacs.d` 73 | 74 | # disclaimer 75 | 76 | here be dragons. 77 | 78 | # license 79 | 80 | MIT 81 | 82 | 83 | [1]: https://github.com/purcell/emacs.d 84 | [2]: http://milkbox.net/note/single-file-master-emacs-configuration/ 85 | [3]: https://github.com/jwiegley/use-package 86 | -------------------------------------------------------------------------------- /bin/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bling/dotemacs/97c72c8425c5fb40ca328d1a711822ce0a0cfa26/bin/.gitkeep -------------------------------------------------------------------------------- /bindings/bindings.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (require-package 'which-key) 4 | (setq which-key-idle-delay 0.2) 5 | (setq which-key-min-display-lines 3) 6 | (which-key-mode) 7 | 8 | 9 | (setq lv-use-separator t) 10 | (require-package 'hydra) 11 | (autoload 'hydra-default-pre "hydra") 12 | 13 | 14 | (require-package 'transient) 15 | (setq transient-history-file (concat dotemacs-cache-directory "transient/history.el")) 16 | (setq transient-levels-file (concat dotemacs-cache-directory "transient/levels.el")) 17 | (setq transient-values-file (concat dotemacs-cache-directory "transient/values.el")) 18 | 19 | 20 | (defmacro /bindings/define-prefix-keys (keymap prefix &rest body) 21 | (declare (indent defun)) 22 | `(progn 23 | ,@(cl-loop for binding in body 24 | collect 25 | `(let ((seq ,(car binding)) 26 | (func ,(cadr binding)) 27 | (desc ,(caddr binding))) 28 | (define-key ,keymap (kbd seq) func) 29 | (when desc 30 | (which-key-add-key-based-replacements 31 | (if ,prefix 32 | (concat ,prefix " " seq) 33 | seq) 34 | desc)))))) 35 | 36 | (defmacro /bindings/define-keys (keymap &rest body) 37 | (declare (indent defun)) 38 | `(/bindings/define-prefix-keys ,keymap nil ,@body)) 39 | 40 | (defmacro /bindings/define-key (keymap sequence binding &optional description) 41 | (declare (indent defun)) 42 | `(/bindings/define-prefix-keys ,keymap nil 43 | (,sequence ,binding ,description))) 44 | 45 | 46 | 47 | (setq /bindings/normal-space-leader-map (make-sparse-keymap)) 48 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 49 | ("SPC" #'execute-extended-command "M-x") 50 | ("t" #'/hydras/toggles/body "toggle...") 51 | ("q" #'/hydras/quit/body "quit...") 52 | ("e" #'/hydras/errors/body "errors...") 53 | ("b" #'/hydras/buffers/body "buffers...") 54 | ("j" #'/hydras/jumps/body "jump...") 55 | ("f" #'/hydras/files/body "files...") 56 | ("s" #'/hydras/search/body "search...") 57 | ("l" #'/hydras/jumps/lambda-l-and-exit "lines(current)") 58 | ("L" #'/hydras/jumps/lambda-L-and-exit "lines(all)") 59 | ("o" #'/hydras/jumps/lambda-i-and-exit "outline") 60 | ("v" vc-prefix-map) 61 | ("4" ctl-x-4-map) 62 | ("5" ctl-x-5-map "frames...") 63 | ("'" #'/eshell/new-split "shell") 64 | ("y" (bind 65 | (cond 66 | ((eq dotemacs-switch-engine 'ivy) 67 | (call-interactively #'counsel-yank-pop)) 68 | ((eq dotemacs-switch-engine 'consult) 69 | (call-interactively #'consult-yank-pop)) 70 | ((eq dotemacs-switch-engine 'helm) 71 | (call-interactively #'helm-show-kill-ring)))) "kill-ring")) 72 | 73 | (after 'lsp-mode 74 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 75 | ("RET" lsp-command-map "lsp..."))) 76 | 77 | (after "magit-autoloads" 78 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 79 | ("g" #'/hydras/git/body "git..."))) 80 | 81 | (after "counsel-autoloads" 82 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 83 | ("i" #'/hydras/ivy/body "ivy..."))) 84 | 85 | (after "consult-autoloads" 86 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 87 | ("c" #'/hydras/consult/body "consult..."))) 88 | 89 | (after "helm-autoloads" 90 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 91 | ("h" #'/hydras/helm/body "helm..."))) 92 | 93 | (after "helm-dash-autoloads" 94 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 95 | ("d" #'helm-dash "dash"))) 96 | 97 | (after "fzf-autoloads" 98 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 99 | ("F" #'fzf))) 100 | 101 | 102 | 103 | (setq /bindings/normal-comma-leader-map (make-sparse-keymap)) 104 | (/bindings/define-prefix-keys /bindings/normal-comma-leader-map "," 105 | ("w" #'save-buffer) 106 | ("e" #'eval-last-sexp) 107 | (", e" #'eval-defun) 108 | ("E" #'eval-defun) 109 | ("f" ctl-x-5-map "frames") 110 | ("c" #'/eshell/new-split "eshell") 111 | ("C" #'customize-group) 112 | ("v" (kbd "C-w v C-w l") "vsplit") 113 | ("s" (kbd "C-w s C-w j") "split") 114 | ("P" #'package-list-packages "packages") 115 | ("h" help-map "help")) 116 | 117 | (after "paradox-autoloads" 118 | (/bindings/define-prefix-keys /bindings/normal-comma-leader-map "," 119 | ("P" #'paradox-list-packages))) 120 | 121 | 122 | 123 | ;; escape minibuffer 124 | (define-key minibuffer-local-map [escape] '/utils/minibuffer-keyboard-quit) 125 | (define-key minibuffer-local-ns-map [escape] '/utils/minibuffer-keyboard-quit) 126 | (define-key minibuffer-local-completion-map [escape] '/utils/minibuffer-keyboard-quit) 127 | (define-key minibuffer-local-must-match-map [escape] '/utils/minibuffer-keyboard-quit) 128 | (define-key minibuffer-local-isearch-map [escape] '/utils/minibuffer-keyboard-quit) 129 | 130 | (define-key minibuffer-local-map (kbd "C-w") 'backward-kill-word) 131 | 132 | 133 | (after 'ivy 134 | (define-key ivy-mode-map [escape] (kbd "C-g"))) 135 | 136 | 137 | (after "magit-autoloads" 138 | (global-set-key (kbd "C-x g") #'/hydras/git/body)) 139 | 140 | 141 | (global-set-key [f2] #'/explorer/toggle) 142 | (global-set-key [f3] #'/explorer/find-file) 143 | 144 | 145 | (after "multiple-cursors-autoloads" 146 | (global-set-key (kbd "C->") 'mc/mark-next-like-this) 147 | (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) 148 | (global-unset-key (kbd "M-")) 149 | (global-set-key (kbd "M-") 'mc/add-cursor-on-click)) 150 | 151 | 152 | (after 'comint 153 | (define-key comint-mode-map [up] 'comint-previous-input) 154 | (define-key comint-mode-map [down] 'comint-next-input)) 155 | 156 | 157 | (after 'auto-complete 158 | (define-key ac-completing-map (kbd "C-n") 'ac-next) 159 | (define-key ac-completing-map (kbd "C-p") 'ac-previous)) 160 | 161 | 162 | (after "expand-region-autoloads" 163 | (global-set-key (kbd "C-=") 'er/expand-region)) 164 | 165 | 166 | ;; mouse scrolling in terminal 167 | (unless (display-graphic-p) 168 | (global-set-key [mouse-4] (bind (scroll-down 1))) 169 | (global-set-key [mouse-5] (bind (scroll-up 1)))) 170 | 171 | 172 | (after 'compile 173 | (define-key compilation-mode-map (kbd "j") 'compilation-next-error) 174 | (define-key compilation-mode-map (kbd "k") 'compilation-previous-error)) 175 | 176 | 177 | (after "helm-autoloads" 178 | (/bindings/define-key (current-global-map) "C-c h" #'/hydras/helm/body "helm...")) 179 | 180 | 181 | (after "counsel-autoloads" 182 | (/bindings/define-key (current-global-map) "C-c i" #'/hydras/ivy/body "ivy...")) 183 | 184 | 185 | (global-set-key [prior] 'previous-buffer) 186 | (global-set-key [next] 'next-buffer) 187 | 188 | (/bindings/define-keys (current-global-map) 189 | ("C-c c" #'org-capture) 190 | ("C-c a" #'org-agenda) 191 | ("C-c l" #'org-store-link) 192 | ("C-c s" #'/utils/goto-scratch-buffer) 193 | ("C-c e" #'/utils/eval-and-replace) 194 | ("C-c t" #'/eshell/new-split)) 195 | 196 | (/bindings/define-keys (current-global-map) 197 | ("C-x c" #'calculator) 198 | ("C-x C" #'calendar) 199 | ("C-x C-b" #'ibuffer) 200 | ("C-x C-k" #'kill-this-buffer) 201 | ("C-x n" #'/hydras/narrow/body) 202 | ("C-x p" #'proced)) 203 | 204 | (after "vkill-autoloads" 205 | (autoload 'vkill "vkill" nil t) 206 | (global-set-key (kbd "C-x p") 'vkill)) 207 | 208 | (/bindings/define-keys (current-global-map) 209 | ("C-s" #'isearch-forward-regexp) 210 | ("C-M-s" #'isearch-forward) 211 | ("C-r" #'isearch-backward-regexp) 212 | ("C-M-r" #'isearch-backward)) 213 | 214 | 215 | (global-set-key (kbd "") (bind (profiler-start 'cpu+mem))) 216 | (global-set-key (kbd "") (bind (profiler-report) (profiler-stop))) 217 | 218 | 219 | ;; have no use for these default bindings 220 | (global-unset-key (kbd "C-x m")) 221 | 222 | 223 | (global-set-key (kbd "C-x C-c") (bind (message "Thou shall not quit!"))) 224 | (after 'evil 225 | (defadvice evil-quit (around dotemacs activate) 226 | (message "Thou shall not quit!")) 227 | (defadvice evil-quit-all (around dotemacs activate) 228 | (message "Thou shall not quit!"))) 229 | 230 | 231 | (provide 'config-bindings) 232 | -------------------------------------------------------------------------------- /bindings/modes/cider.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after [evil cider] 4 | (evil-define-key 'normal clojure-mode-map (kbd ", e") #'cider-eval-last-sexp) 5 | (evil-define-key 'visual clojure-mode-map (kbd ", e") #'cider-eval-region) 6 | (evil-define-key 'normal clojure-mode-map (kbd ", E") #'cider-eval-defun-at-point)) 7 | 8 | (provide 'config-bindings-cider) 9 | -------------------------------------------------------------------------------- /bindings/modes/company.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'company 4 | (define-key company-active-map (kbd "") #'company-select-previous) 5 | (define-key company-active-map (kbd "") #'company-select-next) 6 | (after "yasnippet-autoloads" 7 | (define-key company-active-map (kbd "") 8 | (bind (when (null (yas-expand)) 9 | (company-select-next)))))) 10 | 11 | (provide 'config-bindings-company) 12 | -------------------------------------------------------------------------------- /bindings/modes/corfu.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'corfu 4 | (define-key corfu-map (kbd "C-s") #'/corfu/move-to-minibuffer) 5 | (define-key corfu-map (kbd "") #'corfu-next) 6 | (define-key corfu-map (kbd "") #'corfu-previous)) 7 | 8 | (provide 'config-bindings-corfu) 9 | -------------------------------------------------------------------------------- /bindings/modes/eglot.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'eglot 4 | (defhydra /bindings/eglot/hydra (:exit t) 5 | ("d" xref-find-definitions "xref definitions") 6 | ("r" xref-find-references "xref references") 7 | ("=" eglot-format-buffer "format") 8 | ("a" eglot-code-actions "apply code action") 9 | ("e" flymake-show-buffer-diagnostics "file errors") 10 | ("E" flymake-show-project-diagnostics "project errors")) 11 | 12 | (evil-define-key 'normal eglot-mode-map (kbd "RET") #'/bindings/eglot/hydra/body) 13 | (evil-define-key 'normal eglot-mode-map (kbd "g r") #'eglot-rename) 14 | (evil-define-key 'normal eglot-mode-map (kbd "g d") #'xref-find-definitions) 15 | (evil-define-key 'normal eglot-mode-map (kbd "K") #'eldoc)) 16 | 17 | (provide 'config-bindings-eglot) 18 | -------------------------------------------------------------------------------- /bindings/modes/evil.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'evil-evilified-state 4 | (/bindings/define-keys evil-evilified-state-map 5 | ("g b" #'/hydras/buffers/lambda-b-and-exit) 6 | ("," /bindings/normal-comma-leader-map) 7 | ("SPC" /bindings/normal-space-leader-map))) 8 | 9 | 10 | 11 | (after 'evil 12 | (after "multiple-cursors-autoloads" 13 | (define-key evil-normal-state-map (kbd "g r") 'mc/mark-all-like-this-dwim)) 14 | 15 | (/bindings/define-keys evil-normal-state-map ("g d" #'xref-find-definitions)) 16 | 17 | (require-package 'key-chord) 18 | (key-chord-mode 1) 19 | (key-chord-define evil-insert-state-map "jk" 'evil-normal-state) 20 | (key-chord-define evil-insert-state-map "kj" 'evil-normal-state) 21 | 22 | (define-key evil-normal-state-map (kbd "SPC") /bindings/normal-space-leader-map) 23 | (define-key evil-normal-state-map (kbd ",") /bindings/normal-comma-leader-map) 24 | 25 | (define-key evil-normal-state-map (kbd ", h f") #'helpful-function) 26 | (define-key evil-normal-state-map (kbd ", h k") #'helpful-key) 27 | (define-key evil-normal-state-map (kbd ", h v") #'helpful-variable) 28 | (define-key evil-normal-state-map (kbd ", h x") #'helpful-command) 29 | 30 | (/bindings/define-keys evil-visual-state-map 31 | (", e" #'eval-region)) 32 | 33 | (/bindings/define-key evil-visual-state-map "SPC SPC" #'execute-extended-command "M-x") 34 | 35 | (after "evil-numbers-autoloads" 36 | (/bindings/define-key evil-normal-state-map "C-a" #'evil-numbers/inc-at-pt) 37 | (/bindings/define-key evil-normal-state-map "C-S-a" #'evil-numbers/dec-at-pt)) 38 | 39 | (after "git-gutter+-autoloads" 40 | (/bindings/define-keys evil-normal-state-map 41 | ("[ h" #'git-gutter+-previous-hunk) 42 | ("] h" #'git-gutter+-next-hunk)) 43 | (/bindings/define-keys evil-visual-state-map 44 | ("SPC g a" #'git-gutter+-stage-hunks) 45 | ("SPC g r" #'git-gutter+-revert-hunks)) 46 | (evil-ex-define-cmd "Gw" (bind (git-gutter+-stage-whole-buffer)))) 47 | 48 | (/bindings/define-keys evil-normal-state-map 49 | ("g p" "`[v`]") 50 | ("g b" #'/hydras/buffers/lambda-b-and-exit)) 51 | 52 | (/bindings/define-keys evil-normal-state-map 53 | ("C-b" #'evil-scroll-up) 54 | ("C-f" #'evil-scroll-down)) 55 | 56 | (global-set-key (kbd "C-w") 'evil-window-map) 57 | (after 'evil-evilified-state 58 | (/bindings/define-keys evil-evilified-state-map 59 | ("C-h" #'evil-window-left) 60 | ("C-j" #'evil-window-down) 61 | ("C-k" #'evil-window-up) 62 | ("C-l" #'evil-window-right))) 63 | (/bindings/define-keys evil-normal-state-map 64 | ("C-h" #'evil-window-left) 65 | ("C-j" #'evil-window-down) 66 | ("C-k" #'evil-window-up) 67 | ("C-l" #'evil-window-right) 68 | ("C-w C-h" #'evil-window-left) 69 | ("C-w C-j" #'evil-window-down) 70 | ("C-w C-k" #'evil-window-up) 71 | ("C-w C-l" #'evil-window-right)) 72 | 73 | (/bindings/define-keys evil-motion-state-map 74 | ("j" #'evil-next-visual-line) 75 | ("k" #'evil-previous-visual-line)) 76 | 77 | (/bindings/define-keys evil-normal-state-map 78 | ("p" #'/hydras/paste/evil-paste-after) 79 | ("P" #'/hydras/paste/evil-paste-before) 80 | ("Q" #'/utils/window-killer) 81 | ("Y" "y$")) 82 | 83 | ;; emacs lisp 84 | (evil-define-key 'normal emacs-lisp-mode-map "K" #'helpful-at-point) 85 | (add-hook 'elisp-slime-nav-mode-hook 86 | (lambda () 87 | (evil-define-key 'normal elisp-slime-nav-mode-map (kbd "g d") 'elisp-slime-nav-find-elisp-thing-at-point) 88 | (evil-define-key 'normal elisp-slime-nav-mode-map "K" #'helpful-at-point))) 89 | 90 | (after 'coffee-mode 91 | (evil-define-key 'visual coffee-mode-map (kbd ", p") 'coffee-compile-region) 92 | (evil-define-key 'normal coffee-mode-map (kbd ", p") 'coffee-compile-buffer)) 93 | 94 | (after 'css-mode 95 | (evil-define-key 'normal css-mode-map (kbd "RET") #'/hydras/modes/css-mode/body)) 96 | 97 | (after 'stylus-mode 98 | (define-key stylus-mode-map [remap eval-last-sexp] '/stylus/compile-and-eval-buffer) 99 | (evil-define-key 'visual stylus-mode-map (kbd ", p") '/stylus/compile-and-show-region) 100 | (evil-define-key 'normal stylus-mode-map (kbd ", p") '/stylus/compile-and-show-buffer)) 101 | 102 | (after 'js2-mode 103 | (evil-define-key 'normal js2-mode-map (kbd "g r") #'js2r-rename-var)) 104 | 105 | (after 'flycheck 106 | (evil-define-key 'normal flycheck-error-list-mode-map 107 | "j" #'flycheck-error-list-next-error 108 | "k" #'flycheck-error-list-previous-error)) 109 | 110 | (after 'diff-mode 111 | (evil-define-key 'normal diff-mode diff-mode-map 112 | "j" #'diff-hunk-next 113 | "k" #'diff-hunk-prev)) 114 | 115 | (after 'vc-annotate 116 | (evil-define-key 'normal vc-annotate-mode-map 117 | (kbd "M-p") #'vc-annotate-prev-revision 118 | (kbd "M-n") #'vc-annotate-next-revision 119 | "l" #'vc-annotate-show-log-revision-at-line)) 120 | 121 | (after "avy-autoloads" 122 | (define-key evil-operator-state-map (kbd "z") 'avy-goto-char-2) 123 | (define-key evil-normal-state-map (kbd "s") 'avy-goto-char-2) 124 | (define-key evil-motion-state-map (kbd "S-SPC") 'avy-goto-line)) 125 | 126 | (add-hook 'eshell-mode-hook 127 | (lambda () 128 | (local-set-key (kbd "C-h") #'evil-window-left) 129 | (local-set-key (kbd "C-j") #'evil-window-down) 130 | (local-set-key (kbd "C-k") #'evil-window-up) 131 | (local-set-key (kbd "C-l") #'evil-window-right))) 132 | 133 | (require-package 'evil-collection) 134 | (add-hook 'evil-collection-setup-hook 135 | (defun /bindings/evil/evil-collection-setup-hook (_mode mode-keymaps) 136 | ;; removes any bindings to SPC and , since they are global prefix keys 137 | (evil-collection-translate-key 'normal mode-keymaps 138 | (kbd "SPC") nil 139 | "," nil 140 | ))) 141 | (evil-collection-init) 142 | 143 | ;; fix compilation-mode integration 144 | (advice-add #'evil-collection-unimpaired-next-error :override #'next-error) 145 | (advice-add #'evil-collection-unimpaired-prev-error :override #'previous-error)) 146 | 147 | (provide 'config-bindings-evil) 148 | -------------------------------------------------------------------------------- /bindings/modes/hydras.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defun /hydras/switch-action (fallback &rest props) 4 | "Performs an action based on the value of `dotemacs-switch-engine'." 5 | (cond 6 | ((and (eq dotemacs-switch-engine 'ivy) (plist-get props :ivy)) 7 | (call-interactively (plist-get props :ivy))) 8 | ((and (eq dotemacs-switch-engine 'helm) (plist-get props :helm)) 9 | (call-interactively (plist-get props :helm))) 10 | ((and (eq dotemacs-switch-engine 'consult) (plist-get props :consult)) 11 | (call-interactively (plist-get props :consult))) 12 | (t 13 | (if fallback 14 | (call-interactively fallback) 15 | (message "unsupported action"))))) 16 | 17 | 18 | 19 | (defvar /hydras/errors/flycheck nil) 20 | (defun /hydras/errors/target-list () 21 | (if /hydras/errors/flycheck 22 | 'flycheck 23 | 'emacs)) 24 | (defhydra /hydras/errors (:hint nil) 25 | " 26 | errors: navigation flycheck 27 | ----------------------- --------------- 28 | _j_ → next error _l_ → list errors 29 | _k_ → previous error _?_ → describe checker 30 | _t_ → toggle list (%(/hydras/errors/target-list)) 31 | " 32 | ("j" (if /hydras/errors/flycheck 33 | (call-interactively #'flycheck-next-error) 34 | (call-interactively #'next-error))) 35 | ("k" (if /hydras/errors/flycheck 36 | (call-interactively #'flycheck-previous-error) 37 | (call-interactively #'previous-error))) 38 | ("t" (setq /hydras/errors/flycheck (not /hydras/errors/flycheck))) 39 | ("?" flycheck-describe-checker) 40 | ("l" flycheck-list-errors :exit t)) 41 | 42 | 43 | 44 | (defhydra /hydras/quit (:hint nil :exit t) 45 | " 46 | quit: _q_ → quit _r_ → restart 47 | " 48 | ("q" save-buffers-kill-terminal) 49 | ("r" (restart-emacs '("--debug-init")))) 50 | 51 | 52 | 53 | (defhydra /hydras/buffers (:hint nil :exit t) 54 | " 55 | buffers: _b_ → buffers _k_ → kill buffer _f_ → reveal in os 56 | _m_ → goto messages _e_ → erase buffer ^ ^ 57 | _s_ → goto scratch _E_ → erase buffer (force) ^ ^ 58 | " 59 | ("s" /utils/goto-scratch-buffer) 60 | ("k" kill-this-buffer) 61 | ("f" /os/reveal-in-os) 62 | ("m" (switch-to-buffer "*Messages*")) 63 | ("b" (/hydras/switch-action #'switch-to-buffer :ivy #'/ivy/everything :helm #'/helm/everything :consult #'consult-buffer)) 64 | ("e" erase-buffer) 65 | ("E" (let ((inhibit-read-only t)) (erase-buffer)))) 66 | 67 | 68 | 69 | (defhydra /hydras/jumps (:hint nil :exit t) 70 | " 71 | jump _i_ → outline in current buffer _l_ → lines in current buffer 72 | _b_ → bookmarks _L_ → lines in all buffers 73 | " 74 | ("i" (/hydras/switch-action #'imenu :ivy #'counsel-imenu :helm #'helm-semantic-or-imenu :consult #'consult-imenu)) 75 | ("l" (/hydras/switch-action nil :ivy #'swiper :helm #'helm-swoop :consult #'consult-line)) 76 | ("L" (/hydras/switch-action nil :ivy #'swiper-all :helm #'helm-multi-swoop-all :consult #'consult-line-multi)) 77 | ("b" bookmark-jump)) 78 | 79 | 80 | 81 | (defhydra /hydras/search (:hint nil :exit t) 82 | " 83 | search project ^^directory ^^buffer ^^buffers ^^web 84 | ------- ^^--------- ^^------ ^^------- ^^--- 85 | _a_ → ag _A_ → ag _l_ → lines _L_ → lines _g_ → google 86 | _p_ → pt _P_ → pt 87 | " 88 | ("a" projectile-ag) 89 | ("p" projectile-pt) 90 | ("A" ag) 91 | ("P" pt-regexp) 92 | ("l" /hydras/jumps/lambda-l-and-exit) 93 | ("L" /hydras/jumps/lambda-L-and-exit) 94 | ("g" /utils/google)) 95 | 96 | 97 | 98 | (defhydra /hydras/files/convert (:hint nil :exit t) 99 | " 100 | convert to _d_ → dos 101 | _u_ → unix 102 | " 103 | ("d" /utils/set-buffer-to-dos-format) 104 | ("u" /utils/set-buffer-to-unix-format)) 105 | 106 | (defhydra /hydras/files (:hint nil :exit t) 107 | " 108 | files: _f_ → find files _D_ → delete _y_ → copy filename _E_ → edit as root _z_ → fzf 109 | _r_ → recent files _R_ → rename _c_ → copy file _C_ → convert 110 | " 111 | ("D" /utils/delete-current-buffer-file) 112 | ("R" /utils/rename-current-buffer-file) 113 | ("f" (/hydras/switch-action #'find-file :ivy #'counsel-find-file :helm #'helm-find-files)) 114 | ("r" (/hydras/switch-action nil :ivy #'counsel-recentf :helm #'helm-recentf :consult #'consult-recent-file)) 115 | ("y" /utils/copy-file-name-to-clipboard) 116 | ("E" /utils/find-file-as-root) 117 | ("c" copy-file) 118 | ("C" /hydras/files/convert/body) 119 | ("z" fzf)) 120 | 121 | 122 | 123 | (defun /hydras/toggles/activate-switch-engine (engine) 124 | (let ((func (intern (concat "/" (symbol-name dotemacs-switch-engine) "/activate-as-switch-engine")))) 125 | (apply func '(nil))) 126 | (let ((func (intern (concat "/" (symbol-name engine) "/activate-as-switch-engine")))) 127 | (apply func '(t))) 128 | (setq dotemacs-switch-engine engine)) 129 | 130 | (defhydra /hydras/toggles/switch-engine (:hint nil :exit t) 131 | " 132 | engine: _h_ → helm 133 | _c_ → consult 134 | _i_ → ivy 135 | _o_ → ido 136 | " 137 | ("h" (/hydras/toggles/activate-switch-engine 'helm)) 138 | ("i" (/hydras/toggles/activate-switch-engine 'ivy)) 139 | ("c" (/hydras/toggles/activate-switch-engine 'consult)) 140 | ("o" (/hydras/toggles/activate-switch-engine 'ido))) 141 | 142 | (defvar /hydras/toggles/vdiff nil) 143 | (defhydra /hydras/toggles (:hint nil :exit t) 144 | " 145 | toggle: _a_ → aggressive indent _s_ → flycheck _r_ → read only _t_ → truncate lines _e_ → debug on error ' → switch-engine 146 | _f_ → auto-fill _S_ → flyspell _c_ → completion _W_ → word wrap _g_ → debug on quit _d_ → ediff/vdiff 147 | _w_ → whitespace ^ ^ _p_ → auto-pairing _b_ → page break 148 | " 149 | ("a" aggressive-indent-mode) 150 | ("c" (if (eq dotemacs-completion-engine 'company) 151 | (call-interactively 'company-mode) 152 | (call-interactively 'auto-complete-mode))) 153 | ("t" toggle-truncate-lines) 154 | ("e" toggle-debug-on-error) 155 | ("g" toggle-debug-on-quit) 156 | ("b" page-break-lines-mode) 157 | ("s" flycheck-mode) 158 | ("S" flyspell-mode) 159 | ("w" whitespace-mode) 160 | ("W" toggle-word-wrap) 161 | ("r" read-only-mode) 162 | ("f" auto-fill-mode) 163 | ("p" /pairs/toggle) 164 | ("d" (progn 165 | (if /hydras/toggles/vdiff 166 | (progn 167 | (/bindings/vdiff/turn-off) 168 | (message "using ediff")) 169 | (/vcs/setup-vdiff) 170 | (/bindings/vdiff/turn-on) 171 | (message "using vdiff")) 172 | (setq /hydras/toggles/vdiff (not /hydras/toggles/vdiff)))) 173 | ("'" /hydras/toggles/switch-engine/body)) 174 | 175 | 176 | 177 | (defhydra /hydras/helm (:hint nil :exit t) 178 | " 179 | helm: _a_ → apropos _m_ → bookmarks _y_ → kill-ring _l_ → swoop 180 | _b_ → mini _p_ → projectile _d_ → dash _L_ → swoop (multi) 181 | _e_ → recentf _r_ → register _x_ → M-x 182 | _f_ → files _t_ → tags 183 | " 184 | ("b" /helm/everything) 185 | ("a" helm-apropos) 186 | ("d" helm-dash) 187 | ("e" helm-recentf) 188 | ("f" helm-find-files) 189 | ("m" helm-bookmarks) 190 | ("p" helm-projectile) 191 | ("r" helm-register) 192 | ("t" helm-etags-select) 193 | ("x" helm-M-x) 194 | ("l" helm-swoop) 195 | ("L" helm-multi-swoop-all) 196 | ("y" helm-show-kill-ring)) 197 | 198 | 199 | 200 | (defhydra /hydras/ivy (:hint nil :exit t) 201 | " 202 | ivy: _b_ → mini _y_ → kill-ring _l_ → swiper 203 | _e_ → recentf _x_ → M-x _L_ → swiper (multi) 204 | _f_ → files 205 | " 206 | ("b" /ivy/everything) 207 | ("e" counsel-recentf) 208 | ("f" counsel-find-file) 209 | ("y" counsel-yank-pop) 210 | ("x" counsel-M-x) 211 | ("l" swiper) 212 | ("L" swiper-all)) 213 | 214 | 215 | 216 | (defhydra /hydras/consult (:hint nil :exit t) 217 | " 218 | consult: _b_ → mini _g_ → goto line _y_ → kill-ring _d_ → dash 219 | _e_ → recentf _l_ → lines _r_ → register _E_ → errors 220 | _f_ → files _L_ → lines (multi) _x_ → M-x _t_ → themes 221 | _m_ → bookmarks 222 | " 223 | ("b" consult-buffer) 224 | ("d" consult-dash) 225 | ("e" consult-recent-file) 226 | ("E" consult-flycheck) 227 | ("f" find-file) 228 | ("g" consult-goto-line) 229 | ("l" consult-line) 230 | ("L" consult-line-multi) 231 | ("m" consult-bookmark) 232 | ("r" consult-register) 233 | ("t" consult-theme) 234 | ("x" execute-extended-command) 235 | ("y" consult-yank-from-kill-ring)) 236 | 237 | 238 | 239 | (autoload 'magit-blame "magit-blame" nil t) 240 | (autoload 'magit-diff "magit-diff" nil t) 241 | (autoload 'magit-log "magit-log" nil t) 242 | 243 | (defhydra /hydras/git (:hint nil :exit t) 244 | " 245 | magit: _s_ → status _l_ → log _f_ → file staging: _a_ → +hunk _A_ → +buffer history: _t_ → time machine 246 | _c_ → commit _d_ → diff _z_ → stash _r_ → -hunk _R_ → -buffer 247 | _p_ → push _b_ → blame _m_ → merge 248 | 249 | " 250 | ("s" magit-status) 251 | ("b" magit-blame) 252 | ("f" magit-file-dispatch) 253 | ("z" magit-stash) 254 | ("l" magit-log) 255 | ("d" magit-diff) 256 | ("c" magit-commit) 257 | ("m" magit-merge) 258 | ("p" magit-push) 259 | ("a" git-gutter+-stage-hunks) 260 | ("r" git-gutter+-revert-hunk) 261 | ("A" git-gutter+-stage-whole-buffer) 262 | ("R" git-gutter+-unstage-whole-buffer) 263 | ("t" git-timemachine)) 264 | 265 | 266 | 267 | (defhydra /hydras/paste (:hint nil) 268 | " 269 | paste: _C-j_ → cycle next _p_ → paste before pos: %(length kill-ring-yank-pointer) 270 | _C-k_ → cycle previous _P_ → paste after len: %(length kill-ring) 271 | " 272 | ("C-j" evil-paste-pop-next) 273 | ("C-k" evil-paste-pop) 274 | ("p" evil-paste-after) 275 | ("P" evil-paste-before)) 276 | 277 | 278 | 279 | (when (> (length narrow-map) 8) 280 | (error "`narrow-map' has more than 7 bindings!")) 281 | (defhydra /hydras/narrow (:hint nil :exit t) 282 | " 283 | narrow: _d_ → defun _b_ → org-block _w_ → widen 284 | _n_ → region _e_ → org-element 285 | _p_ → page _s_ → org-subtree 286 | " 287 | ("b" org-narrow-to-block) 288 | ("e" org-narrow-to-element) 289 | ("s" org-narrow-to-subtree) 290 | ("d" narrow-to-defun) 291 | ("n" narrow-to-region) 292 | ("p" narrow-to-page) 293 | ("w" widen)) 294 | 295 | 296 | 297 | (defhydra /hydras/modes/css-mode (:hint nil :exit t) 298 | " 299 | css: _t_ generate type definition for CSS 300 | " 301 | ("t" /typescript/generate-typings-for-css)) 302 | 303 | 304 | (provide 'config-bindings-hydras) 305 | -------------------------------------------------------------------------------- /bindings/modes/lsp.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'lsp-ui 4 | (defhydra /bindings/lsp/workspace/hydra (:exit t) 5 | ("a" lsp-workspace-folders-add "add folder" :column "workspace") 6 | ("r" lsp-workspace-folders-remove "remove folder") 7 | ("s" lsp-workspace-folders-switch "switch folder")) 8 | 9 | (defhydra /bindings/lsp/hydra (:exit t) 10 | ("d" lsp-ui-peek-find-definitions "peek definition" :column "definitions") 11 | ("D" xref-find-definitions "xref definitions") 12 | 13 | ("r" lsp-ui-peek-find-references "peek references" :column "references") 14 | ("R" xref-find-references "xref references") 15 | ("u" lsp-treemacs-references "usages") 16 | 17 | ("n" lsp-rename "rename" :column "refactor") 18 | ("=" lsp-format-buffer "format") 19 | ("a" lsp-ui-sideline-apply-code-actions "apply code action") 20 | 21 | ;; ("o" lsp-ui-imenu "outline" :column "info") 22 | ("o" lsp-treemacs-symbols "outline" :column "info") 23 | 24 | ("e" lsp-treemacs-errors-list "list" :column "errors") 25 | 26 | ("S" lsp-restart-workspace "restart workspace" :column "workspace") 27 | ("w" /bindings/lsp/workspace/hydra/body "folders") 28 | ("i" lsp-describe-session "session info")) 29 | 30 | (evil-define-key 'normal lsp-ui-mode-map (kbd "RET") #'/bindings/lsp/hydra/body) 31 | (evil-define-key 'normal lsp-ui-mode-map (kbd "g r") #'lsp-rename) 32 | (evil-define-key 'normal lsp-ui-mode-map (kbd "g d") #'lsp-ui-peek-find-definitions) 33 | (evil-define-key 'normal lsp-ui-mode-map (kbd "K") #'lsp-describe-thing-at-point) 34 | 35 | (define-key lsp-ui-peek-mode-map (kbd "k") #'lsp-ui-peek--select-prev) 36 | (define-key lsp-ui-peek-mode-map (kbd "j") #'lsp-ui-peek--select-next) 37 | (define-key lsp-ui-peek-mode-map (kbd "C-k") #'lsp-ui-peek--select-prev-file) 38 | (define-key lsp-ui-peek-mode-map (kbd "C-j") #'lsp-ui-peek--select-next-file)) 39 | 40 | (provide 'config-bindings-lsp) 41 | -------------------------------------------------------------------------------- /bindings/modes/projectile.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after "projectile-autoloads" 4 | (global-set-key (kbd "C-c p") projectile-command-map) 5 | 6 | (/bindings/define-prefix-keys /bindings/normal-space-leader-map "SPC" 7 | ("p" #'projectile-command-map "projectile...") 8 | ("/" 9 | (bind 10 | (setq gc-cons-threshold most-positive-fixnum) 11 | (if current-prefix-arg 12 | (cond 13 | ((executable-find "rg") (call-interactively #'projectile-ripgrep)) 14 | ((executable-find "ag") (call-interactively #'projectile-ag)) 15 | ((executable-find "pt") (call-interactively #'projectile-pt)) 16 | ((executable-find "ack") (call-interactively #'projectile-ack)) 17 | (t (call-interactively #'projectile-grep))) 18 | (cond 19 | ((eq dotemacs-switch-engine 'ivy) 20 | (cond 21 | ((executable-find "rg") (counsel-projectile-rg)) 22 | ((executable-find "ag") (counsel-projectile-ag)) 23 | ((executable-find "pt") (counsel-pt)) 24 | ((executable-find "ack") (counsel-ack)) 25 | (t (counsel-grep)))) 26 | ((eq dotemacs-switch-engine 'consult) 27 | (cond 28 | ((executable-find "rg") (consult-ripgrep)) 29 | ((and (executable-find "git") (vc-git-root default-directory)) (consult-git-grep)) 30 | (t (consult-grep)))) 31 | ((eq dotemacs-switch-engine 'helm) 32 | (cond 33 | ((executable-find "rg") (helm-projectile-rg)) 34 | ((executable-find "ag") (helm-projectile-ag)) 35 | ((executable-find "ack") (helm-projectile-ack)) 36 | (t (helm-projectile-grep))))))) 37 | "search..."))) 38 | 39 | (after 'evil 40 | (/bindings/define-keys evil-normal-state-map 41 | ("C-p" (bind 42 | (setq gc-cons-threshold most-positive-fixnum) 43 | (cond ((eq dotemacs-switch-engine 'helm) 44 | (call-interactively #'helm-projectile)) 45 | ((eq dotemacs-switch-engine 'ivy) 46 | (call-interactively #'counsel-projectile-find-file-dwim)) 47 | ((eq dotemacs-switch-engine 'consult) 48 | (call-interactively #'consult-projectile)) 49 | (t 50 | (call-interactively #'projectile-find-file-dwim))))))) 51 | 52 | (provide 'config-bindings-projectile) 53 | -------------------------------------------------------------------------------- /bindings/modes/tide.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after [evil tide hydra] 4 | (defhydra /bindings/tide/hydra (:exit t) 5 | ("a" tide-nav "navigate" :column "nav") 6 | ("r" tide-references "find references") 7 | ("d" tide-jump-to-definition "jump to def") 8 | 9 | ("e" tide-project-errors "project errors" :column "info") 10 | ("h" tide-documentation-at-point "doc at point") 11 | 12 | ("R" tide-refactor "refactor" :column "refactor") 13 | ("n" tide-rename-symbol "rename symbol") 14 | ("N" tide-rename-file "rename file") 15 | ("o" tide-organize-imports "organize imports") 16 | ("f" tide-fix "fix") 17 | ("=" tide-format "format") 18 | 19 | ("j" tide-jsdoc-template "insert jsdoc" :column "insert") 20 | ("l" tide-add-tslint-disable-next-line "tslint disable next line") 21 | 22 | ("v" tide-verify-setup "verify setup" :column "setup") 23 | ("S" tide-restart-server "restart server")) 24 | 25 | (evil-define-key 'normal tide-mode-map (kbd "RET") #'/bindings/tide/hydra/body) 26 | (evil-define-key 'normal tide-mode-map (kbd "g r") #'tide-rename-symbol) 27 | (evil-define-key 'normal tide-mode-map (kbd "K") #'tide-documentation-at-point) 28 | 29 | (evil-define-key 'normal tide-references-mode-map 30 | (kbd "j") #'tide-find-next-reference 31 | (kbd "k") #'tide-find-previous-reference) 32 | 33 | (evil-define-key 'normal tide-project-errors-mode-map 34 | (kbd "j") #'tide-find-next-error 35 | (kbd "k") #'tide-find-previous-error)) 36 | 37 | (provide 'config-bindings-tide) 38 | -------------------------------------------------------------------------------- /bindings/modes/vdiff.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'vdiff 4 | (define-key vdiff-mode-map (kbd "C-c") vdiff-mode-prefix-map) 5 | (define-key vdiff-3way-mode-map (kbd "C-c") vdiff-mode-prefix-map)) 6 | 7 | (after [evil vdiff] 8 | (evil-define-minor-mode-key 'normal 'vdiff-mode (kbd "RET") #'vdiff-hydra/body) 9 | (evil-define-minor-mode-key 'insert 'vdiff-mode (kbd "RET") #'evil-ret) 10 | (evil-define-minor-mode-key 'normal 'vdiff-3way-mode (kbd "RET") #'vdiff-hydra/body) 11 | (evil-define-minor-mode-key 'insert 'vdiff-3way-mode (kbd "RET") #'evil-ret)) 12 | 13 | (defun /bindings/vdiff/turn-on () 14 | (after [magit vdiff] 15 | (define-key magit-mode-map "e" 'vdiff-magit-dwim) 16 | (define-key magit-mode-map "E" 'vdiff-magit-popup) 17 | (setcdr (assoc ?e (plist-get magit-dispatch-popup :actions)) 18 | '("vdiff dwim" 'vdiff-magit-dwim)) 19 | (setcdr (assoc ?E (plist-get magit-dispatch-popup :actions)) 20 | '("vdiff popup" 'vdiff-magit-popup)))) 21 | 22 | (defun /bindings/vdiff/turn-off () 23 | (after [magit] 24 | (define-key magit-mode-map "e" 'magit-ediff-dwim) 25 | (define-key magit-mode-map "E" 'magit-ediff-popup) 26 | (setcdr (assoc ?e (plist-get magit-dispatch-popup :actions)) 27 | '("Ediff dwimming" 'magit-ediff-dwim)) 28 | (setcdr (assoc ?E (plist-get magit-dispatch-popup :actions)) 29 | '("Ediffing" 'magit-ediff-popup)))) 30 | 31 | (provide 'config-bindings-vdiff) 32 | -------------------------------------------------------------------------------- /config/config-auto-complete.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (when (eq dotemacs-completion-engine 'auto-complete) 4 | (require-package 'auto-complete) 5 | 6 | (setq ac-auto-show-menu t) 7 | (setq ac-auto-start t) 8 | (setq ac-comphist-file (concat dotemacs-cache-directory "ac-comphist.dat")) 9 | (setq ac-quick-help-delay 0.3) 10 | (setq ac-quick-help-height 30) 11 | (setq ac-show-menu-immediately-on-auto-complete t) 12 | 13 | (ac-config-default) 14 | 15 | (dolist (mode '(vimrc-mode html-mode stylus-mode)) 16 | (add-to-list 'ac-modes mode)) 17 | 18 | (after 'linum 19 | (ac-linum-workaround)) 20 | 21 | (after 'yasnippet 22 | (add-hook 'yas-before-expand-snippet-hook (lambda () (auto-complete-mode -1))) 23 | (add-hook 'yas-after-exit-snippet-hook (lambda () (auto-complete-mode t))) 24 | (defadvice ac-expand (before dotemacs activate) 25 | (when (yas-expand) 26 | (ac-stop)))) 27 | 28 | (require-package 'ac-etags) 29 | (setq ac-etags-requires 1) 30 | (after 'etags 31 | (ac-etags-setup))) 32 | 33 | (provide 'config-auto-complete) 34 | -------------------------------------------------------------------------------- /config/config-auxiliary-modes.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (/boot/lazy-major-mode "Dockerfile$" dockerfile-mode) 4 | (/boot/lazy-major-mode "\\.\\(md\\|markdown\\)$" markdown-mode) 5 | (/boot/lazy-major-mode "\\.csv$" csv-mode) 6 | (/boot/lazy-major-mode "\\.gitlab-ci.yml$" gitlab-ci-mode) 7 | (/boot/lazy-major-mode "\\.json$" json-mode) 8 | (/boot/lazy-major-mode "\\.lua$" lua-mode) 9 | (/boot/lazy-major-mode "\\.toml$" toml-mode) 10 | (/boot/lazy-major-mode "\\.vim$" vimrc-mode) 11 | (/boot/lazy-major-mode "\\.yaml$" yaml-mode) 12 | (/boot/lazy-major-mode "\\.rego$" rego-mode) 13 | 14 | (provide 'config-auxiliary-modes) 15 | -------------------------------------------------------------------------------- /config/config-clojure.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (add-hook 'clojure-mode-hook 4 | (lambda () 5 | (require-package 'cider) 6 | (cider-mode t))) 7 | 8 | (after [evil cider] 9 | (add-hook 'cider-mode-hook #'eldoc-mode) 10 | (add-hook 'cider-repl-mode-hook #'eldoc-mode) 11 | 12 | (evil-set-initial-state 'cider-popup-buffer-mode 'motion) 13 | (evil-set-initial-state 'cider-browse-ns-mode 'motion) 14 | (evil-set-initial-state 'cider-repl-mode 'emacs)) 15 | 16 | (provide 'config-clojure) 17 | -------------------------------------------------------------------------------- /config/config-company.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (when (eq dotemacs-completion-engine 'company) 4 | 5 | (defgroup dotemacs-company nil 6 | "Configuration options for company-mode." 7 | :group 'dotemacs 8 | :prefix 'dotemacs-company) 9 | 10 | (require-package 'company) 11 | 12 | (setq company-idle-delay 0.2) 13 | (setq company-minimum-prefix-length 1) 14 | (setq company-show-numbers t) 15 | (setq company-tooltip-limit 20) 16 | 17 | (setq company-dabbrev-downcase nil) 18 | (setq company-dabbrev-ignore-case t) 19 | 20 | (setq company-dabbrev-code-ignore-case t) 21 | (setq company-dabbrev-code-everywhere t) 22 | 23 | (setq company-etags-ignore-case t) 24 | 25 | (setq company-global-modes 26 | '(not 27 | comint-mode 28 | erc-mode 29 | eshell-mode 30 | term-char-mode 31 | term-line-mode 32 | term-mode 33 | text-mode)) 34 | 35 | (global-company-mode) 36 | 37 | ;; (when (display-graphic-p) 38 | ;; (require-package 'company-quickhelp) 39 | ;; (setq company-quickhelp-delay 0.2) 40 | ;; (company-quickhelp-mode t)) 41 | 42 | (require-package 'company-posframe) 43 | (company-posframe-mode 1) 44 | 45 | (after 'yasnippet 46 | (setq company-backends 47 | (mapcar 48 | (lambda (backend) 49 | (if (and (listp backend) (member 'company-yasnippet backend)) 50 | backend 51 | (append (if (consp backend) backend (list backend)) 52 | '(:with company-yasnippet)))) 53 | company-backends))) 54 | 55 | (unless (face-attribute 'company-tooltip :background) 56 | (set-face-attribute 'company-tooltip nil :background "black" :foreground "gray40") 57 | (set-face-attribute 'company-tooltip-selection nil :inherit 'company-tooltip :background "gray15") 58 | (set-face-attribute 'company-preview nil :background "black") 59 | (set-face-attribute 'company-preview-common nil :inherit 'company-preview :foreground "gray40") 60 | (set-face-attribute 'company-scrollbar-bg nil :inherit 'company-tooltip :background "gray20") 61 | (set-face-attribute 'company-scrollbar-fg nil :background "gray40")) 62 | ) 63 | 64 | (provide 'config-company) 65 | -------------------------------------------------------------------------------- /config/config-consult.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-consult nil 4 | "Configuration options for Consult." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-consult) 7 | 8 | (defcustom dotemacs-consult/filtering 9 | 'prescient 10 | "The filtering library to use." 11 | :type '(radio 12 | (const :tag "orderless" orderless) 13 | (const :tag "prescient" prescient)) 14 | :group 'dotemacs-consult) 15 | 16 | 17 | 18 | (defun /consult/init () 19 | (require-package 'vertico) 20 | (setq vertico-count 20) 21 | 22 | (require-package 'marginalia) 23 | 24 | (cond 25 | ((eq dotemacs-consult/filtering 'orderless) 26 | (require-package 'orderless) 27 | (require 'orderless) 28 | (add-to-list 'orderless-matching-styles 'orderless-flex)) 29 | ((eq dotemacs-consult/filtering 'prescient) 30 | (require-package 'prescient) 31 | (require 'prescient) 32 | (setq prescient-save-file (concat dotemacs-cache-directory "prescient-save.el")) 33 | (setq prescient-persist-mode t) 34 | (add-to-list 'prescient-filter-method 'fuzzy) 35 | 36 | (require-package 'vertico-prescient) 37 | (setq vertico-prescient-override-sorting t))) 38 | 39 | (require-package 'consult) 40 | 41 | (after 'projectile 42 | (require-package 'consult-projectile) 43 | (require 'consult-projectile) 44 | (add-to-list 'consult-projectile-sources 'consult-projectile--source-projectile-recentf)) 45 | 46 | (after 'eglot 47 | (require-package 'consult-eglot)) 48 | 49 | (after 'lsp-mode 50 | (require-package 'consult-lsp))) 51 | 52 | (defun /consult/activate-as-switch-engine (on) 53 | (/consult/init) 54 | (if on 55 | (progn 56 | (setq completion-in-region-function 57 | (lambda (&rest args) 58 | (apply (if vertico-mode 59 | #'consult-completion-in-region 60 | #'completion--in-region) 61 | args))) 62 | (when (eq dotemacs-consult/filtering 'orderless) 63 | (add-to-list 'completion-styles 'orderless)) 64 | (when (eq dotemacs-consult/filtering 'prescient) 65 | (vertico-prescient-mode t)) 66 | (marginalia-mode t) 67 | (vertico-mode t)) 68 | (setq completion-in-region-function #'completion--in-region) 69 | (when (eq dotemacs-consult/filtering 'orderless) 70 | (setq completion-styles (delete 'orderless completion-styles))) 71 | (when (eq dotemacs-consult/filtering 'prescient) 72 | (vertico-prescient-mode -1)) 73 | (marginalia-mode -1) 74 | (vertico-mode -1))) 75 | 76 | (when (eq dotemacs-switch-engine 'consult) 77 | (/consult/activate-as-switch-engine t)) 78 | 79 | (provide 'config-consult) 80 | 81 | -------------------------------------------------------------------------------- /config/config-core.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-core nil 4 | "Configuration options for core Emacs functionality." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-core) 7 | 8 | (defcustom dotemacs-core/maximum-file-size (* 1024 1024 20) 9 | "The threshold for when `fundamental-mode' is used instead of the desired major mode." 10 | :type 'integer 11 | :group 'dotemacs-core) 12 | 13 | 14 | 15 | (setq server-auth-dir (concat dotemacs-cache-directory "server")) 16 | 17 | 18 | ;; move cursor to the last position upon open 19 | (require 'saveplace) 20 | (setq save-place-file (concat dotemacs-cache-directory "places")) 21 | (setq-default save-place t) 22 | 23 | 24 | ;; savehist 25 | (setq savehist-file (concat dotemacs-cache-directory "savehist") 26 | savehist-additional-variables '(search ring regexp-search-ring) 27 | savehist-autosave-interval 60 28 | history-length 1000) 29 | (savehist-mode) 30 | 31 | 32 | ;; desktop 33 | (setq desktop-path `(,dotemacs-cache-directory)) 34 | (setq desktop-base-file-name "emacs.desktop") 35 | (setq desktop-base-lock-name "emacs.desktop.lock") 36 | (setq desktop-save t) 37 | (desktop-save-mode t) 38 | 39 | 40 | ;; undo 41 | (setq undo-limit (* 1024 10 10)) 42 | (setq undo-outer-limit (* 1024 10 10)) 43 | (setq undo-strong-limit (* 1024 10 10)) 44 | 45 | 46 | ;; recent files 47 | (require 'recentf) 48 | (setq recentf-save-file (concat dotemacs-cache-directory "recentf")) 49 | (setq recentf-max-saved-items 1000) 50 | (setq recentf-max-menu-items 500) 51 | (setq recentf-auto-cleanup 300) 52 | (add-to-list 'recentf-exclude "COMMIT_EDITMSG\\'") 53 | (add-to-list 'recentf-exclude ".*elpa.*autoloads\.el$") 54 | (recentf-mode t) 55 | (run-with-idle-timer 600 t #'recentf-save-list) 56 | 57 | 58 | ;; gc 59 | (defun /core/minibuffer-setup-hook () (setq gc-cons-threshold most-positive-fixnum)) 60 | (defun /core/minibuffer-exit-hook () (setq gc-cons-threshold (* 64 1024 1024))) 61 | (add-hook 'minibuffer-setup-hook #'/core/minibuffer-setup-hook) 62 | (add-hook 'minibuffer-exit-hook #'/core/minibuffer-exit-hook) 63 | 64 | 65 | ;; pcomplete 66 | (setq pcomplete-ignore-case t) 67 | 68 | 69 | ;; imenu 70 | (setq-default imenu-auto-rescan t) 71 | 72 | 73 | ;; narrowing 74 | (put 'narrow-to-region 'disabled nil) 75 | 76 | 77 | ;; dired 78 | (after 'dired 79 | (require 'dired-x)) 80 | 81 | 82 | ;; url 83 | (setq url-configuration-directory (concat dotemacs-cache-directory "url/")) 84 | 85 | 86 | ;; tramp 87 | (setq tramp-persistency-file-name (concat dotemacs-cache-directory "tramp")) 88 | 89 | 90 | ;; comint 91 | (after 'comint 92 | (defun /core/toggle-comint-scroll-to-bottom-on-output () 93 | (interactive) 94 | (if comint-scroll-to-bottom-on-output 95 | (setq comint-scroll-to-bottom-on-output nil) 96 | (setq comint-scroll-to-bottom-on-output t)))) 97 | 98 | 99 | ;; compile 100 | (setq compilation-always-kill t) 101 | (setq compilation-ask-about-save nil) 102 | (add-hook 'compilation-filter-hook 103 | (lambda () 104 | (when (eq major-mode 'compilation-mode) 105 | (require 'ansi-color) 106 | (let ((inhibit-read-only t)) 107 | (ansi-color-apply-on-region (point-min) (point-max)))))) 108 | 109 | 110 | ;; bookmarks 111 | (setq bookmark-default-file (concat dotemacs-cache-directory "bookmarks")) 112 | (setq bookmark-save-flag 1) ;; save after every change 113 | 114 | 115 | ;; fringe 116 | (when (display-graphic-p) 117 | (fringe-mode 16)) 118 | 119 | 120 | ;; ediff 121 | (setq ediff-split-window-function 'split-window-horizontally) ;; side-by-side diffs 122 | (setq ediff-window-setup-function 'ediff-setup-windows-plain) ;; no extra frames 123 | 124 | 125 | ;; re-builder 126 | (setq reb-re-syntax 'string) ;; fix backslash madness 127 | 128 | 129 | ;; clean up old buffers periodically 130 | (midnight-mode) 131 | (midnight-delay-set 'midnight-delay 0) 132 | 133 | 134 | ;; proced 135 | (setq-default proced-auto-update-flag t) 136 | (setq proced-auto-update-interval 1) 137 | (setq proced-enable-color-flag t) 138 | 139 | 140 | ;; ibuffer 141 | (setq ibuffer-expert t) 142 | (setq ibuffer-show-empty-filter-groups nil) 143 | (setq ibuffer-use-other-window t) 144 | (add-hook 'ibuffer-mode-hook #'ibuffer-auto-mode) 145 | 146 | 147 | ;; move auto-save to the cache 148 | (let ((dir (expand-file-name (concat dotemacs-cache-directory "auto-save/")))) 149 | (setq auto-save-list-file-prefix (concat dir "saves-")) 150 | (setq auto-save-file-name-transforms `((".*" ,(concat dir "save-") t)))) 151 | 152 | 153 | ;; multiple-backups 154 | (setq backup-directory-alist `((".*" . ,(expand-file-name (concat dotemacs-cache-directory "backups/"))))) 155 | (setq backup-by-copying t) 156 | (setq version-control t) 157 | (setq kept-old-versions 0) 158 | (setq kept-new-versions 20) 159 | (setq delete-old-versions t) 160 | 161 | 162 | ;; better scrolling 163 | (setq scroll-conservatively 9999 164 | scroll-preserve-screen-position t 165 | scroll-margin 3) 166 | 167 | 168 | ;; better buffer names for duplicates 169 | (require 'uniquify) 170 | (setq uniquify-buffer-name-style 'forward 171 | uniquify-separator "/" 172 | uniquify-ignore-buffers-re "^\\*" ; leave special buffers alone 173 | uniquify-after-kill-buffer-p t) 174 | 175 | 176 | (defun /core/do-not-kill-scratch-buffer () 177 | (if (member (buffer-name (current-buffer)) 178 | '("*scratch*" "*Messages*" "*Require Times*")) 179 | (progn 180 | (bury-buffer) 181 | nil) 182 | t)) 183 | (add-hook 'kill-buffer-query-functions '/core/do-not-kill-scratch-buffer) 184 | 185 | 186 | (defalias 'yes-or-no-p 'y-or-n-p) 187 | 188 | 189 | ;; https://stackoverflow.com/questions/2901541/which-coding-system-should-i-use-in-emacs 190 | (setq utf-translate-cjk-mode nil) 191 | (set-language-environment 'utf-8) 192 | (set-keyboard-coding-system 'utf-8-mac) 193 | (setq locale-coding-system 'utf-8) 194 | (set-default-coding-systems 'utf-8) 195 | (set-terminal-coding-system 'utf-8) 196 | (set-selection-coding-system (if (eq system-type 'windows-nt) 'utf-16-le 'utf-8)) 197 | (prefer-coding-system 'utf-8) 198 | 199 | 200 | (setq sentence-end-double-space nil) 201 | (setq ring-bell-function 'ignore) 202 | (setq mark-ring-max 64) 203 | (setq global-mark-ring-max 128) 204 | (setq save-interprogram-paste-before-kill t) 205 | (setq create-lockfiles nil) 206 | (setq echo-keystrokes 0.01) 207 | (setq initial-major-mode 'emacs-lisp-mode) 208 | (setq eval-expression-print-level nil) 209 | (setq-default indent-tabs-mode nil) 210 | 211 | (setq inhibit-splash-screen t) 212 | (setq inhibit-startup-echo-area-message t) 213 | (setq inhibit-startup-message t) 214 | 215 | 216 | (global-visual-line-mode) 217 | (xterm-mouse-mode t) 218 | (which-function-mode t) 219 | (blink-cursor-mode -1) 220 | (global-auto-revert-mode t) 221 | (electric-indent-mode t) 222 | (transient-mark-mode t) 223 | (delete-selection-mode t) 224 | (random t) ;; seed 225 | 226 | 227 | (defun /core/find-file-hook () 228 | (when (or (string-match "\\.min\\." (buffer-file-name)) 229 | (> (buffer-size) dotemacs-core/maximum-file-size)) 230 | (fundamental-mode))) 231 | (add-hook 'find-file-hook #'/core/find-file-hook) 232 | 233 | 234 | (provide 'config-core) 235 | -------------------------------------------------------------------------------- /config/config-corfu.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (when (eq dotemacs-completion-engine 'corfu) 4 | 5 | (require-package 'corfu) 6 | (setq corfu-auto-prefix 2) 7 | (setq corfu-auto t) 8 | (setq corfu-cycle t) 9 | (global-corfu-mode t) 10 | 11 | (setq corfu-popupinfo-delay '(1.0 . 0.2)) 12 | (corfu-popupinfo-mode t) 13 | 14 | (defun /corfu/move-to-minibuffer () 15 | (interactive) 16 | (let ((completion-extra-properties corfu--extra) 17 | completion-cycle-threshold completion-cycling) 18 | (apply #'consult-completion-in-region completion-in-region--data))) 19 | 20 | (after [prescient] 21 | (require-package 'corfu-prescient) 22 | (setq corfu-prescient-override-sorting t) 23 | (corfu-prescient-mode t)) 24 | 25 | (after [lsp-completion] 26 | (setq lsp-completion-provider :none) 27 | (defun /corfu/lsp-setup-completion () 28 | (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) 29 | '(flex))) 30 | (add-hook 'lsp-completion-mode #'/corfu/lsp-setup-completion)) 31 | 32 | (add-hook 33 | 'eshell-mode-hook 34 | (defun /corfu/eshell-mode-hook () 35 | (setq-local corfu-auto nil))) 36 | 37 | (advice-add 38 | #'corfu-insert 39 | :after 40 | (defun /corfu/corfu-insert-for-shell (&rest _) 41 | "Send completion candidate when insude comint/eshell." 42 | (cond 43 | ((derived-mode-p 'eshell-mode) (eshell-send-input)) 44 | ((derived-mode-p 'comint-mode) (comint-send-input))))) 45 | 46 | (require-package 'cape) 47 | (add-to-list 'completion-at-point-functions #'cape-dabbrev) 48 | (add-to-list 'completion-at-point-functions #'cape-file) 49 | (add-to-list 'completion-at-point-functions #'cape-keyword) 50 | 51 | ;; workarounds for upstream bugs 52 | (advice-add #'pcomplete-completions-at-point :around #'cape-wrap-silent) 53 | (advice-add #'pcomplete-completions-at-point :around #'cape-wrap-purify)) 54 | -------------------------------------------------------------------------------- /config/config-csharp.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (add-hook 'csharp-mode-hook 4 | (lambda () 5 | (require-package 'omnisharp) 6 | (omnisharp-mode t))) 7 | 8 | (setq omnisharp-company-match-sort-by-flx-score t) 9 | (setq omnisharp-company-match-type 'company-match-flex) 10 | 11 | (after [omnisharp company] 12 | (add-to-list 'company-backends #'company-omnisharp)) 13 | 14 | (provide 'config-csharp) 15 | -------------------------------------------------------------------------------- /config/config-eglot.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-eglot nil 4 | "Configuration options for Eglot." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-eglot) 7 | 8 | (defun /eglot/activate () 9 | (interactive) 10 | (require-package 'eglot) 11 | (eglot-ensure)) 12 | 13 | (after 'eglot 14 | (setq eglot-autoshutdown t)) 15 | 16 | (provide 'config-eglot) 17 | -------------------------------------------------------------------------------- /config/config-erc.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'erc 4 | (setq erc-log-channels-directory (concat dotemacs-cache-directory "erc/logs")) 5 | (setq erc-hide-list '("JOIN" "PART" "QUIT")) 6 | 7 | (setq erc-timestamp-only-if-changed-flag nil) 8 | (setq erc-timestamp-format "[%H:%M] ") 9 | (setq erc-insert-timestamp-function 'erc-insert-timestamp-left) 10 | 11 | (setq erc-truncate-mode t) 12 | 13 | (add-hook 'window-configuration-change-hook 14 | (lambda () 15 | (setq erc-fill-column (- (window-width) 2))))) 16 | 17 | (provide 'config-erc) 18 | -------------------------------------------------------------------------------- /config/config-eshell.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-eshell nil 4 | "Configuration options for eshell-mode." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-eshell) 7 | 8 | (defcustom dotemacs-eshell/plan9 9 | nil 10 | "Turns on Plan9 style prompt in eshell when non-nil." 11 | :group 'dotemacs-eshell 12 | :type 'boolean) 13 | 14 | (defcustom dotemacs-eshell/prompt-git-info 15 | (executable-find "git") 16 | "Turns on additional git information in the prompt." 17 | :group 'dotemacs-eshell 18 | :type 'boolean) 19 | 20 | (defcustom dotemacs-eshell/visual-commands 21 | '("ssh" "htop" "top" "tail" "tmux" "vtop") 22 | "A list of commands that present their output in a visual fashion." 23 | :group 'dotemacs-eshell 24 | :type '(repeat string)) 25 | 26 | 27 | 28 | (setq eshell-directory-name (concat dotemacs-cache-directory "eshell")) 29 | (setq eshell-buffer-maximum-lines 20000) 30 | (setq eshell-scroll-to-bottom-on-input 'this) 31 | (setq eshell-aliases-file (concat user-emacs-directory ".eshell-aliases")) 32 | (setq eshell-glob-case-insensitive t) 33 | (setq eshell-error-if-no-glob t) 34 | (setq eshell-history-size (* 10 1024)) 35 | (setq eshell-hist-ignoredups t) 36 | (setq eshell-cmpl-ignore-case t) 37 | (setq eshell-prompt-function 38 | (lambda () 39 | (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face 'eshell-prompt) 40 | (when (and dotemacs-eshell/prompt-git-info 41 | (fboundp #'vc-git-branches)) 42 | (let ((branch (car (vc-git-branches)))) 43 | (when branch 44 | (concat 45 | (propertize " [" 'face 'font-lock-keyword-face) 46 | (propertize branch 'face 'font-lock-function-name-face) 47 | (let* ((status (shell-command-to-string "git status --porcelain")) 48 | (parts (split-string status "\n" t " ")) 49 | (states (mapcar #'string-to-char parts)) 50 | (added (count-if (lambda (char) (= char ?A)) states)) 51 | (modified (count-if (lambda (char) (= char ?M)) states)) 52 | (deleted (count-if (lambda (char) (= char ?D)) states))) 53 | (when (> (+ added modified deleted) 0) 54 | (propertize (format " +%d ~%d -%d" added modified deleted) 'face 'font-lock-comment-face))) 55 | (propertize "]" 'face 'font-lock-keyword-face))))) 56 | (propertize " $ " 'face 'font-lock-constant-face)))) 57 | 58 | 59 | (when (executable-find "fortune") 60 | (defadvice eshell (before dotemacs activate) 61 | (setq eshell-banner-message (concat (shell-command-to-string "fortune") "\n")))) 62 | 63 | 64 | ;; plan 9 smart shell 65 | (when dotemacs-eshell/plan9 66 | (after 'esh-module 67 | (add-to-list 'eshell-modules-list 'eshell-smart) 68 | (setq eshell-where-to-jump 'begin) 69 | (setq eshell-review-quick-commands nil) 70 | (setq eshell-smart-space-goes-to-end t))) 71 | 72 | 73 | (defun eshell/ff (&rest args) 74 | "Opens a file in emacs." 75 | (when (not (null args)) 76 | (mapc #'find-file (mapcar #'expand-file-name (eshell-flatten-list (reverse args)))))) 77 | 78 | 79 | (defun eshell/h () 80 | "Quickly run a previous command." 81 | (insert (completing-read 82 | "Run previous command: " 83 | (delete-dups (ring-elements eshell-history-ring)) 84 | nil 85 | t))) 86 | 87 | 88 | (defun eshell/ssh-tramp (&rest args) 89 | (insert (apply #'format "cd /ssh:%s:\\~" args)) 90 | (eshell-send-input)) 91 | 92 | 93 | (defun /eshell/color-filter (string) 94 | (let ((case-fold-search nil) 95 | (lines (split-string string "\n"))) 96 | (cl-loop for line in lines 97 | do (progn 98 | (cond ((string-match "\\[DEBUG\\]" line) 99 | (put-text-property 0 (length line) 'font-lock-face font-lock-comment-face line)) 100 | ((string-match "\\[INFO\\]" line) 101 | (put-text-property 0 (length line) 'font-lock-face compilation-info-face line)) 102 | ((string-match "\\[WARN\\]" line) 103 | (put-text-property 0 (length line) 'font-lock-face compilation-warning-face line)) 104 | ((string-match "\\[ERROR\\]" line) 105 | (put-text-property 0 (length line) 'font-lock-face compilation-error-face line))))) 106 | (mapconcat 'identity lines "\n"))) 107 | 108 | 109 | (after 'em-term 110 | (dolist (cmd dotemacs-eshell/visual-commands) 111 | (add-to-list 'eshell-visual-commands cmd))) 112 | 113 | 114 | (let ((count 0)) 115 | (defun /eshell/new-split () 116 | (interactive) 117 | (split-window) 118 | (eshell (cl-incf count)))) 119 | 120 | 121 | (after "magit-autoloads" 122 | (defalias 'eshell/s #'magit-status)) 123 | 124 | 125 | (require-package 'eshell-z) 126 | (setq eshell-z-freq-dir-hash-table-file-name (concat dotemacs-cache-directory "eshell/z")) 127 | (defalias 'eshell/j #'eshell/z) 128 | 129 | (defun eshell/z-clean () 130 | (let* ((directories (hash-table-keys eshell-z-freq-dir-hash-table)) 131 | (non-existent (cl-remove-if #'file-exists-p directories))) 132 | (cl-loop for dir in non-existent 133 | do (remhash (eshell-z--expand-directory-name dir) 134 | eshell-z-freq-dir-hash-table)) 135 | (eshell-z--write-freq-dir-hash-table))) 136 | 137 | 138 | (defun /eshell/eshell-mode-hook () 139 | (require 'eshell-z) 140 | 141 | (add-to-list 'eshell-output-filter-functions #'eshell-truncate-buffer) 142 | (add-to-list 'eshell-preoutput-filter-functions #'/eshell/color-filter) 143 | (buffer-disable-undo) 144 | 145 | ;; get rid of annoying 'terminal is not fully functional' warning 146 | (when (executable-find "cat") 147 | (setenv "PAGER" "cat")) 148 | 149 | (setenv "NODE_NO_READLINE" "1")) 150 | 151 | (add-hook 'eshell-mode-hook #'/eshell/eshell-mode-hook) 152 | 153 | 154 | (provide 'config-eshell) 155 | -------------------------------------------------------------------------------- /config/config-evil.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-evil nil 4 | "Configuration options for evil-mode." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-evil) 7 | 8 | (defcustom dotemacs-evil/emacs-state-hooks 9 | '(org-log-buffer-setup-hook org-capture-mode-hook) 10 | "List of hooks to automatically start up in Evil Emacs state." 11 | :type '(repeat (symbol)) 12 | :group 'dotemacs-evil) 13 | 14 | (defcustom dotemacs-evil/emacs-state-major-modes 15 | '(calculator-mode 16 | eshell-mode 17 | makey-key-mode 18 | shell-mode 19 | term-mode) 20 | "List of major modes that should default to Emacs state." 21 | :type '(repeat (symbol)) 22 | :group 'dotemacs-evil) 23 | 24 | (defcustom dotemacs-evil/emacs-state-minor-modes 25 | '(git-commit-mode 26 | magit-blame-mode) 27 | "List of minor modes that when active should switch to Emacs state." 28 | :type '(repeat (symbol)) 29 | :group 'dotemacs-evil) 30 | 31 | (defcustom dotemacs-evil/emacs-insert-mode 32 | nil 33 | "If non-nil, insert mode will act as Emacs state." 34 | :type 'boolean 35 | :group 'dotemacs-evil) 36 | 37 | (defcustom dotemacs-evil/comments 38 | 'evil-nerd-commenter 39 | "The library to use for comments." 40 | :type '(radio 41 | (const :tag "evil-nerd-commenter" evil-nerd-commenter) 42 | (const :tag "evil-commentary" evil-commentary)) 43 | :group 'dotemacs-evil) 44 | 45 | 46 | 47 | (setq evil-search-module 'evil-search) 48 | (setq evil-magic 'very-magic) 49 | 50 | (setq evil-emacs-state-cursor '("red" box)) 51 | (setq evil-motion-state-cursor '("orange" box)) 52 | (setq evil-normal-state-cursor '("green" box)) 53 | (setq evil-visual-state-cursor '("orange" box)) 54 | (setq evil-insert-state-cursor '("red" bar)) 55 | (setq evil-replace-state-cursor '("red" bar)) 56 | (setq evil-operator-state-cursor '("red" hollow)) 57 | 58 | (add-hook 'evil-jumps-post-jump-hook #'recenter) 59 | 60 | (setq evil-want-keybinding nil) ;; evil-collection will provide instead 61 | 62 | (require-package 'evil) 63 | (require 'evil) 64 | (evil-mode) 65 | 66 | (cl-loop for mode in dotemacs-evil/emacs-state-minor-modes 67 | do (let ((hook (concat (symbol-name mode) "-hook"))) 68 | (add-hook (intern hook) `(lambda () 69 | (if ,mode 70 | (evil-emacs-state) 71 | (evil-normal-state)))))) 72 | 73 | (cl-loop for hook in dotemacs-evil/emacs-state-hooks 74 | do (add-hook hook #'evil-emacs-state)) 75 | 76 | (cl-loop for mode in dotemacs-evil/emacs-state-major-modes 77 | do (evil-set-initial-state mode 'emacs)) 78 | 79 | (after 'evil-common 80 | (evil-put-property 'evil-state-properties 'normal :tag " NORMAL ") 81 | (evil-put-property 'evil-state-properties 'insert :tag " INSERT ") 82 | (evil-put-property 'evil-state-properties 'visual :tag " VISUAL ") 83 | (evil-put-property 'evil-state-properties 'motion :tag " MOTION ") 84 | (evil-put-property 'evil-state-properties 'emacs :tag " EMACS ") 85 | (evil-put-property 'evil-state-properties 'replace :tag " REPLACE ") 86 | (evil-put-property 'evil-state-properties 'operator :tag " OPERATOR ")) 87 | 88 | 89 | 90 | (when dotemacs-evil/emacs-insert-mode 91 | (defalias 'evil-insert-state 'evil-emacs-state) 92 | (define-key evil-emacs-state-map (kbd "") 'evil-normal-state)) 93 | 94 | 95 | (unless (display-graphic-p) 96 | (evil-esc-mode 1)) 97 | 98 | 99 | (cond 100 | ((eq dotemacs-evil/comments 'evil-commentary) 101 | (require-package 'evil-commentary) 102 | (evil-commentary-mode t)) 103 | ((eq dotemacs-evil/comments 'evil-nerd-commenter) 104 | (require-package 'evil-nerd-commenter) 105 | (require 'evil-nerd-commenter) 106 | (require 'evil-nerd-commenter-operator) 107 | (define-key evil-inner-text-objects-map evilnc-comment-text-object 'evilnc-inner-comment) 108 | (define-key evil-outer-text-objects-map evilnc-comment-text-object 'evilnc-outer-commenter) 109 | (define-key evil-normal-state-map "gc" 'evilnc-comment-operator) 110 | (define-key evil-normal-state-map "gy" 'evilnc-copy-and-comment-operator))) 111 | 112 | 113 | (require-package 'evil-surround) 114 | (global-evil-surround-mode t) 115 | 116 | 117 | (require-package 'evil-exchange) 118 | (evil-exchange-install) 119 | 120 | 121 | (require-package 'evil-anzu) 122 | (require 'evil-anzu) 123 | 124 | 125 | (require-package 'evil-avy) 126 | (evil-avy-mode) 127 | (add-hook 'magit-status-mode-hook (lambda () (evil-avy-mode -1))) 128 | 129 | 130 | (require-package 'evil-matchit) 131 | (defun evilmi-customize-keybinding () 132 | (evil-define-key 'normal evil-matchit-mode-map 133 | "%" 'evilmi-jump-items)) 134 | (global-evil-matchit-mode t) 135 | 136 | 137 | (require-package 'evil-indent-textobject) 138 | (require 'evil-indent-textobject) 139 | 140 | 141 | (require-package 'evil-visualstar) 142 | (global-evil-visualstar-mode t) 143 | 144 | 145 | (require-package 'evil-numbers) 146 | 147 | 148 | (unless (display-graphic-p) 149 | (require-package 'evil-terminal-cursor-changer) 150 | (evil-terminal-cursor-changer-activate)) 151 | 152 | 153 | 154 | (defadvice evil-ex-search-next (after dotemacs activate) 155 | (recenter)) 156 | 157 | (defadvice evil-ex-search-previous (after dotemacs activate) 158 | (recenter)) 159 | 160 | (provide 'config-evil) 161 | -------------------------------------------------------------------------------- /config/config-explorer.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-explorer nil 4 | "Configuration options for file explorers." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-explorer) 7 | 8 | (defcustom dotemacs-explorer/option 9 | 'treemacs 10 | "List of options for the file explorer." 11 | :type '(radio 12 | (const :tag "treemacs" treemacs) 13 | (const :tag "dired-sidebar" dired-sidebar)) 14 | :group 'dotemacs-explorer) 15 | 16 | (defcustom dotemacs-explorer/all-the-icons 17 | nil 18 | "Integrates with all-the-icons if available." 19 | :type 'boolean 20 | :group 'dotemacs-explorer) 21 | 22 | 23 | 24 | (cond 25 | ((eq dotemacs-explorer/option 'treemacs) 26 | (/boot/delayed-init ;; delay load to allow treemacs to calculate icon colors based on the current theme 27 | (require-package 'treemacs) 28 | (require-package 'treemacs-projectile) 29 | 30 | (setq treemacs-indentation 1) 31 | (setq treemacs-indentation-string (propertize "|" 'face 'font-lock-comment-face)) 32 | (setq treemacs-follow-after-init t) 33 | (setq treemacs-filewatch-mode t) 34 | (setq treemacs-tag-follow-mode t) 35 | (setq treemacs-file-event-delay 1000) 36 | 37 | (when (and dotemacs-explorer/all-the-icons (font-info "all-the-icons")) 38 | (after 'treemacs 39 | (require-package 'treemacs-all-the-icons) 40 | (require 'treemacs-all-the-icons))) 41 | 42 | (after 'treemacs 43 | (when (executable-find "git") 44 | (require-package 'treemacs-magit) 45 | (require 'treemacs-magit) 46 | 47 | (if (executable-find "python3") 48 | (treemacs-git-mode 'extended) 49 | (treemacs-git-mode 'simple)))) 50 | 51 | (after [evil treemacs] 52 | (require-package 'treemacs-evil) 53 | (require 'treemacs-evil))) 54 | ) 55 | 56 | ((eq dotemacs-explorer/option 'dired-sidebar) 57 | (require-package 'dired-sidebar) 58 | (setq dired-sidebar-should-follow-file t) 59 | (setq dired-sidebar-follow-file-idle-delay 0.2)) 60 | ) 61 | 62 | (defun /explorer/toggle () 63 | (interactive) 64 | (cond 65 | ((eq dotemacs-explorer/option 'treemacs) 66 | (treemacs)) 67 | ((eq dotemacs-explorer/option 'dired-sidebar) 68 | (dired-sidebar-toggle-sidebar)))) 69 | 70 | (defun /explorer/find-file () 71 | (interactive) 72 | (cond 73 | ((eq dotemacs-explorer/option 'treemacs) 74 | (require 'treemacs) 75 | (treemacs-find-file)) 76 | ((eq dotemacs-explorer/option 'dired-sidebar) 77 | (dired-sidebar-find-file)))) 78 | 79 | (provide 'config-explorer) 80 | -------------------------------------------------------------------------------- /config/config-eyecandy.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-eyecandy nil 4 | "Configuration options for eye candy." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-eyecandy) 7 | 8 | (defcustom dotemacs-eyecandy/mode-line 9 | 'doom 10 | "List of hooks to automatically start up in Evil Emacs state." 11 | :type '(radio 12 | (const :tag "smart mode line" sml) 13 | (const :tag "doom" doom) 14 | (const :tag "spaceline" spaceline)) 15 | :group 'dotemacs-eyecandy) 16 | 17 | (defcustom dotemacs-eyecandy/folding 18 | 'origami 19 | "The library to use for folding." 20 | :type '(radio 21 | (const :tag "origami" origami) 22 | (const :tag "hide-show" hide-show)) 23 | :group 'dotemacs-eyecandy) 24 | 25 | 26 | 27 | (when (eq dotemacs-pair-engine 'emacs) 28 | (show-paren-mode) 29 | (setq show-paren-delay 0)) 30 | 31 | 32 | (line-number-mode t) 33 | (column-number-mode t) 34 | (display-time-mode t) 35 | (size-indication-mode t) 36 | 37 | 38 | (cond 39 | ((eq dotemacs-eyecandy/folding 'origami) 40 | (progn 41 | (require-package 'origami) 42 | (global-origami-mode))) 43 | ((eq dotemacs-eyecandy/folding 'hide-show) 44 | (progn 45 | (defun /eyecandy/fold-overlay (ov) 46 | (when (eq 'code (overlay-get ov 'hs)) 47 | (let ((col (save-excursion 48 | (move-end-of-line 0) 49 | (current-column))) 50 | (count (count-lines (overlay-start ov) (overlay-end ov)))) 51 | (overlay-put ov 'after-string 52 | (format "%s [ %d ] ... " 53 | (make-string (- (window-width) col 32) (string-to-char ".")) 54 | count))))) 55 | (setq hs-set-up-overlay '/eyecandy/fold-overlay) 56 | (add-hook 'prog-mode-hook #'hs-minor-mode)))) 57 | 58 | 59 | (require-package 'diminish) 60 | (diminish 'visual-line-mode) 61 | (after 'aggressive-indent (diminish 'aggressive-indent-mode)) 62 | (after 'auto-complete (diminish 'auto-complete-mode)) 63 | (after 'autorevert (diminish #'auto-revert-mode)) 64 | (after 'color-identifiers-mode (diminish 'color-identifiers-mode)) 65 | (after 'company (diminish 'company-mode)) 66 | (after 'counsel (diminish #'counsel-mode)) 67 | (after 'eldoc (diminish 'eldoc-mode)) 68 | (after 'elisp-slime-nav (diminish 'elisp-slime-nav-mode)) 69 | (after 'evil-commentary (diminish 'evil-commentary-mode)) 70 | (after 'flycheck (diminish 'flycheck-mode)) 71 | (after 'git-gutter+ (diminish 'git-gutter+-mode)) 72 | (after 'helm-mode (diminish 'helm-mode)) 73 | (after 'hideshow (diminish 'hs-minor-mode)) 74 | (after 'highlight-symbol (diminish 'highlight-symbol-mode)) 75 | (after 'indent-guide (diminish 'indent-guide-mode)) 76 | (after 'ivy (diminish 'ivy-mode)) 77 | (after 'page-break-lines (diminish 'page-break-lines-mode)) 78 | (after 'projectile (diminish 'projectile-mode)) 79 | (after 'smartparens (diminish 'smartparens-mode)) 80 | (after 'undo-tree (diminish 'undo-tree-mode)) 81 | (after 'which-key (diminish 'which-key-mode)) 82 | (after 'yasnippet (diminish 'yas-minor-mode)) 83 | 84 | 85 | (cond 86 | ((eq dotemacs-eyecandy/mode-line 'sml) 87 | (require-package 'smart-mode-line) 88 | (sml/setup) 89 | (after 'evil 90 | (defvar dotemacs--original-mode-line-bg (face-background 'mode-line)) 91 | (defadvice evil-set-cursor-color (after dotemacs activate) 92 | (cond ((evil-emacs-state-p) 93 | (set-face-background 'mode-line "#440000")) 94 | ((evil-insert-state-p) 95 | (set-face-background 'mode-line "#002244")) 96 | ((evil-visual-state-p) 97 | (set-face-background 'mode-line "#440044")) 98 | (t 99 | (set-face-background 'mode-line dotemacs--original-mode-line-bg)))))) 100 | ((eq dotemacs-eyecandy/mode-line 'spaceline) 101 | (require-package 'spaceline) 102 | (require 'spaceline-config) 103 | (setq spaceline-highlight-face-func #'spaceline-highlight-face-evil-state) 104 | (set-face-attribute 'spaceline-evil-emacs nil :background "red" :foreground "white") 105 | (spaceline-spacemacs-theme) 106 | (spaceline-info-mode) 107 | (after "helm-autoloads" 108 | (spaceline-helm-mode))) 109 | ((eq dotemacs-eyecandy/mode-line 'doom) 110 | (require-package 'doom-modeline) 111 | (require 'doom-modeline) 112 | (doom-modeline-mode t))) 113 | 114 | 115 | (when (fboundp 'global-prettify-symbols-mode) 116 | (defun /eyecandy/js-symbols () 117 | (setq-local 118 | prettify-symbols-alist 119 | '( 120 | ("function" . ?λ) 121 | ("return" . ?←) 122 | ("=>". ?⇒) 123 | (">=". ?≥) 124 | ("<=". ?≤) 125 | ))) 126 | (add-hook 'js-mode-hook #'/eyecandy/js-symbols) 127 | (add-hook 'js2-mode-hook #'/eyecandy/js-symbols) 128 | (add-hook 'typescript-mode-hook #'/eyecandy/js-symbols)) 129 | 130 | 131 | (/boot/delayed-init 132 | (require-package 'color-identifiers-mode) 133 | (global-color-identifiers-mode) 134 | (diminish 'color-identifiers-mode)) 135 | 136 | 137 | ;; (require-package 'fancy-narrow) 138 | ;; (fancy-narrow-mode) 139 | 140 | 141 | (require-package 'highlight-symbol) 142 | (setq highlight-symbol-idle-delay 0.3) 143 | (add-hook 'prog-mode-hook 'highlight-symbol-mode) 144 | 145 | 146 | (require-package 'highlight-numbers) 147 | (add-hook 'prog-mode-hook 'highlight-numbers-mode) 148 | 149 | 150 | (require-package 'highlight-quoted) 151 | (add-hook 'prog-mode-hook 'highlight-quoted-mode) 152 | 153 | 154 | (require-package 'page-break-lines) 155 | (global-page-break-lines-mode) 156 | 157 | 158 | (require-package 'eval-sexp-fu) 159 | (require 'eval-sexp-fu) 160 | (eval-sexp-fu-flash-mode) 161 | 162 | 163 | (when (and (display-graphic-p) 164 | (font-info "all-the-icons")) 165 | (setq all-the-icons-scale-factor 0.7) 166 | (setq inhibit-compacting-font-caches t) 167 | 168 | (after 'ibuffer 169 | (require-package 'all-the-icons-ibuffer) 170 | (add-hook 'ibuffer-mode-hook #'all-the-icons-ibuffer-mode)) 171 | 172 | (after 'dired 173 | (require-package 'all-the-icons-dired) 174 | (add-hook 'dired-mode-hook #'all-the-icons-dired-mode)) 175 | 176 | (after 'ivy 177 | (require-package 'all-the-icons-ivy) 178 | (all-the-icons-ivy-setup))) 179 | 180 | 181 | (add-hook 'find-file-hook #'hl-line-mode) 182 | 183 | (if (fboundp #'display-line-numbers-mode) 184 | (add-hook 'find-file-hook #'display-line-numbers-mode) 185 | (add-hook 'find-file-hook 'linum-mode)) 186 | 187 | 188 | (provide 'config-eyecandy) 189 | -------------------------------------------------------------------------------- /config/config-flycheck.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (require-package 'flycheck) 4 | 5 | (setq flycheck-standard-error-navigation t) 6 | (setq flycheck-temp-prefix (concat dotemacs-cache-directory "flycheck/")) 7 | (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc html-tidy)) 8 | 9 | (after 'web-mode 10 | (flycheck-add-mode 'javascript-eslint 'web-mode)) 11 | 12 | (add-hook 'after-init-hook #'global-flycheck-mode) 13 | 14 | (when (display-graphic-p) 15 | (require-package 'flycheck-pos-tip) 16 | (setq flycheck-pos-tip-timeout -1) 17 | (flycheck-pos-tip-mode)) 18 | 19 | (defun /flycheck/advice/next-error-find-buffer (orig-func &rest args) 20 | (let* ((special-buffers 21 | (cl-loop for buffer in (mapcar #'window-buffer (window-list)) 22 | when (with-current-buffer buffer 23 | (and 24 | (eq (get major-mode 'mode-class) 'special) 25 | (boundp 'next-error-function))) 26 | collect buffer)) 27 | (first-special-buffer (car special-buffers))) 28 | (if first-special-buffer 29 | first-special-buffer 30 | (apply orig-func args)))) 31 | 32 | (advice-add #'next-error-find-buffer :around #'/flycheck/advice/next-error-find-buffer) 33 | 34 | (provide 'config-flycheck) 35 | -------------------------------------------------------------------------------- /config/config-go.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (/boot/lazy-major-mode "\\.go$" go-mode) 4 | 5 | (after 'go-mode 6 | (require-package 'go-eldoc) 7 | (add-hook 'go-mode-hook 'go-eldoc-setup) 8 | 9 | (after "company-autoloads" 10 | (require-package 'company-go) 11 | (require 'company-go) 12 | (add-hook 'go-mode-hook (lambda () 13 | (set (make-local-variable 'company-backends) '(company-go)))))) 14 | 15 | (provide 'config-go) 16 | -------------------------------------------------------------------------------- /config/config-helm.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'helm-source 4 | (defun /helm/make-source (f &rest args) 5 | (let ((source-type (cadr args)) 6 | (props (cddr args))) 7 | (unless (child-of-class-p source-type 'helm-source-async) 8 | (plist-put props :fuzzy-match t)) 9 | (apply f args))) 10 | (advice-add 'helm-make-source :around '/helm/make-source)) 11 | 12 | 13 | (after 'helm 14 | (setq helm-bookmark-show-location t) 15 | (setq helm-buffer-max-length 40) 16 | 17 | 18 | (if (>= emacs-major-version 27) 19 | (add-to-list 'completion-styles 'flex) 20 | (add-to-list 'completion-styles 'helm-flex)) 21 | 22 | 23 | (require-package 'helm-descbinds) 24 | 25 | 26 | ;; (require-package 'helm-flx) 27 | ;; (helm-flx-mode t) 28 | 29 | 30 | (require-package 'helm-dash) 31 | (setq helm-dash-browser-func 'eww) 32 | 33 | 34 | (require-package 'helm-ag) 35 | (setq helm-ag-fuzzy-match t) 36 | (setq helm-ag-use-agignore t) 37 | (setq helm-ag-ignore-patterns dotemacs-globally-ignored-directories) 38 | (after 'helm-ag 39 | (cond ((executable-find "ag") 40 | t) 41 | ((executable-find "pt") 42 | (setq helm-ag-base-command "pt -e --nogroup --nocolor")) 43 | ((executable-find "ack") 44 | (setq helm-ag-base-command "ack --nogroup --nocolor")))) 45 | 46 | 47 | (setq helm-adaptive-history-file (concat dotemacs-cache-directory "helm-adaptive-history")) 48 | (helm-adaptive-mode t) 49 | 50 | 51 | (setq helm-swoop-pre-input-function #'ignore) 52 | (setq helm-swoop-use-line-number-face t) 53 | (setq helm-swoop-split-with-multiple-windows t) 54 | (setq helm-swoop-speed-or-color t) 55 | (setq helm-swoop-use-fuzzy-match t) 56 | (require-package 'helm-swoop) 57 | 58 | 59 | (require-package 'helm-projectile) 60 | 61 | 62 | (defun /helm/everything () 63 | (interactive) 64 | (require 'helm-projectile) 65 | (if (projectile-project-p) 66 | (let ((helm-mini-default-sources 67 | (append 68 | '(helm-source-projectile-recentf-list 69 | helm-source-projectile-files-list) 70 | helm-mini-default-sources))) 71 | (helm-mini)) 72 | (helm-mini))) 73 | 74 | 75 | ;; take between 10-30% of screen space 76 | (setq helm-autoresize-min-height 10) 77 | (setq helm-autoresize-max-height 30) 78 | (helm-autoresize-mode t)) 79 | 80 | (defun /helm/activate-as-switch-engine (on) 81 | (require-package 'helm) 82 | 83 | (if on 84 | (progn 85 | (setq projectile-completion-system 'helm) 86 | (global-set-key [remap execute-extended-command] #'helm-M-x) 87 | (global-set-key [remap find-file] #'helm-find-files) 88 | (helm-mode t)) 89 | (global-set-key [remap execute-extended-command] nil) 90 | (global-set-key [remap find-file] nil) 91 | (helm-mode -1))) 92 | 93 | (when (eq dotemacs-switch-engine 'helm) 94 | (/boot/delayed-init 95 | (/helm/activate-as-switch-engine t))) 96 | 97 | (provide 'config-helm) 98 | -------------------------------------------------------------------------------- /config/config-ido.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (setq ido-enable-prefix nil) 4 | (setq ido-use-virtual-buffers t) 5 | (setq ido-enable-flex-matching t) 6 | (setq ido-create-new-buffer 'always) 7 | (setq ido-use-filename-at-point 'guess) 8 | (setq ido-save-directory-list-file (concat dotemacs-cache-directory "ido.last")) 9 | 10 | (after 'ido 11 | (require-package 'flx-ido) 12 | (flx-ido-mode t) 13 | 14 | (require-package 'ido-vertical-mode) 15 | (ido-vertical-mode)) 16 | 17 | (defun /ido/activate-as-switch-engine (on) 18 | (if on 19 | (progn 20 | (ido-mode t) 21 | (ido-everywhere t) 22 | ) 23 | (ido-mode -1) 24 | (ido-everywhere -1))) 25 | 26 | (when (eq dotemacs-switch-engine 'ido) 27 | (/ido/activate-as-switch-engine t)) 28 | 29 | (provide 'config-ido) 30 | -------------------------------------------------------------------------------- /config/config-ivy.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'ivy 4 | (setq ivy-use-virtual-buffers t) 5 | (setq ivy-virtual-abbreviate 'full) 6 | (setq ivy-re-builders-alist '((t . ivy--regex-fuzzy))) 7 | (setq ivy-height 16) 8 | (setq ivy-display-style 'fancy) 9 | (setq ivy-count-format "[%d/%d] ") 10 | (setq ivy-initial-inputs-alist nil) 11 | 12 | (require-package 'swiper) 13 | (after 'swiper 14 | (defadvice swiper (before dotemacs activate) 15 | (setq gc-cons-threshold most-positive-fixnum)) 16 | (defadvice swiper-all (before dotemacs activate) 17 | (setq gc-cons-threshold most-positive-fixnum))) 18 | 19 | (defvar /ivy/mini/buffers nil) 20 | (defvar /ivy/mini/project-files nil) 21 | (defvar /ivy/mini/recentf-files nil) 22 | 23 | (defun /ivy/everything () 24 | (interactive) 25 | (setq gc-cons-threshold most-positive-fixnum) 26 | (setq /ivy/mini/buffers (mapcar #'buffer-name (buffer-list))) 27 | (setq /ivy/mini/project-files (if (projectile-project-p) (projectile-current-project-files) nil)) 28 | (setq /ivy/mini/recentf-files recentf-list) 29 | (let ((ivy-dynamic-exhibit-delay-ms 100) 30 | (candidates (append /ivy/mini/buffers /ivy/mini/project-files /ivy/mini/recentf-files))) 31 | (ivy-read 32 | "Search: " 33 | (lambda (input) 34 | (ivy--filter input candidates)) 35 | :dynamic-collection t 36 | :caller '/ivy/mini 37 | :action (lambda (f) 38 | (with-ivy-window 39 | (cond ((member f /ivy/mini/buffers) 40 | (switch-to-buffer f)) 41 | ((file-exists-p f) 42 | (find-file f)) 43 | (t 44 | (find-file (concat (projectile-project-root) f))))))))) 45 | 46 | (ivy-set-display-transformer 47 | '/ivy/mini 48 | (lambda (candidate) 49 | (cond 50 | ((member candidate /ivy/mini/buffers) 51 | (concat " buffer " (propertize candidate 'face 'ivy-virtual))) 52 | ((member candidate /ivy/mini/project-files) 53 | (concat " project " (propertize candidate 'face 'ivy-remote))) 54 | ((member candidate /ivy/mini/recentf-files) 55 | (concat " recentf " (propertize candidate 'face 'ivy-subdir))))))) 56 | 57 | 58 | 59 | (defun /ivy/activate-as-switch-engine (on) 60 | (require-package 'ivy) 61 | (require-package 'counsel) 62 | (require-package 'counsel-projectile) 63 | 64 | (if on 65 | (progn 66 | (setq projectile-completion-system 'ivy) 67 | (counsel-mode t) 68 | (counsel-projectile-mode t) 69 | (ivy-mode t)) 70 | (counsel-mode -1) 71 | (counsel-projectile-mode -1) 72 | (ivy-mode -1))) 73 | 74 | (when (eq dotemacs-switch-engine 'ivy) 75 | (/ivy/activate-as-switch-engine t)) 76 | 77 | (provide 'config-ivy) 78 | -------------------------------------------------------------------------------- /config/config-js.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-js nil 4 | "Configuration options for Javascript." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-js) 7 | 8 | (defcustom dotemacs-js/indent-offset 2 9 | "The number of spaces to indent nested statements." 10 | :type 'integer 11 | :group 'dotemacs-js) 12 | 13 | (defcustom dotemacs-js/mode 14 | 'js 15 | "The major mode to drive JavaScript." 16 | :type '(radio 17 | (const :tag "js-mode" js-mode) 18 | (const :tag "js2-mode" js2-mode)) 19 | :group 'dotemacs-js) 20 | 21 | (defcustom dotemacs-js/engine 22 | nil 23 | "Whether to activate enhanced LSP functionalities." 24 | :type '(radio 25 | (const :tag "none" nil) 26 | (const :tag "lsp" lsp) 27 | (const :tag "eglot" eglot)) 28 | :group 'dotemacs-js) 29 | 30 | 31 | 32 | (setq js-indent-level dotemacs-js/indent-offset) 33 | 34 | (when (eq dotemacs-js/mode 'js2) 35 | (defun /js/activate-js2 () 36 | (require-package 'js2-mode) 37 | (js2-jsx-mode)) 38 | (add-to-list 'auto-mode-alist '("\\.jsx?$" . /js/activate-js2))) 39 | 40 | (cond 41 | ((eq dotemacs-js/engine 'lsp) 42 | (add-hook 'js-mode-hook #'/lsp/activate) 43 | (add-hook 'js-jsx-mode-hook #'/lsp/activate)) 44 | ((eq dotemacs-js/engine 'eglot) 45 | (add-hook 'js-mode-hook #'/eglot/activate) 46 | (add-hook 'js-jsx-mode-hook #'/eglot/activate))) 47 | 48 | (after 'js2-mode 49 | (setq js2-highlight-level 3) 50 | (setq-default js2-basic-offset dotemacs-js/indent-offset) 51 | 52 | (require-package 'js2-refactor) 53 | (require 'js2-refactor) 54 | (js2r-add-keybindings-with-prefix "C-c C-m") 55 | 56 | (add-hook 'js2-mode-hook #'js2-refactor-mode) 57 | (add-hook 'js2-jsx-mode-hook #'js2-refactor-mode) 58 | (add-hook 'js2-minor-mode-hook #'js2-refactor-mode)) 59 | 60 | (provide 'config-js) 61 | -------------------------------------------------------------------------------- /config/config-lisp.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-lisp nil 4 | "Configuration options for lisp." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-lisp) 7 | 8 | (defcustom dotemacs-lisp/compile-config 9 | nil 10 | "If non-nil, automatically byte-compile all configuration." 11 | :type 'boolean 12 | :group 'dotemacs-lisp) 13 | 14 | (require-package 'elisp-slime-nav) 15 | (after 'elisp-slime-nav 16 | (defadvice elisp-slime-nav-find-elisp-thing-at-point (after dotemacs activate) 17 | (recenter))) 18 | 19 | (defun /lisp/major-mode-hook () 20 | (progn 21 | (elisp-slime-nav-mode) 22 | (eldoc-mode))) 23 | 24 | (add-hook 'emacs-lisp-mode-hook #'/lisp/major-mode-hook) 25 | (add-hook 'lisp-interaction-mode-hook #'/lisp/major-mode-hook) 26 | (add-hook 'ielm-mode-hook #'/lisp/major-mode-hook) 27 | 28 | (defun /lisp/recompile-config () 29 | (interactive) 30 | (byte-compile-file (concat user-emacs-directory "init.el")) 31 | (byte-recompile-directory (concat user-emacs-directory "core/") 0 t) 32 | (byte-recompile-directory (concat user-emacs-directory "config/") 0 t)) 33 | 34 | (defun /lisp/recompile-elpa () 35 | (interactive) 36 | (byte-recompile-directory (concat user-emacs-directory "elpa/") 0 t)) 37 | 38 | (when dotemacs-lisp/compile-config 39 | (require-package 'auto-compile) 40 | (auto-compile-on-save-mode) 41 | (add-hook 'after-init-hook 42 | (defun /lisp/after-init-auto-compile-hook () 43 | (unless (file-exists-p (concat user-emacs-directory "init.elc")) 44 | (/lisp/recompile-config))))) 45 | 46 | 47 | (require-package 'helpful) 48 | 49 | 50 | (provide 'config-lisp) 51 | -------------------------------------------------------------------------------- /config/config-lsp.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-lsp nil 4 | "Configuration options for LSP." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-lsp) 7 | 8 | (defcustom dotemacs-lsp/inhibit-paths '("node_modules") 9 | "A list of paths that should not activate LSP." 10 | :type '(repeat string) 11 | :group 'dotemacs-lsp) 12 | 13 | 14 | 15 | (defun /lsp/activate () 16 | (interactive) 17 | (unless (seq-filter 18 | (lambda (path) 19 | (string-match-p path (buffer-file-name))) 20 | dotemacs-lsp/inhibit-paths) 21 | (/lsp/do-activate))) 22 | 23 | (defun /lsp/do-activate () 24 | (require-package 'lsp-mode) 25 | (require-package 'lsp-ui) 26 | (require-package 'lsp-treemacs) 27 | 28 | (setq lsp-session-file (concat dotemacs-cache-directory ".lsp-session-v1")) 29 | (setq lsp-keep-workspace-alive nil) 30 | (setq read-process-output-max (* 1024 1024)) 31 | 32 | (setq lsp-ui-sideline-show-hover t) 33 | (setq lsp-ui-sideline-delay 0.5) 34 | 35 | (setq lsp-ui-doc-include-signature t) 36 | (setq lsp-ui-doc-header t) 37 | (setq lsp-ui-doc-position 'top) 38 | (setq lsp-ui-doc-delay 1) 39 | (setq lsp-ui-doc-show-with-cursor t) 40 | 41 | (lsp) 42 | (lsp-treemacs-sync-mode t)) 43 | 44 | (defun /lsp/suggest-project-root () 45 | "Suggests the nearest project that is not a dependency." 46 | (or 47 | (locate-dominating-file 48 | (buffer-file-name) 49 | (lambda (dir) 50 | (if (string-match-p "node_modules" dir) 51 | nil 52 | (file-exists-p (concat dir "package.json"))))) 53 | (projectile-project-root))) 54 | 55 | (after 'lsp-mode 56 | (advice-add #'lsp--suggest-project-root :override #'/lsp/suggest-project-root)) 57 | 58 | (provide 'config-lsp) 59 | -------------------------------------------------------------------------------- /config/config-misc.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-misc nil 4 | "Configuration options for miscellaneous." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-misc) 7 | 8 | (defcustom dotemacs-misc/inhibit-undo-tree 9 | t 10 | "If non-nil, disables undo-tree and replaces it with desktop-mode." 11 | :type 'boolean 12 | :group 'dotemacs-evil) 13 | 14 | 15 | 16 | (require-package 'pcache) 17 | (setq pcache-directory (concat dotemacs-cache-directory "pcache/")) 18 | 19 | 20 | (require-package 'request) 21 | (setq request-storage-directory (concat dotemacs-cache-directory "request/")) 22 | 23 | 24 | (require-package 'undo-tree) 25 | (if dotemacs-misc/inhibit-undo-tree 26 | (after 'evil-integration 27 | (global-undo-tree-mode -1) 28 | 29 | (defun /misc/append-buffer-undo-list (alist) 30 | (append `(,(cons 'buffer-undo-list buffer-undo-list)) alist)) 31 | 32 | ;; due to a bug, buffer-undo-list is not included here, so we have to patch it in 33 | (advice-add #'buffer-local-variables :filter-return #'/misc/append-buffer-undo-list) 34 | 35 | (add-to-list 'desktop-locals-to-save 'buffer-undo-list)) 36 | (require-package 'undo-tree) 37 | (setq undo-tree-auto-save-history t) 38 | (setq undo-tree-enable-undo-in-region nil) 39 | (setq undo-tree-history-directory-alist 40 | `(("." . ,(concat dotemacs-cache-directory "undo/")))) 41 | (setq undo-tree-visualizer-timestamps t) 42 | (setq undo-tree-visualizer-diff t) 43 | (global-undo-tree-mode)) 44 | 45 | 46 | (require-package 'multiple-cursors) 47 | (setq mc/list-file (concat dotemacs-cache-directory "mc-lists.el")) 48 | (after 'evil 49 | (add-hook 'multiple-cursors-mode-enabled-hook #'evil-emacs-state) 50 | (add-hook 'multiple-cursors-mode-disabled-hook #'evil-normal-state)) 51 | 52 | 53 | (require-package 'dumb-jump) 54 | (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) 55 | (add-hook 'dumb-jump-after-jump-hook #'evil-set-jump) 56 | 57 | 58 | (require-package 'wgrep) 59 | 60 | 61 | (when (executable-find "pt") 62 | (require-package 'pt) 63 | (require-package 'wgrep-pt) 64 | (after 'evil 65 | (add-to-list 'evil-motion-state-modes 'pt-search-mode) 66 | (evil-add-hjkl-bindings pt-search-mode-hook 'motion))) 67 | 68 | 69 | (when (executable-find "ag") 70 | (require-package 'ag) 71 | (setq ag-highlight-search t) 72 | (setq-default ag-ignore-list dotemacs-globally-ignored-directories) 73 | (add-hook 'ag-mode-hook (lambda () (toggle-truncate-lines t))) 74 | (require-package 'wgrep-ag)) 75 | 76 | 77 | (require-package 'avy) 78 | 79 | 80 | (require-package 'expand-region) 81 | 82 | 83 | (when (executable-find "editorconfig") 84 | (require-package 'editorconfig) 85 | (editorconfig-mode)) 86 | 87 | 88 | (require-package 'aggressive-indent) 89 | (require 'aggressive-indent) 90 | (add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode) 91 | (add-hook 'lisp-mode-hook #'aggressive-indent-mode) 92 | 93 | 94 | (require 'etags-select) 95 | (setq etags-select-go-if-unambiguous t) 96 | 97 | 98 | (require-package 'windsize) 99 | (require 'windsize) 100 | (setq windsize-cols 16) 101 | (setq windsize-rows 8) 102 | (windsize-default-keybindings) 103 | 104 | 105 | (require-package 'rainbow-delimiters) 106 | (add-hook 'prog-mode-hook #'rainbow-delimiters-mode) 107 | 108 | 109 | (require 'framemove) 110 | (setq framemove-hook-into-windmove t) 111 | 112 | 113 | (require-package 'discover-my-major) 114 | 115 | 116 | (setq paradox-execute-asynchronously t) 117 | (require-package 'paradox) 118 | 119 | 120 | (require-package 'vlf) 121 | (setq vlf-application 'dont-ask) 122 | (require 'vlf-setup) 123 | 124 | 125 | (require-package 'shackle) 126 | (shackle-mode) 127 | (setq shackle-rules 128 | '((help-mode :align right :size 80) 129 | (compilation-mode :align bottom :size 0.2) 130 | (diff-mode :align right :size 0.5) 131 | (magit-diff-mode :align right :size 0.5) 132 | (magit-revision-mode :align right :size 0.5) 133 | (ibuffer-mode :align right :size 0.5) 134 | (ag-mode :align right :size 0.5) 135 | (compilation-mode :align bottom :size 0.3) 136 | ("^\\*helm.*\\*$" :regexp t :align bottom) 137 | )) 138 | 139 | 140 | (when (executable-find "prettier") 141 | (require-package 'reformatter) 142 | (reformatter-define prettier-css :program "prettier" :args '("--parser=css")) 143 | (reformatter-define prettier-html :program "prettier" :args '("--parser=html")) 144 | (reformatter-define prettier-javascript :program "prettier" :args '("--parser=babel")) 145 | (reformatter-define prettier-json :program "prettier" :args '("--parser=json")) 146 | (reformatter-define prettier-markdown :program "prettier" :args '("--parser=markdown")) 147 | (reformatter-define prettier-typescript :program "prettier" :args '("--parser=typescript")) 148 | (reformatter-define prettier-yaml :program "prettier" :args '("--parser=yaml"))) 149 | 150 | 151 | (require-package 'restart-emacs) 152 | 153 | 154 | (provide 'config-misc) 155 | -------------------------------------------------------------------------------- /config/config-org.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (after 'org 4 | (defgroup dotemacs-org nil 5 | "Configuration options for org-mode." 6 | :group 'dotemacs 7 | :prefix 'dotemacs-org) 8 | 9 | (defcustom dotemacs-org/journal-file (concat org-directory "/journal.org") 10 | "The path to the file where you want to make journal entries." 11 | :type 'file 12 | :group 'dotemacs-org) 13 | 14 | (defcustom dotemacs-org/inbox-file (concat org-directory "/inbox.org") 15 | "The path to the file where to capture notes." 16 | :type 'file 17 | :group 'dotemacs-org) 18 | 19 | (unless (file-exists-p org-directory) 20 | (make-directory org-directory)) 21 | 22 | (setq org-default-notes-file (expand-file-name dotemacs-org/inbox-file)) 23 | (setq org-log-done t) 24 | (setq org-log-into-drawer t) 25 | 26 | (setq org-startup-indented t) 27 | (setq org-indent-indentation-per-level 2) 28 | (setq org-src-fontify-natively t) 29 | 30 | (setq org-agenda-files `(,org-directory)) 31 | (setq org-capture-templates 32 | `(("t" "Todo" entry (file+headline ,(expand-file-name dotemacs-org/inbox-file) "INBOX") 33 | "* TODO %?\n%U\n%a\n") 34 | ("n" "Note" entry (file+headline ,(expand-file-name dotemacs-org/inbox-file) "NOTES") 35 | "* %? :NOTE:\n%U\n%a\n") 36 | ("m" "Meeting" entry (file ,(expand-file-name dotemacs-org/inbox-file)) 37 | "* MEETING %? :MEETING:\n%U") 38 | ("j" "Journal" entry (file+datetree ,(expand-file-name dotemacs-org/journal-file)) 39 | "* %U\n** %?"))) 40 | 41 | (setq org-use-fast-todo-selection t) 42 | (setq org-treat-S-cursor-todo-selection-as-state-change nil) 43 | (setq org-todo-keywords 44 | '((sequence "TODO(t)" "NEXT(n@)" "|" "DONE(d@)") 45 | (sequence "WAITING(w@/!)" "|" "CANCELLED(c@/!)"))) 46 | 47 | (setq org-todo-state-tags-triggers 48 | ' (("CANCELLED" ("CANCELLED" . t)) 49 | ("WAITING" ("WAITING" . t)) 50 | ("TODO" ("WAITING") ("CANCELLED")) 51 | ("NEXT" ("WAITING") ("CANCELLED")) 52 | ("DONE" ("WAITING") ("CANCELLED")))) 53 | 54 | (setq org-refile-targets '((nil :maxlevel . 9) 55 | (org-agenda-files :maxlevel . 9))) 56 | (setq org-refile-use-outline-path 'file) 57 | (setq org-outline-path-complete-in-steps nil) 58 | (setq org-completion-use-ido t) 59 | 60 | (when (boundp 'org-plantuml-jar-path) 61 | (org-babel-do-load-languages 62 | 'org-babel-load-languages 63 | '((plantuml . t)))) 64 | 65 | (add-hook 'org-babel-after-execute-hook #'org-redisplay-inline-images) 66 | 67 | (defun /org/org-mode-hook () 68 | (toggle-truncate-lines t) 69 | (setq show-trailing-whitespace t)) 70 | (add-hook 'org-mode-hook #'/org/org-mode-hook) 71 | 72 | (require-package 'ob-async) 73 | (require 'ob-async) 74 | 75 | (require-package 'org-bullets) 76 | (setq org-bullets-bullet-list '("●" "○" "◆" "◇" "▸")) 77 | (add-hook 'org-mode-hook #'org-bullets-mode)) 78 | 79 | (after 'ob-plantuml 80 | (when (executable-find "npm") 81 | (let ((default-directory (concat user-emacs-directory "/extra/plantuml-server/"))) 82 | (unless (file-exists-p "node_modules/") 83 | (shell-command "npm install")) 84 | 85 | (ignore-errors 86 | (let ((kill-buffer-query-functions nil)) 87 | (kill-buffer "*plantuml-server*"))) 88 | (start-process "*plantuml-server*" "*plantuml-server*" "npm" "start")) 89 | 90 | (defun init-org/generate-diagram (uml) 91 | (let ((url-request-method "POST") 92 | (url-request-extra-headers '(("Content-Type" . "text/plain"))) 93 | (url-request-data uml)) 94 | (let* ((buffer (url-retrieve-synchronously "http://localhost:8182/svg"))) 95 | (with-current-buffer buffer 96 | (goto-char (point-min)) 97 | (search-forward "\n\n") 98 | (buffer-substring (point) (point-max)))))) 99 | 100 | (defun org-babel-execute:plantuml (body params) 101 | (let* ((out-file (or (cdr (assoc :file params)) 102 | (error "PlantUML requires a \":file\" header argument")))) 103 | (let ((png (init-org/generate-diagram (concat "@startuml\n" body "\n@enduml")))) 104 | (with-temp-buffer 105 | (insert png) 106 | (write-file out-file))))))) 107 | 108 | (provide 'config-org) 109 | 110 | -------------------------------------------------------------------------------- /config/config-os.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defcustom dotemacs-os/additional-exec-paths 4 | nil 5 | "Additional paths to be added to `exec-path'." 6 | :type '(repeat (string)) 7 | :group 'dotemacs) 8 | 9 | (if (eq system-type 'windows-nt) 10 | (dolist (path (split-string (getenv "PATH") ";")) 11 | (add-to-list 'exec-path (replace-regexp-in-string "\\\\" "/" path))) 12 | (require-package 'exec-path-from-shell) 13 | (exec-path-from-shell-initialize)) 14 | 15 | (defun /os/addpath (path) 16 | (let* ((directory (expand-file-name path)) 17 | (env-value (concat directory path-separator (getenv "PATH")))) 18 | (when directory 19 | (setenv "PATH" env-value) 20 | (setq eshell-path-env env-value) 21 | (add-to-list 'exec-path directory)))) 22 | 23 | (/os/addpath (concat user-emacs-directory "bin")) 24 | (dolist (path dotemacs-os/additional-exec-paths) 25 | (/os/addpath path)) 26 | 27 | (when (eq system-type 'darwin) 28 | (require-package 'osx-trash) 29 | (osx-trash-setup) 30 | 31 | (require-package 'reveal-in-osx-finder) 32 | (require-package 'vkill)) 33 | 34 | (defun /os/reveal-in-os () 35 | (interactive) 36 | (if (eq system-type 'windows-nt) 37 | (start-process "*explorer*" "*explorer*" "explorer.exe" 38 | (replace-regexp-in-string "/" "\\\\" (file-name-directory (buffer-file-name)))) 39 | (call-interactively #'reveal-in-osx-finder))) 40 | 41 | (provide 'config-os) 42 | -------------------------------------------------------------------------------- /config/config-pairs.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defun /pairs/init-smartparens () 4 | (require-package 'smartparens) 5 | (require 'smartparens-config) 6 | 7 | (electric-pair-mode -1) 8 | 9 | (setq sp-base-key-bindings 'sp) 10 | (setq sp-show-pair-from-inside t) 11 | 12 | (show-smartparens-global-mode t) 13 | (smartparens-global-mode t) 14 | 15 | (sp-pair "{" nil :post-handlers '(("||\n[i]" "RET"))) 16 | (sp-pair "(" nil :post-handlers '(("||\n[i]" "RET"))) 17 | (sp-pair "[" nil :post-handlers '(("||\n[i]" "RET")))) 18 | 19 | (defun /pairs/init-emacs () 20 | ;; tabs/spaces only, do not include newlines 21 | (setq electric-pair-skip-whitespace-chars '(32 9)) 22 | 23 | (electric-pair-mode t) 24 | 25 | (add-hook 'minibuffer-setup-hook (defun /pairs/off () (electric-pair-mode -1))) 26 | (add-hook 'minibuffer-exit-hook (defun /pairs/on () (electric-pair-mode t)))) 27 | 28 | (defun /pairs/toggle () 29 | (interactive) 30 | (cond 31 | ((eq dotemacs-pair-engine 'smartparens) 32 | (call-interactively #'smartparens-global-mode)) 33 | (t 34 | (call-interactively #'electric-pair-mode)))) 35 | 36 | (cond 37 | ((eq dotemacs-pair-engine 'smartparens) 38 | (/pairs/init-smartparens)) 39 | (t 40 | (/pairs/init-emacs))) 41 | 42 | (provide 'config-pairs) 43 | -------------------------------------------------------------------------------- /config/config-projectile.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (require-package 'projectile) 4 | 5 | (setq projectile-cache-file (concat dotemacs-cache-directory "projectile.cache")) 6 | (setq projectile-known-projects-file (concat dotemacs-cache-directory "projectile-bookmarks.eld")) 7 | (setq projectile-indexing-method 'alien) 8 | (setq projectile-enable-caching t) 9 | (setq projectile-files-cache-expire (* 60 60 24 14)) ;; 2 weeks 10 | 11 | (after 'helm-projectile 12 | (add-to-list 'helm-projectile-sources-list 'helm-source-projectile-recentf-list)) 13 | 14 | (projectile-mode) 15 | 16 | (dolist (dir dotemacs-globally-ignored-directories) 17 | (add-to-list 'projectile-globally-ignored-directories dir)) 18 | 19 | (cond 20 | ((executable-find "rg") 21 | (setq projectile-generic-command 22 | (concat "rg -0 --hidden --files --color never " 23 | (mapconcat (lambda (dir) (concat "--glob " "'!" dir "'")) projectile-globally-ignored-directories " ")))) 24 | ((executable-find "ag") 25 | (setq projectile-generic-command 26 | (concat "ag -0 -l --hidden --nocolor " 27 | (mapconcat (lambda (dir) (concat "--ignore-dir=" dir)) projectile-globally-ignored-directories " ")))) 28 | ((executable-find "ack") 29 | (setq projectile-generic-command 30 | (concat "ack -f --print0" 31 | (mapconcat (lambda (dir) (concat "--ignore-dir=" dir)) projectile-globally-ignored-directories " "))))) 32 | 33 | (provide 'config-projectile) 34 | -------------------------------------------------------------------------------- /config/config-spelling.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-spelling nil 4 | "Configuration options for spelling." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-spelling) 7 | 8 | (defcustom dotemacs-spelling/major-modes 9 | '(text-mode) 10 | "List of major modes to enable spelling in." 11 | :type '(repeat (symbol)) 12 | :group 'dotemacs-spelling) 13 | 14 | (when (or (executable-find "aspell") 15 | (executable-find "ispell") 16 | (executable-find "hunspell")) 17 | (add-hook 'after-change-major-mode-hook 18 | (lambda () 19 | (when (cl-find-if #'derived-mode-p dotemacs-spelling/major-modes) 20 | (turn-on-flyspell))))) 21 | 22 | (provide 'config-spelling) 23 | -------------------------------------------------------------------------------- /config/config-stylus.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (add-to-list 'auto-mode-alist 4 | '("\\.styl$" . (lambda () 5 | (require-package 'stylus-mode) 6 | (stylus-mode)))) 7 | 8 | (after 'stylus-mode 9 | 10 | (defvar /stylus/command-args nil 11 | "Additional list of arguments to pass into the stylus command.") 12 | 13 | (defvar /stylus/display-buffer-name "*Stylus Output*" 14 | "The name of the Stylus buffer with CSS output.") 15 | 16 | (defvar /stylus/last-command-mode nil) 17 | 18 | (defun /stylus/process-sentinel (process event) 19 | (when (equal event "finished\n") 20 | (if /stylus/last-command-mode 21 | (display-buffer /stylus/display-buffer-name) 22 | (with-current-buffer /stylus/display-buffer-name 23 | (skewer-css-eval-buffer))))) 24 | 25 | (defun /stylus/setup-output-buffer (show) 26 | (let ((buffer (get-buffer-create /stylus/display-buffer-name))) 27 | (with-current-buffer buffer 28 | (erase-buffer) 29 | (when show 30 | (display-buffer buffer)) 31 | (css-mode)))) 32 | 33 | (defun /stylus/async (begin end show) 34 | (require 'skewer-css) 35 | (/stylus/setup-output-buffer show) 36 | (setq /stylus/last-command-mode show) 37 | (let ((process (apply 'start-process 38 | "stylus" /stylus/display-buffer-name "stylus" /stylus/command-args))) 39 | (set-process-sentinel process '/stylus/process-sentinel) 40 | (process-send-region process begin end) 41 | (process-send-eof process))) 42 | 43 | (defun /stylus/compile-and-show-region (start end) 44 | (interactive "r") 45 | (/stylus/async start end t)) 46 | 47 | (defun /stylus/compile-and-show-buffer () 48 | (interactive) 49 | (/stylus/async (point-min) (point-max) t)) 50 | 51 | (defun /stylus/compile-and-eval-buffer () 52 | (interactive) 53 | (/stylus/async (point-min) (point-max) nil)) 54 | 55 | (add-hook 'stylus-mode-hook (lambda () 56 | (unless (process-status "httpd") 57 | (httpd-start))))) 58 | 59 | (provide 'config-stylus) 60 | -------------------------------------------------------------------------------- /config/config-term.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (require-package 'xterm-color) 4 | (require 'xterm-color) 5 | 6 | (add-hook 'comint-preoutput-filter-functions #'xterm-color-filter) 7 | (setq comint-output-filter-functions (remove #'ansi-color-process-output comint-output-filter-functions)) 8 | 9 | (after 'esh-mode 10 | (add-to-list 'eshell-preoutput-filter-functions #'xterm-color-filter) 11 | (add-hook 'eshell-mode-hook 12 | (lambda () 13 | (setenv "TERM" "xterm-256color") 14 | (setq xterm-color-preserve-properties t)))) 15 | 16 | (provide 'config-term) 17 | -------------------------------------------------------------------------------- /config/config-tree-sitter.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (when (and (functionp 'module-load) module-file-suffix) 4 | (require-package 'tree-sitter) 5 | (require 'tree-sitter) 6 | 7 | (require-package 'tree-sitter-langs) 8 | (require 'tree-sitter-langs) 9 | 10 | (global-tree-sitter-mode t) 11 | (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)) 12 | -------------------------------------------------------------------------------- /config/config-typescript.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-typescript nil 4 | "Configuration options for TypeScript." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-typescript) 7 | 8 | (defcustom dotemacs-typescript/tide-format-before-save t 9 | "If non-nil, will auto format the buffer with tide prior to saving." 10 | :group 'dotemacs-typescript 11 | :type 'boolean) 12 | 13 | (defcustom dotemacs-typescript/engine 14 | 'lsp 15 | "The engine to drive TypeScript." 16 | :type '(radio 17 | (const :tag "tide" tide) 18 | (const :tag "eglot" eglot) 19 | (const :tag "lsp" lsp)) 20 | :group 'dotemacs-typescript) 21 | 22 | 23 | 24 | (defun /typescript/setup () 25 | (cond 26 | ((eq dotemacs-typescript/engine 'tide) 27 | (require-package 'tide) 28 | (setq tide-completion-detailed t) 29 | (setq tide-completion-ignore-case t) 30 | (setq tide-always-show-documentation t) 31 | (when dotemacs-typescript/tide-format-before-save 32 | (add-hook 'before-save-hook #'tide-format-before-save)) 33 | 34 | (tide-setup) 35 | (tide-hl-identifier-mode t) 36 | (eldoc-mode t)) 37 | ((eq dotemacs-typescript/engine 'eglot) 38 | (/eglot/activate)) 39 | ((eq dotemacs-typescript/engine 'lsp) 40 | (/lsp/activate)))) 41 | 42 | (when (eq dotemacs-typescript/engine 'tide) 43 | (after [tide evil] 44 | (defadvice tide-jump-to-definition (before dotemacs activate) 45 | (evil-set-jump)))) 46 | 47 | (/boot/lazy-major-mode "\\.ts$" typescript-mode) 48 | (add-hook 'typescript-mode-hook #'/typescript/setup) 49 | 50 | (after 'web-mode 51 | (define-derived-mode typescript-tsx-mode web-mode "typescript-tsx") 52 | (add-hook 'typescript-tsx-mode-hook #'/typescript/setup)) 53 | 54 | (when (eq dotemacs-typescript/engine 'eglot) 55 | (after [eglot] 56 | (add-to-list 'eglot-server-programs 57 | '(typescript-tsx-mode "typescript-language-server" "--stdio")))) 58 | 59 | (add-to-list 60 | 'auto-mode-alist 61 | '("\\.tsx$" . (lambda () 62 | (require-package 'web-mode) 63 | (require 'web-mode) 64 | (typescript-tsx-mode)))) 65 | 66 | (defun /typescript/generate-typings-for-css () 67 | "Generates a Typescript type definition file for the current CSS file." 68 | (interactive) 69 | (unless (s-ends-with-p "\.css" (buffer-file-name)) 70 | (error "The current buffer is not a CSS file")) 71 | (let ((pos 0) 72 | (string (substring-no-properties (buffer-string))) 73 | matches) 74 | (while (string-match "^\.\\(\\w\\|-\\)+" string pos) 75 | (push (s-lower-camel-case (substring (match-string 0 string) 1)) matches) 76 | (setq pos (match-end 0))) 77 | (with-temp-file (concat (buffer-file-name) ".d.ts") 78 | (dolist (m (reverse matches)) 79 | (insert (format "export const %s: string;\n" m)))))) 80 | 81 | (provide 'config-typescript) 82 | -------------------------------------------------------------------------------- /config/config-util.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defun /utils/window-killer () 4 | "closes the window, and deletes the buffer if it's the last window open." 5 | (interactive) 6 | (if (> buffer-display-count 1) 7 | (if (= (length (window-list)) 1) 8 | (kill-buffer) 9 | (delete-window)) 10 | (kill-buffer-and-window))) 11 | 12 | (defun /utils/minibuffer-keyboard-quit () 13 | "Abort recursive edit. 14 | In Delete Selection mode, if the mark is active, just deactivate it; 15 | then it takes a second \\[keyboard-quit] to abort the minibuffer." 16 | (interactive) 17 | (if (and delete-selection-mode transient-mark-mode mark-active) 18 | (setq deactivate-mark t) 19 | (when (get-buffer "*Completions*") (delete-windows-on "*Completions*")) 20 | (abort-recursive-edit))) 21 | 22 | (defun /utils/set-transparency (alpha) 23 | "Sets the transparency of the current frame." 24 | (interactive "nAlpha: ") 25 | (set-frame-parameter nil 'alpha alpha)) 26 | 27 | (defun /utils/google () 28 | "Google the selected region if any, display a query prompt otherwise." 29 | (interactive) 30 | (browse-url 31 | (concat 32 | "http://www.google.com/search?ie=utf-8&oe=utf-8&q=" 33 | (url-hexify-string (if mark-active 34 | (buffer-substring (region-beginning) (region-end)) 35 | (read-string "Search Google: ")))))) 36 | 37 | (defun /utils/copy-file-name-to-clipboard () 38 | "Copy the current buffer file name to the clipboard." 39 | (interactive) 40 | (let ((filename (if (equal major-mode 'dired-mode) 41 | default-directory 42 | (buffer-file-name)))) 43 | (when filename 44 | (kill-new filename) 45 | (message "Copied buffer file name '%s' to the clipboard." filename)))) 46 | 47 | (defun /utils/eval-and-replace () 48 | "Replace the preceding sexp with its value." 49 | (interactive) 50 | (let ((value (eval (preceding-sexp)))) 51 | (backward-kill-sexp) 52 | (insert (format "%s" value)))) 53 | 54 | (defun /utils/rename-current-buffer-file () 55 | "Renames current buffer and file it is visiting." 56 | (interactive) 57 | (let ((filename (buffer-file-name))) 58 | (if (not (and filename (file-exists-p filename))) 59 | (message "Buffer is not visiting a file!") 60 | (let ((new-name (read-file-name "New name: " filename))) 61 | (cond 62 | ((vc-backend filename) (vc-rename-file filename new-name)) 63 | (t 64 | (rename-file filename new-name t) 65 | (set-visited-file-name new-name t t))))))) 66 | 67 | (defun /utils/delete-current-buffer-file () 68 | "Kill the current buffer and deletes the file it is visiting." 69 | (interactive) 70 | (let ((filename (buffer-file-name))) 71 | (when filename 72 | (if (vc-backend filename) 73 | (vc-delete-file filename) 74 | (when (y-or-n-p (format "Are you sure you want to delete %s? " filename)) 75 | (delete-file filename) 76 | (message "Deleted file %s" filename) 77 | (kill-buffer)))))) 78 | 79 | (defun /utils/goto-scratch-buffer () 80 | "Create a new scratch buffer." 81 | (interactive) 82 | (switch-to-buffer (get-buffer-create "*scratch*"))) 83 | 84 | (defun /utils/insert-last-kbd-macro () 85 | (interactive) 86 | (name-last-kbd-macro 'my-last-macro) 87 | (insert-kbd-macro 'my-last-macro)) 88 | 89 | (defun /utils/set-buffer-to-unix-format () 90 | "Converts the current buffer to UNIX file format." 91 | (interactive) 92 | (set-buffer-file-coding-system 'undecided-unix nil)) 93 | 94 | (defun /utils/set-buffer-to-dos-format () 95 | "Converts the current buffer to DOS file format." 96 | (interactive) 97 | (set-buffer-file-coding-system 'undecided-dos nil)) 98 | 99 | (defun /utils/find-file-as-root (file) 100 | "Edits a file as root." 101 | (interactive "f") 102 | (find-file-other-window (concat "/sudo:root@localhost:" file))) 103 | 104 | (provide 'config-util) 105 | -------------------------------------------------------------------------------- /config/config-vcs.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-vcs nil 4 | "Configuration options for version control." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-vcs) 7 | 8 | (defcustom dotemacs-vcs/inhibit-vc-integration (eq system-type 'windows-nt) 9 | "When non-nil, disables integration with `vc.el'. 10 | This is non-nil by default on Windows machines, where this is a heavy performance cost." 11 | :type 'boolean 12 | :group 'dotemacs-vcs) 13 | 14 | (defcustom dotemacs-vcs/gutter (not (eq system-type 'windows-nt)) 15 | "When non-nil, enables VCS changes in the gutter. 16 | This is non-nil by default on Windows machines, where this is a heavy performance cost." 17 | :type 'boolean 18 | :group 'dotemacs-vcs) 19 | 20 | (defcustom dotemacs-vcs/diff 21 | 'ediff 22 | "The default diffing tool." 23 | :type '(radio 24 | (const :tag "ediff" ediff) 25 | (const :tag "vdiff" vdiff)) 26 | :group 'dotemacs-vcs) 27 | 28 | 29 | 30 | (when dotemacs-vcs/inhibit-vc-integration 31 | (after 'vc-hooks 32 | (setq vc-handled-backends nil))) 33 | 34 | (setq vc-make-backup-files t) 35 | 36 | 37 | 38 | (when (executable-find "git") 39 | (require-package 'magit) 40 | 41 | (defun /vcs/magit-post-display-buffer-hook() 42 | (if (string-match "*magit:" (buffer-name)) 43 | (delete-other-windows))) 44 | (add-hook 'magit-post-display-buffer-hook #'/vcs/magit-post-display-buffer-hook) 45 | 46 | (setq magit-section-show-child-count t) 47 | (setq magit-display-buffer-function #'magit-display-buffer-fullcolumn-most-v1) 48 | (setq magit-ediff-dwim-show-on-hunks t) 49 | 50 | (after 'eshell 51 | (require-package 'pcmpl-git) 52 | (require 'pcmpl-git) 53 | 54 | (defalias 'pcomplete/g #'pcomplete/git) 55 | 56 | (defun pcomplete/gbr () 57 | (pcomplete-here* (pcmpl-git-branches))) 58 | 59 | (defun pcomplete/gco () 60 | (pcomplete-here* (pcmpl-git-complete-commit))) 61 | 62 | (defun pcomplete/grb () 63 | (pcomplete-here* (pcmpl-git-complete-commit)))) 64 | 65 | (when dotemacs-vcs/gutter 66 | (if (display-graphic-p) 67 | (progn 68 | (require-package 'git-gutter-fringe+) 69 | (require 'git-gutter-fringe+)) 70 | (require-package 'git-gutter+)) 71 | (global-git-gutter+-mode)) 72 | 73 | (require-package 'git-timemachine)) 74 | 75 | 76 | 77 | (require-package 'diff-hl) 78 | (add-hook 'dired-mode-hook 'diff-hl-dired-mode) 79 | (unless (display-graphic-p) 80 | (diff-hl-margin-mode)) 81 | 82 | 83 | 84 | (require-package 'with-editor) 85 | (autoload 'with-editor-export-editor "with-editor") 86 | (defun /vcs/with-editor-export () 87 | (unless (equal (buffer-name) "*fzf*") 88 | (with-editor-export-editor) 89 | (message ""))) 90 | (add-hook 'shell-mode-hook #'/vcs/with-editor-export) 91 | (add-hook 'term-exec-hook #'/vcs/with-editor-export) 92 | (add-hook 'eshell-mode-hook #'/vcs/with-editor-export) 93 | 94 | 95 | 96 | (defun /vcs/setup-vdiff () 97 | (require-package 'vdiff) 98 | (require 'vdiff) 99 | (after 'magit 100 | (require-package 'vdiff-magit) 101 | (require 'vdiff-magit))) 102 | 103 | (when (eq dotemacs-vcs/diff 'vdiff) 104 | (/vcs/setup-vdiff) 105 | (after 'config-bindings-vdiff 106 | (/bindings/vdiff/turn-on))) 107 | 108 | 109 | 110 | (/boot/lazy-major-mode "^\\.gitignore$" gitignore-mode) 111 | (/boot/lazy-major-mode "^\\.gitattributes$" gitattributes-mode) 112 | 113 | 114 | 115 | (provide 'config-vcs) 116 | -------------------------------------------------------------------------------- /config/config-web.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (defgroup dotemacs-web nil 4 | "Configuration options for web." 5 | :group 'dotemacs 6 | :prefix 'dotemacs-web) 7 | 8 | (defcustom dotemacs-web/indent-offset 2 9 | "The number of spaces to indent nested statements." 10 | :type 'integer 11 | :group 'dotemacs-web) 12 | 13 | (defcustom dotemacs-web/use-skewer-mode nil 14 | "When non-nil, enables `skewer-mode' integration." 15 | :type 'boolean 16 | :group 'dotemacs-web) 17 | 18 | (defcustom dotemacs-web/use-emmet-mode nil 19 | "When non-nil, enables `emmet-mode' integration." 20 | :type 'boolean 21 | :group 'dotemacs-web) 22 | 23 | (defcustom dotemacs-web/html-engine 24 | nil 25 | "Whether to activate enhanced LSP functionalities for HTML." 26 | :type '(radio 27 | (const :tag "none" nil) 28 | (const :tag "eglot" eglot) 29 | (const :tag "lsp" lsp)) 30 | :group 'dotemacs-web) 31 | 32 | (defcustom dotemacs-web/css-engine 33 | nil 34 | "Whether to activate enhanced LSP functionalities for CSS." 35 | :type '(radio 36 | (const :tag "none" nil) 37 | (const :tag "eglot" eglot) 38 | (const :tag "lsp" lsp)) 39 | :group 'dotemacs-web) 40 | 41 | 42 | 43 | (/boot/lazy-major-mode "\\.jade$" jade-mode) 44 | (/boot/lazy-major-mode "\\.scss$" scss-mode) 45 | (/boot/lazy-major-mode "\\.sass$" sass-mode) 46 | (/boot/lazy-major-mode "\\.less$" less-css-mode) 47 | 48 | 49 | (/boot/lazy-major-mode "\\.coffee\\'" coffee-mode) 50 | (setq coffee-indent-like-python-mode t) 51 | 52 | 53 | (when dotemacs-web/use-skewer-mode 54 | (require-package 'skewer-mode) 55 | (skewer-setup)) 56 | 57 | 58 | (when dotemacs-web/use-emmet-mode 59 | (defun /web/turn-on-emmet-mode () 60 | (require-package 'emmet-mode) 61 | (emmet-mode)) 62 | 63 | (add-hook 'css-mode-hook #'/web/turn-on-emmet-mode) 64 | (add-hook 'sgml-mode-hook #'/web/turn-on-emmet-mode) 65 | (add-hook 'web-mode-hook #'/web/turn-on-emmet-mode)) 66 | 67 | 68 | (require-package 'rainbow-mode) 69 | (add-hook 'html-mode-hook #'rainbow-mode) 70 | (add-hook 'web-mode-hook #'rainbow-mode) 71 | (add-hook 'css-mode-hook #'rainbow-mode) 72 | (add-hook 'stylus-mode-hook #'rainbow-mode) 73 | 74 | 75 | (/boot/lazy-major-mode "\\.html?$" web-mode) 76 | 77 | 78 | (cond 79 | ((eq dotemacs-web/html-engine 'lsp) 80 | (add-hook 'css-mode-hook #'/lsp/activate)) 81 | ((eq dotemacs-web/html-engine 'eglot) 82 | (add-hook 'css-mode-hook #'/eglot/activate))) 83 | 84 | 85 | (after 'web-mode 86 | (defun /web/web-mode-hook () 87 | (electric-pair-mode -1) 88 | 89 | (when (equal web-mode-content-type "html") 90 | (cond 91 | ((eq dotemacs-web/html-engine 'lsp) 92 | (/lsp/activate)) 93 | ((eq dotemacs-web/html-engine 'eglot) 94 | (/eglot/activate)))) 95 | 96 | (setq web-mode-enable-auto-quoting (not (equal web-mode-content-type "jsx")))) 97 | 98 | (add-hook 'web-mode-hook #'/web/web-mode-hook) 99 | (after 'yasnippet 100 | (add-hook 'web-mode-hook #'yas-minor-mode)) 101 | 102 | (add-to-list 'web-mode-indentation-params '("lineup-calls" . nil)) 103 | 104 | (setq web-mode-code-indent-offset dotemacs-web/indent-offset) 105 | (setq web-mode-markup-indent-offset dotemacs-web/indent-offset) 106 | (setq web-mode-css-indent-offset dotemacs-web/indent-offset) 107 | (setq web-mode-sql-indent-offset dotemacs-web/indent-offset) 108 | 109 | (setq web-mode-enable-auto-pairing (not (eq dotemacs-pair-engine 'smartparens))) 110 | (setq web-mode-enable-current-column-highlight t) 111 | (setq web-mode-enable-current-element-highlight t) 112 | (setq web-mode-enable-element-content-fontification t) 113 | (setq web-mode-enable-element-tag-fontification t) 114 | (setq web-mode-enable-html-entities-fontification t) 115 | (setq web-mode-enable-inlays t) 116 | (setq web-mode-enable-sql-detection t) 117 | (setq web-mode-enable-block-face t) 118 | (setq web-mode-enable-part-face t)) 119 | 120 | 121 | ;; indent after deleting a tag 122 | (defadvice sgml-delete-tag (after dotemacs activate) 123 | (indent-region (point-min) (point-max))) 124 | 125 | 126 | (provide 'config-web) 127 | -------------------------------------------------------------------------------- /config/config-yasnippet.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (/boot/delayed-init 4 | (require-package 'yasnippet) 5 | 6 | (require 'yasnippet) 7 | 8 | (setq yas-fallback-behavior 'return-nil) 9 | (setq yas-also-auto-indent-first-line t) 10 | (setq yas-prompt-functions '(yas/ido-prompt yas/completing-prompt)) 11 | 12 | (add-hook 'prog-mode-hook 'yas-minor-mode) 13 | (add-hook 'html-mode-hook 'yas-minor-mode) 14 | 15 | (yas-load-directory (concat user-emacs-directory "snippets"))) 16 | 17 | (provide 'config-yasnippet) 18 | -------------------------------------------------------------------------------- /core/core-boot.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (let ((base (concat user-emacs-directory "elisp/"))) 4 | (add-to-list 'load-path base) 5 | (dolist (dir (directory-files base t "^[^.]")) 6 | (when (file-directory-p dir) 7 | (add-to-list 'load-path dir)))) 8 | 9 | (defmacro /boot/measure-load (target &rest body) 10 | (declare (indent defun)) 11 | `(let ((elapsed) 12 | (start (current-time))) 13 | (prog1 14 | ,@body 15 | (with-current-buffer (get-buffer-create "*Load Times*") 16 | (when (= 0 (buffer-size)) 17 | (insert (format "| %-60s | %-23s | elapsed |\n" "feature" "timestamp")) 18 | (insert "|------------------------------------------+-------------------------+----------|\n")) 19 | (goto-char (point-max)) 20 | (setq elapsed (float-time (time-subtract (current-time) start))) 21 | (insert (format "| %-60s | %s | %f |\n" 22 | ,target 23 | (format-time-string "%Y-%m-%d %H:%M:%S.%3N" (current-time)) 24 | elapsed)))))) 25 | 26 | (defadvice load (around dotemacs activate) 27 | (/boot/measure-load file ad-do-it)) 28 | 29 | (defadvice require (around dotemacs activate) 30 | (if (memq feature features) 31 | ad-do-it 32 | (/boot/measure-load feature ad-do-it))) 33 | 34 | (defmacro bind (&rest commands) 35 | "Convenience macro which creates a lambda interactive command." 36 | `(lambda (arg) 37 | (interactive "P") 38 | ,@commands)) 39 | 40 | (defun require-package (package) 41 | "Ensures that PACKAGE is installed." 42 | (unless (or (package-installed-p package) 43 | (require package nil 'noerror)) 44 | (unless (assoc package package-archive-contents) 45 | (package-refresh-contents)) 46 | (package-install package))) 47 | 48 | (unless (fboundp 'with-eval-after-load) 49 | (defmacro with-eval-after-load (file &rest body) 50 | (declare (indent 1)) 51 | `(eval-after-load ,file (lambda () ,@body)))) 52 | 53 | (defmacro after (feature &rest body) 54 | "Executes BODY after FEATURE has been loaded. 55 | 56 | FEATURE may be any one of: 57 | 'evil => (with-eval-after-load 'evil BODY) 58 | \"evil-autoloads\" => (with-eval-after-load \"evil-autolaods\" BODY) 59 | [evil cider] => (with-eval-after-load 'evil 60 | (with-eval-after-load 'cider 61 | BODY)) 62 | " 63 | (declare (indent 1)) 64 | (cond 65 | ((vectorp feature) 66 | (let ((prog (macroexp-progn body))) 67 | (cl-loop for f across feature 68 | do 69 | (progn 70 | (setq prog (append `(',f) `(,prog))) 71 | (setq prog (append '(with-eval-after-load) prog)))) 72 | prog)) 73 | (t 74 | `(with-eval-after-load ,feature ,@body)))) 75 | 76 | (defmacro /boot/lazy-major-mode (pattern mode) 77 | "Defines a new major-mode matched by PATTERN, installs MODE if necessary, and activates it." 78 | `(add-to-list 'auto-mode-alist 79 | '(,pattern . (lambda () 80 | (require-package (quote ,mode)) 81 | (,mode))))) 82 | 83 | (defmacro /boot/delayed-init (&rest body) 84 | "Runs BODY after idle for a predetermined amount of time." 85 | `(run-with-idle-timer 86 | 0.5 87 | nil 88 | (lambda () ,@body))) 89 | 90 | (provide 'core-boot) 91 | -------------------------------------------------------------------------------- /elisp/etags-select.el: -------------------------------------------------------------------------------- 1 | ;;; etags-select.el --- Select from multiple tags 2 | 3 | ;; Copyright (C) 2007 Scott Frazer 4 | 5 | ;; Author: Scott Frazer 6 | ;; Maintainer: Scott Frazer 7 | ;; Created: 07 Jun 2007 8 | ;; Version: 1.13 9 | ;; Keywords: etags tags tag select 10 | 11 | ;; This file is free software; you can redistribute it and/or modify 12 | ;; it under the terms of the GNU General Public License as published by 13 | ;; the Free Software Foundation; either version 2, or (at your option) 14 | ;; any later version. 15 | 16 | ;; This file is distributed in the hope that it will be useful, 17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | ;; GNU General Public License for more details. 20 | 21 | ;; You should have received a copy of the GNU General Public License 22 | ;; along with GNU Emacs; see the file COPYING. If not, write to 23 | ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 24 | ;; Boston, MA 02110-1301, USA. 25 | 26 | ;;; Commentary: 27 | 28 | ;; Open a buffer with file/lines of exact-match tags shown. Select one by 29 | ;; going to a line and pressing return. pop-tag-mark still works with this 30 | ;; code. 31 | ;; 32 | ;; If there is only one match, you can skip opening the selection window by 33 | ;; setting a custom variable. This means you could substitute the key binding 34 | ;; for find-tag-at-point with etags-select-find-tag-at-point, although it 35 | ;; won't play well with tags-loop-continue. On the other hand, if you like 36 | ;; the behavior of tags-loop-continue you probably don't need this code. 37 | ;; 38 | ;; I use this: 39 | ;; (global-set-key "\M-?" 'etags-select-find-tag-at-point) 40 | ;; (global-set-key "\M-." 'etags-select-find-tag) 41 | ;; 42 | ;; Contributers of ideas and/or code: 43 | ;; David Engster 44 | ;; James Ferguson 45 | ;; 46 | ;;; Change log: 47 | ;; 48 | ;; 28 Oct 2008 -- v1.13 49 | ;; Add short tag name completion option 50 | ;; Add go-if-tagnum-is-unambiguous option 51 | ;; 13 May 2008 -- v1.12 52 | ;; Fix completion bug for XEmacs etags 53 | ;; Add highlighting of tag after jump 54 | ;; 28 Apr 2008 -- v1.11 55 | ;; Add tag completion 56 | ;; 25 Sep 2007 -- v1.10 57 | ;; Fix save window layout bug 58 | ;; 25 Sep 2007 -- v1.9 59 | ;; Add function to prompt for tag to find (instead of using 60 | ;; what is at point) 61 | ;; 25 Sep 2007 -- v1.8 62 | ;; Don't mess up user's window layout. 63 | ;; Add function/binding to go to the tag in other window. 64 | ;; 10 Sep 2007 -- v1.7 65 | ;; Disambiguate tags with matching suffixes 66 | ;; 04 Sep 2007 -- v1.6 67 | ;; Speed up tag searching 68 | ;; 27 Jul 2007 -- v1.5 69 | ;; Respect case-fold-search and tags-case-fold-search 70 | ;; 24 Jul 2007 -- v1.4 71 | ;; Fix filenames for tag files with absolute paths 72 | ;; 24 Jul 2007 -- v1.3 73 | ;; Handle qualified and implicit tags. 74 | ;; Add tag name to display. 75 | ;; Add tag numbers so you can jump directly to one. 76 | ;; 13 Jun 2007 -- v1.2 77 | ;; Need to regexp-quote the searched-for string. 78 | 79 | ;;; Code: 80 | 81 | (require 'custom) 82 | (require 'etags) 83 | 84 | ;;; Custom stuff 85 | 86 | ;;;###autoload 87 | (defgroup etags-select-mode nil 88 | "*etags select mode." 89 | :group 'etags) 90 | 91 | ;;;###autoload 92 | (defcustom etags-select-no-select-for-one-match t 93 | "*If non-nil, don't open the selection window if there is only one 94 | matching tag." 95 | :group 'etags-select-mode 96 | :type 'boolean) 97 | 98 | ;;;###autoload 99 | (defcustom etags-select-mode-hook nil 100 | "*List of functions to call on entry to etags-select-mode mode." 101 | :group 'etags-select-mode 102 | :type 'hook) 103 | 104 | ;;;###autoload 105 | (defcustom etags-select-highlight-tag-after-jump t 106 | "*If non-nil, temporarily highlight the tag after you jump to it." 107 | :group 'etags-select-mode 108 | :type 'boolean) 109 | 110 | ;;;###autoload 111 | (defcustom etags-select-highlight-delay 1.0 112 | "*How long to highlight the tag." 113 | :group 'etags-select-mode 114 | :type 'number) 115 | 116 | ;;;###autoload 117 | (defface etags-select-highlight-tag-face 118 | '((t (:foreground "white" :background "cadetblue4" :bold t))) 119 | "Font Lock mode face used to highlight tags." 120 | :group 'etags-select-mode) 121 | 122 | ;;;###autoload 123 | (defcustom etags-select-use-short-name-completion nil 124 | "*Use short tag names during completion. For example, say you 125 | have a function named foobar in several classes and you invoke 126 | `etags-select-find-tag'. If this variable is nil, you would have 127 | to type ClassA::foo to start completion. Since avoiding 128 | knowing which class a function is in is the basic idea of this 129 | package, if you set this to t you can just type foo. 130 | 131 | Only works with GNU Emacs." 132 | :group 'etags-select-mode 133 | :type 'boolean) 134 | 135 | ;;;###autoload 136 | (defcustom etags-select-go-if-unambiguous nil 137 | "*If non-nil, jump by tag number if it is unambiguous." 138 | :group 'etags-select-mode 139 | :type 'boolean) 140 | 141 | ;;; Variables 142 | 143 | (defvar etags-select-buffer-name "*etags-select*" 144 | "etags-select buffer name.") 145 | 146 | (defvar etags-select-mode-font-lock-keywords nil 147 | "etags-select font-lock-keywords.") 148 | 149 | (defvar etags-select-source-buffer nil 150 | "etags-select source buffer tag was found from.") 151 | 152 | (defvar etags-select-opened-window nil 153 | "etags-select opened a select window.") 154 | 155 | (defconst etags-select-non-tag-regexp "\\(\\s-*$\\|In:\\|Finding tag:\\)" 156 | "etags-select non-tag regex.") 157 | 158 | ;;; Functions 159 | 160 | (if (string-match "XEmacs" emacs-version) 161 | (fset 'etags-select-match-string 'match-string) 162 | (fset 'etags-select-match-string 'match-string-no-properties)) 163 | 164 | ;; I use Emacs, but with a hacked version of XEmacs' etags.el, thus this variable 165 | 166 | (defvar etags-select-use-xemacs-etags-p (fboundp 'get-tag-table-buffer) 167 | "Use XEmacs etags?") 168 | 169 | (defun etags-select-case-fold-search () 170 | "Get case-fold search." 171 | (when (boundp 'tags-case-fold-search) 172 | (if (memq tags-case-fold-search '(nil t)) 173 | tags-case-fold-search 174 | case-fold-search))) 175 | 176 | (defun etags-select-insert-matches (tagname tag-file tag-count) 177 | "Insert matches to tagname in tag-file." 178 | (let ((tag-table-buffer (etags-select-get-tag-table-buffer tag-file)) 179 | (tag-file-path (file-name-directory tag-file)) 180 | (tag-regex (concat "^.*?\\(" "\^?\\(.+[:.']" tagname "\\)\^A" 181 | "\\|" "\^?" tagname "\^A" 182 | "\\|" "\\<" tagname "[ \f\t()=,;]*\^?[0-9,]" 183 | "\\)")) 184 | (case-fold-search (etags-select-case-fold-search)) 185 | full-tagname tag-line filename current-filename) 186 | (set-buffer tag-table-buffer) 187 | (modify-syntax-entry ?_ "w") 188 | (goto-char (point-min)) 189 | (while (search-forward tagname nil t) 190 | (beginning-of-line) 191 | (when (re-search-forward tag-regex (point-at-eol) 'goto-eol) 192 | (setq full-tagname (or (etags-select-match-string 2) tagname)) 193 | (setq tag-count (1+ tag-count)) 194 | (beginning-of-line) 195 | (re-search-forward "\\s-*\\(.*?\\)\\s-*\^?") 196 | (setq tag-line (etags-select-match-string 1)) 197 | (end-of-line) 198 | (save-excursion 199 | (re-search-backward "\f") 200 | (re-search-forward "^\\(.*?\\),") 201 | (setq filename (etags-select-match-string 1)) 202 | (unless (file-name-absolute-p filename) 203 | (setq filename (concat tag-file-path filename)))) 204 | (save-excursion 205 | (set-buffer etags-select-buffer-name) 206 | (when (not (string= filename current-filename)) 207 | (insert "\nIn: " filename "\n") 208 | (setq current-filename filename)) 209 | (insert (int-to-string tag-count) " [" full-tagname "] " tag-line "\n")))) 210 | (modify-syntax-entry ?_ "_") 211 | tag-count)) 212 | 213 | (defun etags-select-get-tag-table-buffer (tag-file) 214 | "Get tag table buffer for a tag file." 215 | (if etags-select-use-xemacs-etags-p 216 | (get-tag-table-buffer tag-file) 217 | (visit-tags-table-buffer tag-file) 218 | (get-file-buffer tag-file))) 219 | 220 | ;;;###autoload 221 | (defun etags-select-find-tag-at-point () 222 | "Do a find-tag-at-point, and display all exact matches. If only one match is 223 | found, see the `etags-select-no-select-for-one-match' variable to decide what 224 | to do." 225 | (interactive) 226 | (etags-select-find (find-tag-default))) 227 | 228 | ;;;###autoload 229 | (defun etags-select-find-tag () 230 | "Do a find-tag, and display all exact matches. If only one match is 231 | found, see the `etags-select-no-select-for-one-match' variable to decide what 232 | to do." 233 | (interactive) 234 | (setq etags-select-source-buffer (buffer-name)) 235 | (let* ((default (find-tag-default)) 236 | (tagname (completing-read 237 | (format "Find tag (default %s): " default) 238 | 'etags-select-complete-tag nil nil nil 'find-tag-history default))) 239 | (etags-select-find tagname))) 240 | 241 | (defun etags-select-complete-tag (string predicate what) 242 | "Tag completion." 243 | (etags-select-build-completion-table) 244 | (if (eq what t) 245 | (all-completions string (etags-select-get-completion-table) predicate) 246 | (try-completion string (etags-select-get-completion-table) predicate))) 247 | 248 | (defun etags-select-build-completion-table () 249 | "Build tag completion table." 250 | (save-excursion 251 | (set-buffer etags-select-source-buffer) 252 | (let ((tag-files (etags-select-get-tag-files))) 253 | (mapcar (lambda (tag-file) (etags-select-get-tag-table-buffer tag-file)) tag-files)))) 254 | 255 | (defun etags-select-get-tag-files () 256 | "Get tag files." 257 | (if etags-select-use-xemacs-etags-p 258 | (buffer-tag-table-list) 259 | (mapcar 'tags-expand-table-name tags-table-list))) 260 | 261 | (defun etags-select-get-completion-table () 262 | "Get the tag completion table." 263 | (if etags-select-use-xemacs-etags-p 264 | tag-completion-table 265 | (tags-completion-table))) 266 | 267 | (defun etags-select-tags-completion-table-function () 268 | "Short tag name completion." 269 | (let ((table (make-vector 16383 0)) 270 | (tag-regex "^.*?\\(\^?\\(.+\\)\^A\\|\\<\\(.+\\)[ \f\t()=,;]*\^?[0-9,]\\)") 271 | (progress-reporter 272 | (make-progress-reporter 273 | (format "Making tags completion table for %s..." buffer-file-name) 274 | (point-min) (point-max)))) 275 | (save-excursion 276 | (goto-char (point-min)) 277 | (while (not (eobp)) 278 | (when (looking-at tag-regex) 279 | (intern (replace-regexp-in-string ".*[:.']" "" (or (match-string 2) (match-string 3))) table)) 280 | (forward-line 1) 281 | (progress-reporter-update progress-reporter (point)))) 282 | table)) 283 | 284 | (unless etags-select-use-xemacs-etags-p 285 | (defadvice etags-recognize-tags-table (after etags-select-short-name-completion activate) 286 | "Turn on short tag name completion (maybe)" 287 | (when etags-select-use-short-name-completion 288 | (setq tags-completion-table-function 'etags-select-tags-completion-table-function)))) 289 | 290 | (defun etags-select-find (tagname) 291 | "Core tag finding function." 292 | (let ((tag-files (etags-select-get-tag-files)) 293 | (tag-count 0)) 294 | (setq etags-select-source-buffer (buffer-name)) 295 | (get-buffer-create etags-select-buffer-name) 296 | (set-buffer etags-select-buffer-name) 297 | (setq buffer-read-only nil) 298 | (erase-buffer) 299 | (insert "Finding tag: " tagname "\n") 300 | (mapcar (lambda (tag-file) 301 | (setq tag-count (etags-select-insert-matches tagname tag-file tag-count))) 302 | tag-files) 303 | (cond ((= tag-count 0) 304 | (message (concat "No matches for tag \"" tagname "\"")) 305 | (ding)) 306 | ((and (= tag-count 1) etags-select-no-select-for-one-match) 307 | (setq etags-select-opened-window nil) 308 | (set-buffer etags-select-buffer-name) 309 | (goto-char (point-min)) 310 | (etags-select-next-tag) 311 | (etags-select-goto-tag)) 312 | (t 313 | (set-buffer etags-select-buffer-name) 314 | (goto-char (point-min)) 315 | (etags-select-next-tag) 316 | (set-buffer-modified-p nil) 317 | (setq buffer-read-only t) 318 | (setq etags-select-opened-window (selected-window)) 319 | (select-window (split-window-vertically)) 320 | (switch-to-buffer etags-select-buffer-name) 321 | (etags-select-mode tagname))))) 322 | 323 | (defun etags-select-goto-tag (&optional arg other-window) 324 | "Goto the file/line of the tag under the cursor. 325 | Use the C-u prefix to prevent the etags-select window from closing." 326 | (interactive "P") 327 | (let ((case-fold-search (etags-select-case-fold-search)) 328 | tagname tag-point text-to-search-for filename filename-point (search-count 1)) 329 | (save-excursion 330 | (goto-char (point-min)) 331 | (re-search-forward "Finding tag: \\(.*\\)$") 332 | (setq tagname (etags-select-match-string 1))) 333 | (beginning-of-line) 334 | (if (looking-at etags-select-non-tag-regexp) 335 | (message "Please put the cursor on a line with the tag.") 336 | (setq tag-point (point)) 337 | (setq overlay-arrow-position (point-marker)) 338 | (re-search-forward "\\]\\s-+\\(.+?\\)\\s-*$") 339 | (setq text-to-search-for (regexp-quote (etags-select-match-string 1))) 340 | (goto-char tag-point) 341 | (re-search-backward "^In: \\(.*\\)$") 342 | (setq filename (etags-select-match-string 1)) 343 | (setq filename-point (point)) 344 | (goto-char tag-point) 345 | (while (re-search-backward (concat "^.*?\\]\\s-+" text-to-search-for) filename-point t) 346 | (setq search-count (1+ search-count))) 347 | (goto-char tag-point) 348 | (unless arg 349 | (kill-buffer etags-select-buffer-name) 350 | (when etags-select-opened-window 351 | (delete-window (selected-window)) 352 | (select-window etags-select-opened-window))) 353 | (switch-to-buffer etags-select-source-buffer) 354 | (if etags-select-use-xemacs-etags-p 355 | (push-tag-mark) 356 | (ring-insert find-tag-marker-ring (point-marker))) 357 | (if other-window 358 | (find-file-other-window filename) 359 | (find-file filename)) 360 | (goto-char (point-min)) 361 | (while (> search-count 0) 362 | (unless (re-search-forward (concat "^\\s-*" text-to-search-for) nil t) 363 | (message "TAGS file out of date ... stopping at closest match") 364 | (setq search-count 1)) 365 | (setq search-count (1- search-count))) 366 | (beginning-of-line) 367 | (re-search-forward tagname) 368 | (goto-char (match-beginning 0)) 369 | (when etags-select-highlight-tag-after-jump 370 | (etags-select-highlight (match-beginning 0) (match-end 0)))))) 371 | 372 | (defun etags-select-highlight (beg end) 373 | "Highlight a region temporarily." 374 | (if (featurep 'xemacs) 375 | (let ((extent (make-extent beg end))) 376 | (set-extent-property extent 'face 'etags-select-highlight-tag-face) 377 | (sit-for etags-select-highlight-delay) 378 | (delete-extent extent)) 379 | (let ((ov (make-overlay beg end))) 380 | (overlay-put ov 'face 'etags-select-highlight-tag-face) 381 | (sit-for etags-select-highlight-delay) 382 | (delete-overlay ov)))) 383 | 384 | (defun etags-select-goto-tag-other-window (&optional arg) 385 | "Goto the file/line of the tag under the cursor in other window. 386 | Use the C-u prefix to prevent the etags-select window from closing." 387 | (interactive "P") 388 | (etags-select-goto-tag arg t)) 389 | 390 | (defun etags-select-next-tag () 391 | "Move to next tag in buffer." 392 | (interactive) 393 | (beginning-of-line) 394 | (when (not (eobp)) 395 | (forward-line)) 396 | (while (and (looking-at etags-select-non-tag-regexp) (not (eobp))) 397 | (forward-line)) 398 | (when (eobp) 399 | (ding))) 400 | 401 | (defun etags-select-previous-tag () 402 | "Move to previous tag in buffer." 403 | (interactive) 404 | (beginning-of-line) 405 | (when (not (bobp)) 406 | (forward-line -1)) 407 | (while (and (looking-at etags-select-non-tag-regexp) (not (bobp))) 408 | (forward-line -1)) 409 | (when (bobp) 410 | (ding))) 411 | 412 | (defun etags-select-quit () 413 | "Quit etags-select buffer." 414 | (interactive) 415 | (kill-buffer nil) 416 | (delete-window)) 417 | 418 | (defun etags-select-by-tag-number (first-digit) 419 | "Select a tag by number." 420 | (let ((current-point (point)) tag-num) 421 | (if (and etags-select-go-if-unambiguous (not (re-search-forward (concat "^" first-digit) nil t 2))) 422 | (setq tag-num first-digit) 423 | (setq tag-num (read-from-minibuffer "Tag number? " first-digit))) 424 | (goto-char (point-min)) 425 | (if (re-search-forward (concat "^" tag-num) nil t) 426 | (etags-select-goto-tag) 427 | (goto-char current-point) 428 | (message (concat "Couldn't find tag number " tag-num)) 429 | (ding)))) 430 | 431 | ;;; Keymap 432 | 433 | (defvar etags-select-mode-map nil "'etags-select-mode' keymap.") 434 | (if (not etags-select-mode-map) 435 | (let ((map (make-keymap))) 436 | (define-key map [(return)] 'etags-select-goto-tag) 437 | (define-key map [(meta return)] 'etags-select-goto-tag-other-window) 438 | (define-key map [(down)] 'etags-select-next-tag) 439 | (define-key map [(up)] 'etags-select-previous-tag) 440 | (define-key map "n" 'etags-select-next-tag) 441 | (define-key map "p" 'etags-select-previous-tag) 442 | (define-key map "q" 'etags-select-quit) 443 | (define-key map "0" (lambda () (interactive) (etags-select-by-tag-number "0"))) 444 | (define-key map "1" (lambda () (interactive) (etags-select-by-tag-number "1"))) 445 | (define-key map "2" (lambda () (interactive) (etags-select-by-tag-number "2"))) 446 | (define-key map "3" (lambda () (interactive) (etags-select-by-tag-number "3"))) 447 | (define-key map "4" (lambda () (interactive) (etags-select-by-tag-number "4"))) 448 | (define-key map "5" (lambda () (interactive) (etags-select-by-tag-number "5"))) 449 | (define-key map "6" (lambda () (interactive) (etags-select-by-tag-number "6"))) 450 | (define-key map "7" (lambda () (interactive) (etags-select-by-tag-number "7"))) 451 | (define-key map "8" (lambda () (interactive) (etags-select-by-tag-number "8"))) 452 | (define-key map "9" (lambda () (interactive) (etags-select-by-tag-number "9"))) 453 | (setq etags-select-mode-map map))) 454 | 455 | ;;; Mode startup 456 | 457 | (defun etags-select-mode (tagname) 458 | "etags-select-mode is a mode for browsing through tags.\n\n 459 | \\{etags-select-mode-map}" 460 | (interactive) 461 | (kill-all-local-variables) 462 | (setq major-mode 'etags-select-mode) 463 | (setq mode-name "etags-select") 464 | (set-syntax-table text-mode-syntax-table) 465 | (use-local-map etags-select-mode-map) 466 | (make-local-variable 'font-lock-defaults) 467 | (setq etags-select-mode-font-lock-keywords 468 | (list (list "^\\(Finding tag:\\)" '(1 font-lock-keyword-face)) 469 | (list "^\\(In:\\) \\(.*\\)" '(1 font-lock-keyword-face) '(2 font-lock-string-face)) 470 | (list "^[0-9]+ \\[\\(.+?\\)\\]" '(1 font-lock-type-face)) 471 | (list tagname '(0 font-lock-function-name-face)))) 472 | (setq font-lock-defaults '(etags-select-mode-font-lock-keywords)) 473 | (setq overlay-arrow-position nil) 474 | (run-hooks 'etags-select-mode-hook)) 475 | 476 | (provide 'etags-select) 477 | ;;; etags-select.el ends here 478 | -------------------------------------------------------------------------------- /elisp/framemove.el: -------------------------------------------------------------------------------- 1 | ;;; framemove.el --- directional frame selection routines 2 | ;; 3 | ;; Copyright (C) 2010 4 | ;; 5 | ;; Author: Trey Jackson (bigfaceworm@gmail.com) 6 | ;; Created: February 14, 2010 7 | ;; Keywords: frame, movement, convenience 8 | ;; 9 | ;; This file is not (yet) a part of GNU Emacs. 10 | ;; 11 | ;; Very much like the windmove package, only for frames. 12 | ;; Provide a simple set of keystrokes to move the input/focus 13 | ;; between windows. 14 | ;; 15 | ;; Version 0.9 16 | ;; 17 | ;; This software is licensed under the GPL version 3. 18 | ;; 19 | ;; To install: 20 | ;; (require 'framemove) 21 | ;; (framemove-default-keybindings) 22 | ;; 23 | ;; If you want to integrate framemove and windmove 24 | ;; You can omit the call to 'framemove-default-keybindings 25 | ;; And instead do: 26 | ;; (require 'framemove) 27 | ;; (windmove-default-keybindings) 28 | ;; (setq framemove-hook-into-windmove t) 29 | ;; 30 | ;; Compatibility: GNU Emacs 22.x, 23.x 31 | ;; 32 | 33 | (defvar framemove-hook-into-windmove nil 34 | "When non-nil, try moving frames if moving windows fails.") 35 | 36 | (defun fm-frame-bbox (frame) 37 | ;; eval b/c when things are beyond borders, you get 38 | ;; (+ -11) weirdness 39 | (let ((yl (eval (frame-parameter frame 'top))) 40 | (xl (eval (frame-parameter frame 'left)))) 41 | (list xl 42 | yl 43 | (+ xl (frame-pixel-width frame)) 44 | (+ yl (frame-pixel-height frame))))) 45 | 46 | (defun fm-opposite (dir) 47 | (cdr (assq dir '((left . right) (right . left) (up . down) (down . up))))) 48 | 49 | (defun fm-frame-coord (frame-or-box dir) 50 | (nth (cdr (assq dir '((left . 0) (up . 1) (right . 2) (down . 3)))) 51 | (if (framep frame-or-box) 52 | (fm-frame-bbox frame-or-box) 53 | frame-or-box))) 54 | 55 | (defun fm-frame-is-completly-to-dir-of (refframe dir otherframe) 56 | (cond 57 | ((eq refframe otherframe) 58 | nil) 59 | ((memq dir '(left up)) 60 | (< (fm-frame-coord refframe (fm-opposite dir)) (fm-frame-coord otherframe dir))) 61 | ((memq dir '(right down)) 62 | (> (fm-frame-coord refframe (fm-opposite dir)) (fm-frame-coord otherframe dir))) 63 | (t (error "Invalid direction of movement: %s" dir)))) 64 | 65 | (defun fm-frame-is-to-dir-of (refframe dir otherframe) 66 | (cond 67 | ((not (eq (frame-parameter refframe 'display) (frame-parameter otherframe 'display))) 68 | nil) 69 | ((eq refframe otherframe) 70 | nil) 71 | ((memq dir '(left up)) 72 | (< (fm-frame-coord refframe dir) (fm-frame-coord otherframe dir))) 73 | ((memq dir '(right down)) 74 | (> (fm-frame-coord refframe dir) (fm-frame-coord otherframe dir))) 75 | (t (error "Invalid direction of movement: %s" dir)))) 76 | 77 | (defun fm-absolute-coords-of-position (position) 78 | (let ((rel-x-y (fm-frame-relative-coordinates position)) 79 | (frame-bbox (fm-frame-bbox (window-frame (posn-window position))))) 80 | (cons (+ (car frame-bbox) (car rel-x-y)) 81 | (+ (cadr frame-bbox) (cdr rel-x-y))))) 82 | 83 | (defun fm-frame-relative-coordinates (position) 84 | "Return frame-relative coordinates from POSITION." 85 | (let* ((x-y (posn-x-y position)) 86 | (window (posn-window position)) 87 | (edges (window-inside-pixel-edges window))) 88 | (cons (+ (car x-y) (car edges)) 89 | (+ (cdr x-y) (cadr edges))))) 90 | 91 | (defun fm-project (coord frame dir) 92 | "project COORD in direction DIR to edge of FRAME" 93 | (if (memq dir '(up down)) 94 | (cons (car coord) 95 | (fm-frame-coord frame dir)) 96 | (cons (fm-frame-coord frame dir) 97 | (cdr coord)))) 98 | 99 | 100 | (defun fm-next-frame (dir) 101 | "move focus to next frame in direction (from currently focused frame)" 102 | (interactive (list 103 | (intern (completing-read "Which direction: " '("up" "down" "left" "right") nil t)))) 104 | (let* ((thisframe (selected-frame)) 105 | (current-coords (fm-absolute-coords-of-position (posn-at-point))) 106 | (coords-projected-in-dir (fm-project current-coords thisframe dir)) 107 | (possible-frames 108 | (sort 109 | (remove-if-not 110 | '(lambda (f) (fm-frame-is-to-dir-of f dir thisframe)) 111 | (visible-frame-list)) 112 | '(lambda (f1 f2) (fm-frame-is-to-dir-of f1 (fm-opposite dir) f2))))) 113 | (if possible-frames 114 | (let ((frames-in-line-of-cursor 115 | ;; try to find frame in line with cursor 116 | (remove-if-not 117 | '(lambda (f) (fm-coord-in-range current-coords dir f)) 118 | possible-frames)) 119 | (frames-in-line-of-frame 120 | ;; find frame that overlaps current frame 121 | ;; need to sort by distance from cursor 122 | (sort 123 | (remove-if-not 124 | '(lambda (f) (fm-range-overlap thisframe f dir)) 125 | possible-frames) 126 | '(lambda (f1 f2) 127 | (< (fm-dist-from-coords coords-projected-in-dir f1) 128 | (fm-dist-from-coords coords-projected-in-dir f2)))))) 129 | (select-frame-set-input-focus 130 | (or (car frames-in-line-of-cursor) 131 | (car frames-in-line-of-frame) 132 | (car possible-frames)))) 133 | (error "No frame in that direction")))) 134 | 135 | (defun fm-dist-from-coords (coord frame) 136 | "distance from coord to the bbox of the frame" 137 | (let* ((x (car coord)) 138 | (y (cdr coord)) 139 | (x-in-range (fm-v-in-range x (fm-bbox-range 'left frame))) 140 | (y-in-range (fm-v-in-range y (fm-bbox-range 'up frame))) 141 | (x-dist (min (abs (- x (fm-frame-coord frame 'left))) 142 | (abs (- x (fm-frame-coord frame 'right))))) 143 | (y-dist (min (abs (- y (fm-frame-coord frame 'up))) 144 | (abs (- y (fm-frame-coord frame 'down)))))) 145 | (cond ((and x-in-range y-in-range) 146 | 0) 147 | (x-in-range 148 | y-dist) 149 | (y-in-range 150 | x-dist) 151 | ((sqrt (+ (expt x-dist 2) 152 | (expt y-dist 2))))))) 153 | 154 | (defun fm-v-in-range (v range) 155 | (and (> v (car range)) 156 | (< v (cdr range)))) 157 | 158 | (defun fm-bbox-range (dir box) 159 | (if (memq dir '(up down)) 160 | (cons (fm-frame-coord box 'up) 161 | (fm-frame-coord box 'down)) 162 | (cons (fm-frame-coord box 'left) 163 | (fm-frame-coord box 'right)))) 164 | 165 | (defun fm-range-overlap (f1 f2 dir) 166 | "return true if the bbox'es of the two frames overlap using coords perpendicular to dir" 167 | (let ((perp (if (memq dir '(up down)) 'left 'up)) 168 | (f1box (fm-frame-bbox f1)) 169 | (f2box (fm-frame-bbox f2))) 170 | (or (fm-v-in-range (fm-frame-coord f1 perp) (fm-bbox-range perp f2)) 171 | (fm-v-in-range (fm-frame-coord f1 (fm-opposite perp)) (fm-bbox-range perp f2)) 172 | (fm-v-in-range (fm-frame-coord f2 perp) (fm-bbox-range perp f1)) 173 | (fm-v-in-range (fm-frame-coord f2 (fm-opposite perp)) (fm-bbox-range perp f1))))) 174 | 175 | (defun fm-coord-in-range (coord dir frame) 176 | "return true if the coord can be projected in orientation of dir 177 | onto the bbox of the frame, or more simply, is the part of the coord 178 | perpendicular to DIR between the edges of frame perpendicular to DIR" 179 | (let ((n (if (memq dir '(up down)) (car coord) (cdr coord))) 180 | (perp (if (memq dir '(up down)) 'left 'up))) 181 | (and (< (fm-frame-coord frame perp) n) 182 | (> (fm-frame-coord frame (fm-opposite perp)) n)))) 183 | 184 | (defun fm-sort-frames-by-edge (framelist dir) 185 | (sort 186 | framelist 187 | (lambda (f1 f2) 188 | (apply (symbol-function 189 | (if (memq dir '(left up)) '> '<)) 190 | (list (fm-frame-coord f1 dir) (fm-frame-coord f2 dir)))))) 191 | 192 | ;;;###autoload 193 | (defun fm-down-frame () 194 | (interactive) 195 | (fm-next-frame 'down)) 196 | ;;;###autoload 197 | (defun fm-up-frame () 198 | (interactive) 199 | (fm-next-frame 'up)) 200 | ;;;###autoload 201 | (defun fm-left-frame () 202 | (interactive) 203 | (fm-next-frame 'left)) 204 | ;;;###autoload 205 | (defun fm-right-frame () 206 | (interactive) 207 | (fm-next-frame 'right)) 208 | 209 | ;;;###autoload 210 | (defun framemove-default-keybindings (&optional modifier) 211 | "Set up keybindings for `framemove'. 212 | Keybindings are of the form MODIFIER-{left,right,up,down}. 213 | Default MODIFIER is 'meta." 214 | (interactive) 215 | (unless modifier (setq modifier 'meta)) 216 | 217 | (global-set-key (vector (list modifier 'down)) 'fm-down-frame) 218 | (global-set-key (vector (list modifier 'up)) 'fm-up-frame) 219 | (global-set-key (vector (list modifier 'left)) 'fm-left-frame) 220 | (global-set-key (vector (list modifier 'right)) 'fm-right-frame)) 221 | 222 | (defadvice windmove-do-window-select (around framemove-do-window-select-wrapper activate) 223 | "Let windmove do its own thing, if there is an error, try framemove in that direction." 224 | (condition-case err 225 | ad-do-it 226 | (error 227 | (if framemove-hook-into-windmove 228 | (fm-next-frame (ad-get-arg 0)) 229 | (error (error-message-string err)))))) 230 | 231 | (provide 'framemove) 232 | ;;; framemove.el ends here 233 | -------------------------------------------------------------------------------- /extra/plantuml-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plantuml-server", 3 | "description": "plantuml-server", 4 | "repository": "https://github.com/bling/dotemacs", 5 | "main": "server.js", 6 | "dependencies": { 7 | "express": "^4.13.4", 8 | "node-plantuml": "^0.4.4", 9 | "body-parser": "^1.15.0" 10 | }, 11 | "devDependencies": {}, 12 | "scripts": { 13 | "start": "node server.js" 14 | }, 15 | "license": "GPL-3.0" 16 | } 17 | -------------------------------------------------------------------------------- /extra/plantuml-server/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const plantuml = require('node-plantuml'); 4 | const Readable = require('stream').Readable; 5 | 6 | const app = express(); 7 | 8 | app.use(bodyParser.text()); 9 | 10 | plantuml.useNailgun(); 11 | 12 | app.post('/svg', function(req, res) { 13 | res.set('Content-Type', 'image/svg+xml'); 14 | 15 | const uml = new Readable(); 16 | uml.push(req.body); 17 | uml.push(null); 18 | 19 | const gen = plantuml.generate({format: 'svg'}); 20 | 21 | uml.pipe(gen.in); 22 | gen.out.pipe(res); 23 | }); 24 | 25 | app.listen(8182); 26 | -------------------------------------------------------------------------------- /init.el: -------------------------------------------------------------------------------- 1 | ;; -*- lexical-binding: t -*- 2 | 3 | (let ((emacs-start-time (current-time))) 4 | (add-hook 'emacs-startup-hook 5 | (lambda () 6 | (let ((elapsed (float-time (time-subtract (current-time) emacs-start-time)))) 7 | (message "[Emacs initialized in %.3fs]" elapsed))))) 8 | 9 | (let ((gc-cons-threshold (* 256 1024 1024)) 10 | (file-name-handler-alist nil) 11 | (core-directory (concat user-emacs-directory "core/")) 12 | (bindings-directory (concat user-emacs-directory "bindings/")) 13 | (config-directory (concat user-emacs-directory "config/"))) 14 | 15 | (when (fboundp 'tool-bar-mode) (tool-bar-mode -1)) 16 | (when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) 17 | (unless (display-graphic-p) (menu-bar-mode -1)) 18 | 19 | (defgroup dotemacs nil 20 | "Custom configuration for dotemacs." 21 | :group 'local) 22 | 23 | (defcustom dotemacs-cache-directory (concat user-emacs-directory ".cache/") 24 | "The storage location for various persistent files." 25 | :type 'directory 26 | :group 'dotemacs) 27 | 28 | (defcustom dotemacs-completion-engine 29 | 'corfu 30 | "The completion engine the use." 31 | :type '(radio 32 | (const :tag "corfu" corfu) 33 | (const :tag "company-mode" company) 34 | (const :tag "auto-complete-mode" auto-complete)) 35 | :group 'dotemacs) 36 | 37 | (defcustom dotemacs-switch-engine 38 | 'consult 39 | "The primary engine to use for narrowing and navigation." 40 | :type '(radio 41 | (const :tag "helm" helm) 42 | (const :tag "consult" consult) 43 | (const :tag "ido" ido) 44 | (const :tag "ivy" ivy)) 45 | :group 'dotemacs) 46 | 47 | (defcustom dotemacs-pair-engine 48 | 'emacs 49 | "The primary engine to use auto-pairing and parens matching." 50 | :type '(radio 51 | (const :tag "emacs" emacs) 52 | (const :tag "smartparens" smartparens)) 53 | :group 'dotemacs) 54 | 55 | (defcustom dotemacs-globally-ignored-directories 56 | '("elpa" ".cache" "target" "dist" "node_modules" ".git" ".hg" ".svn" ".idea") 57 | "A set of default directories to ignore for anything that involves searching." 58 | :type '(repeat string) 59 | :group 'dotemacs) 60 | 61 | (setq package-archives '(("melpa" . "https://melpa.org/packages/") 62 | ("org" . "https://orgmode.org/elpa/") 63 | ("gnu" . "https://elpa.gnu.org/packages/"))) 64 | (setq package-enable-at-startup nil) 65 | (package-initialize) 66 | 67 | (load (concat core-directory "core-boot")) 68 | 69 | (setq custom-file (concat user-emacs-directory "custom.el")) 70 | (when (file-exists-p custom-file) 71 | (load custom-file)) 72 | 73 | (cl-loop for file in (append (reverse (directory-files-recursively config-directory "\\.el$")) 74 | (reverse (directory-files-recursively bindings-directory "\\.el$"))) 75 | do (condition-case ex 76 | (load (file-name-sans-extension file)) 77 | ('error (with-current-buffer "*scratch*" 78 | (insert (format "[INIT ERROR]\n%s\n%s\n\n" file ex))))))) 79 | -------------------------------------------------------------------------------- /snippets/html-mode/a.yasnippet: -------------------------------------------------------------------------------- 1 | # name: a 2 | # key: a 3 | # -- 4 | $0 5 | -------------------------------------------------------------------------------- /snippets/html-mode/content.yasnippet: -------------------------------------------------------------------------------- 1 | # name: content 2 | # key: content 3 | # -- 4 | 5 | $0 6 | 7 | -------------------------------------------------------------------------------- /snippets/html-mode/div.yasnippet: -------------------------------------------------------------------------------- 1 | # name: div 2 | # key: div 3 | # -- 4 |
5 | $0 6 |
7 | -------------------------------------------------------------------------------- /snippets/html-mode/divc.yasnippet: -------------------------------------------------------------------------------- 1 | # name: divc 2 | # key: divc 3 | # -- 4 |
5 | $0 6 |
7 | -------------------------------------------------------------------------------- /snippets/html-mode/in.yasnippet: -------------------------------------------------------------------------------- 1 | # name: in 2 | # key: in 3 | # -- 4 | $0 5 | -------------------------------------------------------------------------------- /snippets/html-mode/script.yasnippet: -------------------------------------------------------------------------------- 1 | # name: script 2 | # key: script 3 | # -- 4 | $0 5 | -------------------------------------------------------------------------------- /snippets/html-mode/section.yasnippet: -------------------------------------------------------------------------------- 1 | # name: section 2 | # key: section 3 | # -- 4 |
5 | $0 6 |
7 | -------------------------------------------------------------------------------- /snippets/html-mode/t.yasnippet: -------------------------------------------------------------------------------- 1 | # name: create tag 2 | # key: t 3 | # -- 4 | <$1> 5 | $0 6 | 7 | -------------------------------------------------------------------------------- /snippets/html-mode/ta.yasnippet: -------------------------------------------------------------------------------- 1 | # name: create tag with attributes 2 | # key: ta 3 | # -- 4 | <$1 $2> 5 | $0 6 | 7 | -------------------------------------------------------------------------------- /snippets/js2-mode/.yas-parents: -------------------------------------------------------------------------------- 1 | js-mode 2 | -------------------------------------------------------------------------------- /snippets/js2-mode/cl.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: log 3 | # key: cl 4 | # -- 5 | console.log($1);$0 -------------------------------------------------------------------------------- /snippets/js2-mode/f.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: anonymous function 3 | # key: f 4 | # -- 5 | function $1($2) { 6 | $4 7 | }$3 -------------------------------------------------------------------------------- /snippets/js2-mode/fe.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: fe 3 | # key: fe 4 | # -- 5 | forEach(function ($1) { 6 | $0 7 | })$2 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/for.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: for 3 | # key: for 4 | # -- 5 | var ${1:i}, len = $3.length; 6 | for ($1 = ${2:0}; $1 < len; $1++) { 7 | $4 8 | } 9 | -------------------------------------------------------------------------------- /snippets/js2-mode/if.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: if 3 | # key: if 4 | # -- 5 | if (${1}) { 6 | $0 7 | } 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/ng1.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: ng injection 1 3 | # key: ng1 4 | # -- 5 | ['$1', function ($1) { 6 | $0 7 | }] 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/ng2.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: ng injection 2 3 | # key: ng2 4 | # -- 5 | ['$1', '$2', function ($1, $2) { 6 | $0 7 | }] 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/ng3.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: ng injection 3 3 | # key: ng3 4 | # -- 5 | ['$1', '$2', '$3', function ($1, $2, $3) { 6 | $0 7 | }] 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/ng4.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: ng injection 4 3 | # key: ng4 4 | # -- 5 | ['$1', '$2', '$3', '$4', function ($1, $2, $3, $4) { 6 | $0 7 | }] 8 | -------------------------------------------------------------------------------- /snippets/js2-mode/r.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: require 3 | # key: r 4 | # -- 5 | var ${1:$(s-lower-camel-case (file-name-nondirectory yas/text))} = require('$1');$0 -------------------------------------------------------------------------------- /snippets/js2-mode/r_.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: require lodash 3 | # key: r_ 4 | # -- 5 | var _ = require('lodash');$0 -------------------------------------------------------------------------------- /snippets/js2-mode/rjquery.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: require jquery 3 | # key: r$ 4 | # -- 5 | var $ = require('jquery');$0 -------------------------------------------------------------------------------- /snippets/js2-mode/us.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: use strict 3 | # key: us 4 | # -- 5 | 'use strict';$0 -------------------------------------------------------------------------------- /snippets/js2-mode/v.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: var 3 | # key: v 4 | # -- 5 | var $1 = $0 6 | -------------------------------------------------------------------------------- /snippets/js2-mode/while.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: while 3 | # key: while 4 | # -- 5 | 6 | while ($1) { 7 | $0 8 | } 9 | -------------------------------------------------------------------------------- /snippets/typescript-mode/cl.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: log 3 | # key: cl 4 | # -- 5 | console.log($1);$0 -------------------------------------------------------------------------------- /snippets/typescript-mode/component.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet; require-final-newline: nil -*- 2 | # name: react component 3 | # key: comp 4 | # -- 5 | export class ${1:Component} extends React.Component<${2:any}, ${3:any}> { 6 | render() { 7 | return ( 8 | $0 9 | ); 10 | } 11 | } -------------------------------------------------------------------------------- /snippets/typescript-mode/debugger.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet -*- 2 | # name: debugger 3 | # key: d 4 | # -- 5 | debugger;$0 -------------------------------------------------------------------------------- /snippets/typescript-mode/import-all.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet; require-final-newline: nil -*- 2 | # name: import all 3 | # key: ia 4 | # -- 5 | import * as ${1:name} from '${2:module}'; -------------------------------------------------------------------------------- /snippets/typescript-mode/import-default.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet; require-final-newline: nil -*- 2 | # name: import default 3 | # key: id 4 | # -- 5 | import ${1:name} from '${2:module}'; -------------------------------------------------------------------------------- /snippets/typescript-mode/import-exports.yasnippet: -------------------------------------------------------------------------------- 1 | # -*- mode: snippet; require-final-newline: nil -*- 2 | # name: import exports 3 | # key: i 4 | # -- 5 | import { ${1:members} } from '${2:module}'; -------------------------------------------------------------------------------- /snippets/web-mode/.yas-parents: -------------------------------------------------------------------------------- 1 | typescript-mode 2 | --------------------------------------------------------------------------------