+++ /dev/null
-/auto-save-list
-/games
-/.mc-lists.el
-/places
-/recentf
-/session.*
-/tramp
-/transient
[submodule "pkgbuild-mode"]
- path = packages/pkgbuild-mode
+ path = file-modes/pkgbuild-mode
url = https://github.com/juergenhoetzel/pkgbuild-mode.git
[submodule "yaml-mode"]
- path = packages/yaml-mode
+ path = file-modes/yaml-mode
url = https://github.com/yoshiki/yaml-mode.git
-[submodule "dockerfile-model"]
- path = packages/dockerfile-mode
- url = https://github.com/spotify/dockerfile-mode.git
[submodule "editorconfig"]
- path = packages/editorconfig
+ path = file-modes/editorconfig
url = https://github.com/editorconfig/editorconfig-emacs.git
-[submodule "coffee-mode"]
- path = packages/coffee-mode
- url = https://github.com/defunkt/coffee-mode
-[submodule "slime"]
- path = packages/slime
- url = https://github.com/slime/slime.git
-[submodule "flycheck"]
- path = packages/flycheck
- url = https://github.com/flycheck/flycheck
-[submodule "multiple-cursors"]
- path = packages/multiple-cursors
- url = https://github.com/magnars/multiple-cursors.el.git
[submodule "yasnippet"]
- path = packages/yasnippet
+ path = text-edit/yasnippet
url = https://github.com/joaotavora/yasnippet.git
[submodule "expand-region"]
- path = packages/expand-region
- url = https://github.com/magnars/expand-region.el.git
+ path = text-edit/expand-region
+ url = https://github.com/magnars/expand-region.el.git
[submodule "change-inner"]
- path = packages/change-inner
+ path = text-edit/change-inner
url = https://github.com/magnars/change-inner.el.git
-[submodule "js2-mode"]
- path = packages/js2-mode
- url = https://github.com/mooz/js2-mode.git
[submodule "dash"]
- path = packages/dash
+ path = utils/dash
url = https://github.com/magnars/dash.el.git
-[submodule "diminish"]
- path = packages/diminish
- url = https://github.com/myrjola/diminish.el.git
[submodule "git-modes"]
- path = packages/git-modes
+ path = file-modes/git-modes
url = https://github.com/magit/git-modes.git
-[submodule "json-mode"]
- path = packages/json-mode
- url = https://github.com/joshwnj/json-mode.git
-[submodule "json-snatcher"]
- path = packages/json-snatcher
- url = https://github.com/Sterlingg/json-snatcher.git
-[submodule "json-reformat"]
- path = packages/json-reformat
- url = https://github.com/gongo/json-reformat.git
-[submodule "swiper"]
- path = packages/swiper
- url = https://github.com/abo-abo/swiper.git
-[submodule "haskell-mode"]
- path = packages/haskell-mode
- url = https://github.com/haskell/haskell-mode.git
-[submodule "scala-mode"]
- path = packages/scala-mode
- url = https://github.com/ensime/emacs-scala-mode.git
-[submodule "groovy-modes"]
- path = packages/groovy-modes
- url = https://github.com/Groovy-Emacs-Modes/groovy-emacs-modes.git
-[submodule "dockerfile-mode"]
- path = packages/dockerfile-mode
- url = https://github.com/spotify/dockerfile-mode.git
[submodule "markdown-mode"]
- path = packages/markdown-mode
+ path = file-modes/markdown-mode
url = https://github.com/jrblevin/markdown-mode.git
-[submodule "direx"]
- path = packages/direx
- url = https://github.com/m2ym/direx-el.git
-[submodule "git-gutter"]
- path = packages/git-gutter
- url = https://github.com/syohex/emacs-git-gutter.git
-[submodule "shackle"]
- path = packages/shackle
- url = https://depp.brause.cc/shackle.git
[submodule "magit"]
- path = packages/magit
+ path = vc/magit
url = https://github.com/magit/magit.git
-[submodule "async"]
- path = packages/async
- url = https://github.com/jwiegley/emacs-async.git
[submodule "with-editor"]
- path = packages/with-editor
+ path = vc/with-editor
url = https://github.com/magit/with-editor.git
-[submodule "elisp-slime-nav"]
- path = packages/elisp-slime-nav
- url = https://github.com/purcell/elisp-slime-nav.git
[submodule "ssh-file-modes"]
- path = packages/ssh-file-modes
+ path = file-modes/ssh-file-modes
url = https://github.com/petere/emacs-ssh-file-modes.git
[submodule "jump-char"]
- path = packages/jump-char
+ path = text-edit/jump-char
url = https://github.com/lewang/jump-char.git
[submodule "highlight-symbol"]
- path = packages/highlight-symbol
- url = https://github.com/nschum/highlight-symbol.el.git
+ path = text-edit/highlight-symbol
+ url = https://github.com/nschum/highlight-symbol.el.git
[submodule "s"]
- path = packages/s
+ path = utils/s
url = https://github.com/magnars/s.el.git
-[submodule "js2-refactor"]
- path = packages/js2-refactor
- url = https://github.com/magnars/js2-refactor.el.git
-[submodule "wgrep"]
- path = packages/wgrep
- url = https://github.com/mhayashi1120/Emacs-wgrep.git
-[submodule "cl-closure-template"]
- path = packages/cl-closure-template
- url = https://github.com/archimag/cl-closure-template.git
[submodule "ledger-mode"]
- path = packages/ledger-mode
+ path = file-modes/ledger-mode
url = https://github.com/ledger/ledger-mode.git
[submodule "magit-popup"]
- path = packages/magit-popup
+ path = vc/magit-popup
url = https://github.com/magit/magit-popup.git
-[submodule "highlight-indent-guides"]
- path = packages/highlight-indent-guides
- url = https://github.com/DarthFennec/highlight-indent-guides.git
-[submodule "graphql"]
- path = packages/graphql
- url = https://github.com/vermiculus/graphql.el.git
-[submodule "treepy"]
- path = packages/treepy
- url = https://github.com/volrath/treepy.el
[submodule "magit-transient"]
- path = packages/magit-transient
+ path = vc/magit-transient
url = https://github.com/magit/transient.git
-[submodule "kotlin-mode"]
- path = packages/kotlin-mode
- url = https://github.com/Emacs-Kotlin-Mode-Maintainers/kotlin-mode
+[submodule "compat"]
+ path = utils/compat
+ url = https://github.com/emacs-compat/compat
+[submodule "vertico"]
+ path = completion/vertico
+ url = https://github.com/minad/vertico
+[submodule "orderless"]
+ path = completion/orderless
+ url = https://github.com/oantolin/orderless
+[submodule "marginalia"]
+ path = completion/marginalia
+ url = https://github.com/minad/marginalia
+[submodule "consult"]
+ path = completion/consult
+ url = https://github.com/minad/consult
+[submodule "diff-hl"]
+ path = vc/diff-hl
+ url = https://github.com/dgutov/diff-hl
+[submodule "dockerfile-mode"]
+ path = file-modes/dockerfile-mode
+ url = https://github.com/spotify/dockerfile-mode.git
-# ripgrep ignore file
-packages
+/completion/consult
+/completion/marginalia
+/completion/orderless
+/completion/vertico
+/file-modes/dockerfile-mode
+/file-modes/editorconfig
+/file-modes/git-modes
+/file-modes/ledger-mode
+/file-modes/markdown-mode
+/file-modes/pkgbuild-mode
+/file-modes/ssh-file-modes
+/file-modes/yaml-mode
+/text-edit/change-inner
+/text-edit/expand-region
+/text-edit/highlight-symbol
+/text-edit/jump-char
+/text-edit/yasnippet
+/utils/compat
+/utils/dash
+/utils/s
+/vc/diff-hl
+/vc/magit
+/vc/magit-popup
+/vc/magit-transient
+/vc/with-editor
# Help
```
+C-h . Help at point (Eldoc)
C-h C-h Help
C-h k Help about key binding
C-h v Describe variable
# Search
```
-C-s Search forward (ivy/swiper mode)
-C-r Resume ivy search
-C-7 Start a cursor for each result (while searching)
-C-' Switch to avy jump mode
-M-i Insert selected item (while searching)
-M-q Replace searched item (while searching)
-M-p Search for previous item (while searching)
-M-n Search for symbol at point (while searching)
-C-M-A Read Ivy action
-C-c C-o Dump all results into a buffer (ivy-occur)
-C-c C-p Switch to wgrep mode
+C-s Search forward (consult-line)
+C-r Resume vertico search
M-. Find thing at point
M-, Pop tag mark
+M-? Find references at point
```
# Files/buffers
C-x s Save some buffers
C-x C-w Write buffer to file
C-x C-f Find file
-C-x C-v Find file and kill current buffer
-C-x f Find files in git repository
-C-x g Grep in git repository
-M-q Replace in git repository (while in git grep)
-M-x find-file-at-point Find (open) filename at point
-M-x browse-url-at-point Browse URL at point
+C-x f Find files in project
+C-x g Grep in project
C-x k Kill buffer
C-x c Clean up all buffers that are not visible
-C-x b Select named buffer
-C-x C-b Show all buffers
+C-x b Switch to previous buffer
+C-x t Switch between matching prod/test file
+C-x C-b Show buffers
C-x C-r Show recent files
M-x scratch-buffer Create new scratch buffer
-//,~ Go to {root,home} directory in find-file
```
# Windows/frames
M-m Jump back to start of indentation
M-r Jump to window top/bottom/middle
M-g Tab Jump to column
-M-g f Jump to charactor, ;/, to go forward/back
+M-g c Jump to character location
+M-g f Jump to character, ;/, to go forward/back
+M-g i Show imenu overview of file
M-g g Jump to visible line or any line
-M-g j Jump to word by first character
-M-g M-g Jump to visible line or any line
+M-g p Previous error
+M-g n Next error
+M-g l Show all errors
C-a Beginning of line
C-e End of line
C-p Back one line
C-n Forward one line
C-b Back one character
-C-n Forward one character
+C-f Forward one character
M-b Back a word
M-f Forward a word
M-a Backward sentence
Tab Indent current line correctly
C-x Tab Indent region with left/right
M-/ Expand at point
+C-M-i Complete at point
M-Tab Auto-complete at point
M-; Comment line or region
M-i Change inner region
C-x C-x Exchange point and mark
C-M-h Highlight expression
M-@ Set mark at end of next word
-C-= Expand region
-M-= Display info about region
-C-. Go to last edit
-C-, Go to last edit reverse
+M-= Expand region
```
-# Multiple cursors
-```
-C-c m a Insert cursor at all matching points
-C-c m l Insert extra cursor on all lines in region
-C-c m m Ask to insert extra cursor at locations matching selected region
-C-c m p Add cursor at previous text like region
-C-c m n Add cursor at next text like region
-```
# Highlighting
```
C-k Kill to end of line
M-0 C-k Kill to beginning of line
C-c k Kill whole line
-C-c s Copy line
+C-c s Replace line
C-d Delete next character
M-d Delete next word
M-Backspace Delete previous word
-M-Space Collpase to one space around point
M-\ Delete spaces around point
C-x C-o Collapse blank lines
M-x delete-trailing-whitespace Delete trailing whitespace
# Mode switching
```
-C-x C-j Open direx at current file
+F7 Toggle flymake-mode
F8 Toggle flyspell-mode
F9 Toggle whitespace mode
F10 Toggle word wrap
M-s o Search in buffer and display results in occur-mode
M-x multi-occur Search in buffers and display results in occur-mode
M-x eshell Run eshell
-M-x ielm Run Emacs Lisp REPL
-M-x linum-mode Display line numbers
M-x overwrite-mode Switch to overwrite mode
M-x shell Run bash shell
-M-x slime Run Common Lisp REPL
M-x smerge-ediff Resolve merge conflicts in multi-window mode
M-x smerge-mode Resolve merge conflicts by hunks
M-x term Run terminal
g Reload
e Switch to edit mode
C-c C-c Switch back to occur mode
-M-g M-p Previous occurence
-M-g M-n Next occurence
```
-# Magit / Git gutter
-```
-C-c g d Popup diff
-C-c g p Previous hunk
-C-c g n Next hunk
-C-c g r Revert hunk
-C-c g s Magit status
-C-c g f Magit file specific commands
-C-c g g Magit dispatch popup
+# Magit / diff-hl
+```
+C-x v * Popup diff
+C-x v S Stage hunk
+C-x v [ Previous hunk
+C-x v ] Next hunk
+C-x v n Revert hunk
+C-x v s Magit status
+C-x v f Magit file specific commands
+C-x v g Magit dispatch popup
p Previous section
n Next section
M-p Previous sibling section
C-c M-k Compile (but not load) the current buffer's file
```
-
-# Javascript
-```
-C-c C-r Rename variable
-C-c C-c Find type
-C-c C-d Find docs
-```
-
-
# Shell
```
M-! Execute command
# Flyspell
```
M-$ Correct word
-C-M-i Automatically correct word
C-; Automatically correct last word
<mouse-2> Popup word correction
```
-
-# Flycheck
-```
-C-c ! v Verify setup
-C-c ! n Next error
-C-c ! p Previous error
-C-c ! l List errors
-C-c ! x Disable checker
-```
rm -rf .git/modules/<name>
# Updating
-git submodule foreach git fetch
+git submodule foreach git fetch --prune
git submodule foreach git diff origin/master --stat|cat
Set up Emacs daemon to autostart:
```
-mkdir -p ~/.config/autostart
-ln -sf ~/.dotfiles/.config/autostart/emacs.desktop ~/.config/autostart
-mkdir -p ~/.local/share/applications
-ln -sf ~/.dotfiles/.local/share/applications/emacs.desktop ~/.local/share/applications/
+systemctl --user enable --now emacs
```
--- /dev/null
+#!/bin/bash
+
+cd "$(dirname "$0")"
+
+function get_submodules {
+ awk -F'"' '/submodule/ {print $2}' | sort
+}
+
+echo '.gitmodules -> .git/config'
+diff -u <(get_submodules < .gitmodules) <(get_submodules < .git/config)
+
+echo '.gitmodules -> .git/modules'
+diff -u <(get_submodules < .gitmodules) <(ls .git/modules)
--- /dev/null
+Subproject commit 42aaed5cc85dfc21c9c31a43ccbf3db5b347e593
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(dolist (pkg '("~/.emacs.d/completion/vertico"
+ "~/.emacs.d/completion/vertico/extensions"
+ "~/.emacs.d/completion/orderless"
+ "~/.emacs.d/completion/marginalia"
+ "~/.emacs.d/completion/consult"))
+ (add-to-list 'load-path pkg))
+
+(require 'vertico)
+(require 'vertico-repeat)
+(vertico-mode 1)
+(add-hook 'minibuffer-setup-hook #'vertico-repeat-save)
+
+(require 'orderless)
+(setq completion-styles '(orderless basic)
+ completion-category-overrides '((file (styles basic partial-completion))))
+(setq orderless-component-separator 'orderless-escapable-split-on-space)
+(setq completion-ignore-case t)
+(setq orderless-smart-case t)
+
+(require 'marginalia)
+(marginalia-mode 1)
+
+(require 'consult)
+(require 'consult-imenu)
+(require 'consult-flymake)
+(setq completion-in-region-function 'consult-completion-in-region)
+
+(global-set-key (kbd "C-s") 'consult-line)
+(global-set-key (kbd "C-r") 'vertico-repeat)
+(global-set-key (kbd "C-x g") 'consult-ripgrep)
+(global-set-key (kbd "C-x C-b") 'consult-buffer)
+(global-set-key (kbd "C-x C-r") 'consult-recent-file)
+(global-set-key (kbd "M-g i") 'consult-imenu)
+(global-set-key (kbd "M-g g") 'consult-goto-line)
+(global-set-key (kbd "M-g M-g") 'consult-goto-line)
--- /dev/null
+Subproject commit ea356ebb1ddb8d6da78574b517155475cf52d46f
--- /dev/null
+Subproject commit b24748093b00b37c3a572c4909f61c08fa27504f
--- /dev/null
+Subproject commit 4a7da56b02c6aefff8f6b4574a530a7cb54bc21a
--- /dev/null
+Subproject commit 52c6c00da1d31c0b6c29c74335b3af63ed6bf06c
--- /dev/null
+Subproject commit 4b81a5992858cbf03bcd7ed6ef31e4be0b55a7c1
--- /dev/null
+Subproject commit 4a61a9b86df9c824a99c522f42d55e68faf85f91
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(dolist (pkg '("~/.emacs.d/file-modes/dockerfile-mode"
+ "~/.emacs.d/file-modes/editorconfig"
+ "~/.emacs.d/file-modes/git-modes"
+ "~/.emacs.d/file-modes/ledger-mode"
+ "~/.emacs.d/file-modes/markdown-mode"
+ "~/.emacs.d/file-modes/pkgbuild-mode"
+ "~/.emacs.d/file-modes/ssh-file-modes"
+ "~/.emacs.d/file-modes/yaml-mode"))
+ (add-to-list 'load-path pkg))
+
+;;;;;;;;;;;;;;;;;;;;
+;; Built-in modes ;;
+;;;;;;;;;;;;;;;;;;;;
+
+;; language servers
+(require 'eglot)
+(add-hook 'js-mode-hook #'eglot-ensure)
+(add-hook 'python-mode-hook #'eglot-ensure)
+
+;; documentation
+(require 'eldoc)
+(setq eldoc-echo-area-use-multiline-p nil)
+(setq eldoc-echo-area-prefer-doc-buffer t)
+(global-set-key (kbd "C-h .") 'eldoc-print-current-symbol-info)
+
+;; syntax checking
+(require 'flymake)
+(global-set-key (kbd "M-g n") #'flymake-goto-next-error)
+(global-set-key (kbd "M-g M-n") #'flymake-goto-next-error)
+(global-set-key (kbd "M-g p") #'flymake-goto-prev-error)
+(global-set-key (kbd "M-g M-p") #'flymake-goto-prev-error)
+(global-set-key (kbd "M-g l") #'flymake-show-buffer-diagnostics)
+(global-set-key (kbd "M-g M-l") #'flymake-show-buffer-diagnostics)
+
+(require 'cc-mode)
+(setq c-auto-align-backslashes nil)
+(setq c-default-style '((java-mode . "java")
+ (awk-mode . "awk")
+ (other . "stroustrup")))
+
+(require 'perl-mode)
+(setq perl-indent-level 4)
+(setq perl-continued-statement-offset 0)
+(setq perl-continued-brace-offset 0)
+(setq perl-brace-offset 0)
+(setq perl-brace-imaginary-offset 0)
+(setq perl-label-offset 0)
+(setq perl-indent-continued-arguments 4)
+
+(require 'python)
+(add-hook 'python-mode-hook
+ (lambda ()
+ (setq forward-sexp-function nil)
+ (set (make-local-variable 'python-indent-offset) 4)))
+
+(require 'sh-script)
+(setq sh-use-smie nil)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Third-party packages ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'dockerfile-mode)
+
+(require 'editorconfig)
+(setq editorconfig-mode-lighter "")
+(editorconfig-mode 1)
+
+(require 'git-modes)
+
+(require 'ledger-mode nil 'noerror)
+(add-to-list 'auto-mode-alist '("\\.ledger\\'" . ledger-mode))
+(setq ledger-post-amount-alignment-column 72)
+(setq ledger-reconcile-default-commodity "AUD")
+(setq ledger-clear-whole-transactions t)
+(setq org-read-date-prefer-future nil)
+(custom-set-faces
+ '(ledger-font-posting-account-face ((t (:inherit default)))))
+
+(require 'markdown-mode)
+(setq markdown-command "markdown_py -x markdown.extensions.smart_strong -x markdown.extensions.fenced_code -x markdown.extensions.nl2br")
+(add-to-list 'auto-mode-alist '("\\.mdown\\'" . markdown-mode) t)
+
+(require 'pkgbuild-mode)
+
+(require 'ssh-file-modes)
+
+(require 'yaml-mode)
--- /dev/null
+Subproject commit 11e748d4838d51772f531a75849349ed8cd939ed
--- /dev/null
+Subproject commit e096bb97a91fcd4dc2b46d8b6e093194b03b7364
--- /dev/null
+Subproject commit 9525be8ecbd3a0d0bc7cc27e6d0f403e111aa067
--- /dev/null
+Subproject commit 5b58248ab255dff6cfa4c4057a191bc4446ee5b6
;;; -*- lexical-binding: t -*-
-(require 'seq)
+;;;;;;;;;;;;;;;;
+;; Early init ;;
+;;;;;;;;;;;;;;;;
+
+(let ((dir "~/.cache/emacs/eln-cache/"))
+ (unless (file-accessible-directory-p dir)
+ (make-directory dir))
+ (startup-redirect-eln-cache dir))
+
+(let ((dir "~/.cache/emacs/saves/"))
+ (unless (file-accessible-directory-p dir)
+ (make-directory dir))
+ (setq auto-save-list-file-prefix dir))
+
+(let ((dir "~/.cache/emacs/backups/"))
+ (unless (file-accessible-directory-p dir)
+ (make-directory dir))
+ (setq backup-directory-alist `(("." . ,dir))))
+
+(setq save-place-file "~/.cache/emacs/places")
+
+(setq project-list-file "~/.cache/emacs/projects")
+
+(setq tramp-persistency-file-name "~/.cache/emacs/tramp")
+
+;;;;;;;;;;;;;;;;;;;;
+;; Visual options ;;
+;;;;;;;;;;;;;;;;;;;;
+
+(load-file "~/.emacs.d/pastels-on-dark-theme.el")
+(enable-theme 'pastels-on-dark)
+
+(setq default-frame-alist '((vertical-scroll-bars . nil)
+ (menu-bar-lines . 0)
+ (tool-bar-lines . 0)
+ (background-mode . dark)
+ (alpha . 95)
+ (font . "monospace 12")))
+
+(column-number-mode t)
+
+(line-number-mode t)
+
+(show-paren-mode t)
+
+(setq-default show-trailing-whitespace t)
+
+;; 256-color mode in screen terminals
+(add-to-list 'term-file-aliases
+ '("screen.xterm-256color" . "screen-256color"))
+
+;;;;;;;;;;;;;;;;;;;;;
+;; General options ;;
+;;;;;;;;;;;;;;;;;;;;;
+
+(add-hook 'text-mode-hook #'goto-address-mode)
+(add-hook 'prog-mode-hook #'goto-address-prog-mode)
+
+(global-auto-revert-mode 1)
+(setq global-auto-revert-non-file-buffers t)
+(setq auto-revert-verbose nil)
+
+(setq auto-save-interval 0)
+(setq auto-save-timeout 30)
+
+;; backup files - keep 10 numbered backups
+(setq backup-by-copying t)
+(setq delete-old-versions t)
+(setq kept-new-versions 10)
+(setq kept-old-versions 0)
+(setq vc-make-backup-files t)
+(setq version-control t)
+
+(setq create-lockfiles nil)
+
+(delete-selection-mode t)
+
+(setq disabled-command-function nil)
+
+(setq ediff-window-setup-function 'ediff-setup-windows-plain
+ ediff-split-window-function 'split-window-horizontally)
+
+(setq find-file-visit-truename t)
+
+(setq help-window-select t)
+
+(global-hl-line-mode 1)
+
+(setq mouse-1-click-follows-link nil)
+
+(setq mouse-wheel-scroll-amount '(3))
+(setq mouse-wheel-progressive-speed nil)
+
+(repeat-mode 1)
+
+(setq save-interprogram-paste-before-kill t)
+
+(save-place-mode 1)
+
+(setq scroll-conservatively 1)
+(setq scroll-margin 1)
+
+(setq shift-select-mode nil)
+
+(setq sentence-end-double-space nil)
+
+(setq undo-limit 10000000)
+(setq undo-strong-limit undo-limit)
+
+;; unique buffer names
+(setq uniquify-strip-common-suffix t)
+(setq uniquify-buffer-name-style 'post-forward)
+
+(setq vc-follow-symlinks t)
+
+(xterm-mouse-mode 1)
+
+(defalias 'yes-or-no-p 'y-or-n-p)
+
+;;;;;;;;;;;;;;;;;
+;; Keybindings ;;
+;;;;;;;;;;;;;;;;;
+
+(global-set-key (kbd "C-x f") 'project-find-file)
+
+;; Text formatting
+(global-set-key (kbd "M-;") 'comment-line)
+(global-set-key (kbd "C-c d") 'duplicate-dwim)
+(global-set-key (kbd "M-z") 'zap-up-to-char)
+(global-set-key (kbd "C-c k") 'kill-whole-line)
+
+;; Windows/frames
+(global-set-key (kbd "<C-up>") 'windmove-up)
+(global-set-key (kbd "<C-down>") 'windmove-down)
+(global-set-key (kbd "<C-left>") 'windmove-left)
+(global-set-key (kbd "<C-right>") 'windmove-right)
+
+;; Mode switching
+(global-set-key (kbd "<f7>") 'flymake-mode)
+(global-set-key (kbd "<f8>") 'flyspell-mode)
+(global-set-key (kbd "<f9>") 'whitespace-mode)
+(global-set-key (kbd "<f10>") 'toggle-truncate-lines)
+
+;; Disable some default bindings from the builtin mouse.el
+(global-set-key [C-down-mouse-1] nil)
+(global-set-key [C-down-mouse-2] nil)
+(global-set-key [C-down-mouse-3] nil)
+(global-set-key [S-down-mouse-1] nil)
+(global-set-key [S-down-mouse-2] nil)
+(global-set-key [S-down-mouse-3] nil)
+
+;; Disable suspend-frame, it's annoying
+(global-set-key (kbd "C-z") nil)
+(global-set-key (kbd "C-x C-z") nil)
+
+;;;;;;;;;;;;;;;;;;;
+;; Load packages ;;
+;;;;;;;;;;;;;;;;;;;
(defvar my/original-load-path load-path)
-(defun my/add-to-load-path (dirname)
- (and (file-accessible-directory-p dirname)
- (seq-filter (lambda (file)
- (string-match-p "\\.el$" file))
- (directory-files dirname))
- (add-to-list 'load-path dirname)))
-
-(defun my/setup-load-path ()
- (setq load-path my/original-load-path)
-
- (my/add-to-load-path "~/.emacs.d/lisp")
-
- (dolist (dirname (directory-files "~/.emacs.d/packages" 'full "^[^\\.]"))
- (my/add-to-load-path dirname)
- (my/add-to-load-path (concat dirname "/lisp")))
-
- (message "Set load-path: %S" load-path))
-
-
-(my/setup-load-path)
-
-(load-library "my-backups")
-(load-library "my-direx")
-(load-library "my-editing-defuns")
-(load-library "my-file-modes")
-(load-library "my-find-test-file")
-(load-library "my-flycheck")
-(load-library "my-frame-title")
-(load-library "my-gui")
-(load-library "my-ivy")
-(load-library "my-keys")
-(load-library "my-kill-buffers")
-(load-library "my-minor-modes")
-(load-library "my-recentf")
-(load-library "my-scratch")
-(load-library "my-shackle")
-(load-library "my-vc")
-
-(message "Successfully loaded init.el")
+(defun my/reset-load-path ()
+ (setq load-path my/original-load-path))
+
+(message "Loading packages...")
+(load-file "~/.emacs.d/utils/init.el")
+(load-file "~/.emacs.d/completion/init.el")
+(load-file "~/.emacs.d/text-edit/init.el")
+(load-file "~/.emacs.d/file-modes/init.el")
+(load-file "~/.emacs.d/vc/init.el")
+(message "Finished loading init.el")
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(setq create-lockfiles nil)
-
-
-(let ((dir "~/.cache/emacs/saves/"))
- (unless (file-accessible-directory-p dir)
- (make-directory dir))
-
- (setq auto-save-file-name-transforms `((".*" ,dir t)))
- (setq auto-save-interval 0)
- (setq auto-save-timeout 30))
-
-
-(let ((dir "~/.cache/emacs/backups/"))
- (unless (file-accessible-directory-p dir)
- (make-directory dir))
-
- (setq backup-directory-alist `(("." . ,dir)))
-
- (setq vc-make-backup-files t)
- (add-hook 'after-save-hook (lambda () (setq buffer-backed-up nil)))
-
- (setq backup-by-copying t)
- (setq version-control t)
- (setq kept-new-versions 10)
- (setq kept-old-versions 0)
- (setq delete-old-versions t))
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'direx)
-(require 'direx-project)
-(require 'dired-x)
-
-(defalias 'direx:find-item 'direx:find-item-other-window)
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(setq-default indent-tabs-mode nil)
-(setq-default require-final-newline t)
-
-(require 'cc-mode)
-(setq c-auto-align-backslashes nil)
-(setq c-default-style '((java-mode . "java")
- (awk-mode . "awk")
- (other . "stroustrup")))
-
-(require 'closure-template-html-mode)
-(setq sgml-basic-offset 4)
-
-(require 'coffee-mode)
-(setq coffee-tab-width 4)
-
-(require 'dockerfile-mode)
-
-(require 'git-modes)
-
-(require 'groovy-mode)
-(add-to-list 'auto-mode-alist '("\\.groovy\\'" . groovy-mode))
-
-(require 'haskell-mode)
-
-(require 'json-mode)
-(require 'js)
-(require 'js2-mode)
-(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
-(add-to-list 'interpreter-mode-alist '("node" . js2-mode))
-(setq js2-concat-multiline-strings 'eol)
-(setq js2-highlight-external-variables nil)
-(setq js2-mode-show-parse-errors nil)
-(setq js2-mode-show-strict-warnings nil)
-(setq js--declaration-keyword-re "x^") ; declarations should have normal indentation
-(setq js-indent-align-list-continuation nil)
-
-(add-hook 'js2-mode-hook #'js2-refactor-mode)
-
-(require 'js2-refactor)
-(js2r-add-keybindings-with-prefix "C-c C-m")
-(setq js2r-always-insert-parens-around-arrow-function-params t)
-(setq js2r-prefered-quote-type 2)
-
-(require 'kotlin-mode)
-
-(require 'ledger-mode nil 'noerror)
-(add-to-list 'auto-mode-alist '("\\.ledger\\'" . ledger-mode))
-(setq ledger-post-amount-alignment-column 72)
-(setq ledger-reconcile-default-commodity "AUD")
-(setq ledger-clear-whole-transactions t)
-(setq org-read-date-prefer-future nil)
-
-(require 'markdown-mode)
-(setq markdown-command "markdown_py -x markdown.extensions.smart_strong -x markdown.extensions.fenced_code -x markdown.extensions.nl2br")
-(add-to-list 'auto-mode-alist '("\\.mdown\\'" . markdown-mode) t)
-
-(require 'pkgbuild-mode)
-
-(require 'python)
-(add-hook 'python-mode-hook
- (lambda ()
- (setq forward-sexp-function nil)
- (set (make-local-variable 'python-indent-offset) 4)))
-
-
-(require 'scala-mode)
-
-(require 'slime)
-(setq inferior-lisp-program "sbcl")
-
-(require 'sh-script)
-(setq sh-use-smie nil)
-
-(require 'ssh-file-modes)
-
-(when (require 'stumpwm-mode nil 'noerror)
- (add-to-list 'auto-mode-alist '("/\\.stumpwmrc\\'" . stumpwm-mode)))
-
-(require 'wgrep)
-(setq wgrep-auto-save-buffer t)
-
-(require 'yaml-mode)
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'flycheck)
-
-(global-flycheck-mode 1)
-
-(setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc))
-
-(setq flycheck-emacs-lisp-load-path 'inherit)
-
-(add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules)
-
-(setq flycheck-indication-mode 'right-fringe)
-
-(define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow
- (vector #b00000000
- #b00000000
- #b00000000
- #b00000000
- #b00000000
- #b00011001
- #b00110110
- #b01101100
- #b11011000
- #b01101100
- #b00110110
- #b00011001
- #b00000000
- #b00000000
- #b00000000
- #b00000000
- #b00000000))
-
-(defun my/use-eslint-from-node-modules ()
- (let* ((root (locate-dominating-file
- (or (buffer-file-name) default-directory)
- "node_modules"))
- (eslint (and root
- (expand-file-name "node_modules/.bin/eslint" root))))
- (when (and eslint (file-executable-p eslint))
- (setq-local flycheck-javascript-eslint-executable eslint))))
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(menu-bar-mode -1)
-(tool-bar-mode -1)
-(scroll-bar-mode -1)
-
-(require 'pastels-on-dark-theme)
-(enable-theme 'pastels-on-dark)
-(setq frame-background-mode 'dark)
-
-(setq default-frame-alist '((vertical-scroll-bars)
- (background-mode . dark)
- (alpha . 95)
- (font . "monospace 12")))
-
-(require 'ansi-color)
-(setq ansi-color-names-vector
- '("#000000"
- "#fc391f"
- "#31e722"
- "#eaec23"
- "#4856f7"
- "#f935f8"
- "#14f0f0"
- "#e9ebeb"))
-(setq ansi-color-map (ansi-color-make-color-map))
-
-(add-to-list 'term-file-aliases
- '("screen.xterm-256color" . "screen-256color"))
-
-(setq scroll-conservatively 1)
-(setq scroll-margin 1)
-(setq mouse-wheel-scroll-amount '(3))
-(setq mouse-wheel-progressive-speed nil)
-
-(setq column-number-mode t)
-(setq line-number-mode t)
-
-(show-paren-mode t)
-
-(dolist (hook '(prog-mode-hook text-mode-hook))
- (add-hook hook (lambda ()
- (setq show-trailing-whitespace t))))
-
-(setq shift-select-mode nil)
-(delete-selection-mode t)
-(setq sentence-end-double-space nil)
-
-(require 'uniquify)
-(setq uniquify-strip-common-suffix t)
-(setq uniquify-buffer-name-style 'post-forward)
-
-(defalias 'yes-or-no-p 'y-or-n-p)
-
-(setq find-file-visit-truename t)
-
-(setq disabled-command-function nil)
-
-(setq save-interprogram-paste-before-kill t)
-
-(setq undo-limit 10000000)
-(setq undo-strong-limit undo-limit)
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'counsel)
-(require 'ivy)
-(require 'swiper)
-
-(ivy-mode 1)
-(counsel-mode 1)
-
-(setq ivy-wrap t)
-(setq ivy-extra-directories '("./"))
-(setq ivy-count-format "%d/%d ")
-(setq ivy-case-fold-search-default t)
-
-(setq counsel-find-file-at-point t)
-(setq counsel-find-file-ignore-regexp "\\(?:\\`[#.]\\)\\|\\(?:[#~]\\'\\)")
-
-(setq counsel-grep-base-command "grep -E -n -i -e %s %s")
-(setq counsel-rg-base-command "rg -S --no-heading --line-number --color never --hidden --ignore-file ~/.emacs.d/rg-ignore %s .")
-(defvar counsel-rg-files-command "rg --files --hidden --ignore-file ~/.emacs.d/rg-ignore")
-
-(defun counsel-rg-jump (&optional initial-input initial-directory)
- "Jump to a file below the current directory.
-List all files within the current directory or any of its subdirectories.
-INITIAL-INPUT can be given as the initial minibuffer input.
-INITIAL-DIRECTORY, if non-nil, is used as the root directory for search."
- (interactive
- (list nil
- (when current-prefix-arg
- (read-directory-name "From directory: "))))
- (counsel-require-program "rg")
- (let ((default-directory (or initial-directory
- (locate-dominating-file default-directory ".git")
- default-directory)))
- (ivy-read "rg --files: "
- (split-string
- (shell-command-to-string counsel-rg-files-command)
- "\n" t)
- :matcher #'counsel--find-file-matcher
- :initial-input initial-input
- :action (lambda (x)
- (with-ivy-window
- (find-file (expand-file-name x ivy--directory))))
- :preselect (counsel--preselect-file)
- :require-match 'confirm-after-completion
- :history 'file-name-history
- :keymap counsel-find-file-map
- :caller 'counsel-rg-jump)))
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-;; Disable suspend-frame, it's annoying
-(global-set-key (kbd "C-z") nil)
-(global-set-key (kbd "C-x C-z") nil)
-
-;; Search
-(global-set-key (kbd "C-s") 'counsel-grep-or-swiper)
-(global-set-key (kbd "C-r") 'ivy-resume)
-
-;; Files/buffers
-(global-set-key (kbd "C-x f") 'counsel-rg-jump)
-(global-set-key (kbd "C-x g") 'counsel-rg)
-(global-set-key (kbd "C-x l") 'counsel-locate)
-(global-set-key (kbd "C-x c") 'my/kill-buffers-not-in-frame)
-(global-set-key (kbd "C-x C-b") 'ibuffer)
-(global-set-key (kbd "C-x C-r") 'counsel-recentf)
-(global-set-key (kbd "C-x t") 'my/find-prod-or-test-file)
-(global-set-key (kbd "C-c g d") 'git-gutter:popup-hunk)
-(global-set-key (kbd "C-c g p") 'git-gutter:previous-hunk)
-(global-set-key (kbd "C-c g n") 'git-gutter:next-hunk)
-(global-set-key (kbd "C-c g r") 'git-gutter:revert-hunk)
-
-;; Windows/frames
-(global-set-key (kbd "C-x 9") 'my/window-resize-mode)
-(global-set-key (kbd "<C-up>") 'windmove-up)
-(global-set-key (kbd "<C-down>") 'windmove-down)
-(global-set-key (kbd "<C-left>") 'windmove-left)
-(global-set-key (kbd "<C-right>") 'windmove-right)
-
-;; Movement
-(global-set-key (kbd "M-g f") 'jump-char-forward)
-
-;; Text formatting
-(global-set-key (kbd "M-;") 'comment-line)
-(global-set-key (kbd "M-i") 'change-inner)
-(global-set-key (kbd "C-o") 'my/open-line-above)
-(global-set-key (kbd "M-o") 'my/open-line-below)
-(global-set-key (kbd "C-c c") 'my/copy-line)
-(global-set-key (kbd "C-c d") 'my/duplicate-line)
-
-;; Marking
-(global-set-key (kbd "M-=") 'er/expand-region)
-(global-set-key (kbd "C-c m a") 'mc/mark-all-dwim)
-(global-set-key (kbd "C-c m l") 'mc/edit-lines)
-(global-set-key (kbd "C-c m m") 'mc/mark-more-like-this-extended)
-(global-set-key (kbd "C-c m p") 'mc/mark-previous-like-this)
-(global-set-key (kbd "C-c m n") 'mc/mark-next-like-this)
-
-;; Killing and deleting
-(global-set-key (kbd "M-z") 'zap-up-to-char)
-(global-set-key (kbd "C-c k") 'kill-whole-line)
-(global-set-key (kbd "C-c s") 'my/substitute-line)
-
-;; Mode switching
-(global-set-key (kbd "C-x C-j") 'direx-project:jump-to-project-root-other-window)
-(global-set-key (kbd "C-c g s") 'magit-status)
-(global-set-key (kbd "C-c g g") 'magit-dispatch)
-(global-set-key (kbd "C-c g f") 'magit-file-dispatch)
-(global-set-key (kbd "<f8>") 'flyspell-mode)
-(global-set-key (kbd "<f9>") 'whitespace-mode)
-(global-set-key (kbd "<f10>") 'toggle-truncate-lines)
-
-;; Disable some default bindings from the builtin mouse.el
-(global-set-key [C-down-mouse-1] nil)
-(global-set-key [C-down-mouse-2] nil)
-(global-set-key [C-down-mouse-3] nil)
-(global-set-key [S-down-mouse-1] nil)
-(global-set-key [S-down-mouse-2] nil)
-(global-set-key [S-down-mouse-3] nil)
-
-
-(defun my/window-resize-mode ()
- (interactive)
- (message "Resize window with the arrow keys")
- (let ((keymap (make-sparse-keymap)))
- (define-key keymap [up] #'enlarge-window)
- (define-key keymap [down] #'shrink-window)
- (define-key keymap [left] #'shrink-window-horizontally)
- (define-key keymap [right] #'enlarge-window-horizontally)
- (set-transient-map keymap t)))
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'autorevert)
-(global-auto-revert-mode 1)
-(setq global-auto-revert-non-file-buffers t)
-(setq auto-revert-verbose nil)
-
-(require 'change-inner)
-
-(require 'editorconfig)
-(editorconfig-mode 1)
-
-(require 'elisp-slime-nav)
-(dolist (hook '(emacs-lisp-mode-hook ielm-mode-hook))
- (add-hook hook 'elisp-slime-nav-mode))
-
-(require 'expand-region)
-
-(require 'goto-addr)
-(add-hook 'text-mode-hook #'goto-address-mode)
-(add-hook 'prog-mode-hook #'goto-address-prog-mode)
-(setq goto-address-highlight-keymap
- (let ((m (make-sparse-keymap)))
- (define-key m (kbd "C-<mouse-1>") 'goto-address-at-point)
- ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25715
- (define-key m (kbd "<mouse-2>") 'ignore) ; fixes yank text bug for some reason
- (define-key m (kbd "C-c RET") 'goto-address-at-point)
- m))
-
-(require 'highlight-indent-guides)
-(add-hook 'prog-mode-hook 'highlight-indent-guides-mode)
-(setq highlight-indent-guides-method 'character)
-(setq highlight-indent-guides-responsive 'top)
-(setq highlight-indent-guides-auto-enabled nil)
-(set-face-foreground 'highlight-indent-guides-character-face "#333333")
-(set-face-foreground 'highlight-indent-guides-top-character-face "#726464")
-
-(require 'highlight-symbol)
-(add-hook 'prog-mode-hook #'highlight-symbol-mode)
-(add-hook 'prog-mode-hook #'highlight-symbol-nav-mode)
-(setq highlight-symbol-idle-delay 0.5)
-
-(require 'hl-line)
-(global-hl-line-mode)
-
-(require 'jump-char)
-
-(require 'flyspell)
-
-(require 'misc)
-
-(require 'multiple-cursors)
-
-(require 'saveplace)
-(setq-default save-place t)
-
-(require 'xt-mouse)
-(xterm-mouse-mode)
-
-(require 'yasnippet)
-(add-hook 'prog-mode-hook #'yas-minor-mode)
-(add-hook 'python-mode-hook
- (lambda () (set (make-local-variable 'yas-indent-line) 'fixed)))
-(yas-reload-all)
-
-(require 'diminish)
-(add-hook 'after-init-hook
- (lambda ()
- (diminish 'counsel-mode)
- (diminish 'editorconfig-mode)
- (diminish 'git-gutter-mode)
- (diminish 'highlight-symbol-mode)
- (diminish 'highlight-indent-guides-mode)
- (diminish 'ivy-mode)
- (diminish 'yas-minor-mode)))
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'recentf)
-
-(setq recentf-exclude (list
- "/\\.emacs\\.d/recentf$"
- "/\\.git/"))
-
-(setq recentf-max-saved-items 1000)
-
-(run-with-idle-timer 30 t #'my/recentf-periodic)
-
-(defvar my/recentf-list-prev nil)
-
-(defun my/recentf-periodic ()
- (when (my/recentf-has-changed)
- (my/with-inhibit-message #'recentf-cleanup)
- (when (equal recentf-list my/recentf-list-prev)
- (my/with-inhibit-message #'recentf-save-list)
- (setq my/recentf-list-prev recentf-list))))
-
-(defun my/recentf-has-changed ()
- (not (equal recentf-list my/recentf-list-prev)))
-
-(defun my/with-inhibit-message (function)
- (let ((old-inhibit-message inhibit-message))
- (setq inhibit-message t)
- (unwind-protect
- (funcall function)
- (setq inhibit-message old-inhibit-message))))
-
-(recentf-mode 1)
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'shackle)
-
-(defun my/shackle-rules ()
- (let ((rules-common
- '(((:custom buffer-file-name) :other t)
- (direx:direx-mode :align left :size 40 :select t)
- ("*Flycheck error messages*" :align below :size 15 :select nil)))
- (rules-wide
- '(("magit-.*-popup" :regexp t :align right :select t)
- ((magit-log-mode magit-status-mode) :align bottom :size 15 :select t)
- ((magit-diff-mode magit-revision-mode) :align right :size 80)))
- (rules-narrow-tall
- '(("magit-.*-popup" :regexp t :align bottom :select t)
- (magit-status-mode :align bottom :size 25 :select t)
- ((magit-diff-mode magit-revision-mode) :align bottom :size 25)))
- (rules-narrow-short
- '(("magit-.*-popup" :regexp t :align bottom :select t)
- (magit-status-mode :align bottom :size 0.8 :select t)
- ((magit-diff-mode magit-revision-mode) :align bottom :size 0.65))))
- (cond
- ((>= (frame-text-cols) 120)
- (append rules-common rules-wide))
- ((>= (frame-text-lines) 30)
- (append rules-common rules-narrow-tall))
- (t
- (append rules-common rules-narrow-short)))))
-
-(setq shackle-default-rule '(:align below :select t :size 15))
-
-(setq shackle-default-size 0.5)
-
-(defun shackle-match (buffer-or-name)
- (cl-loop for (condition . plist) in (my/shackle-rules)
- when (shackle--match buffer-or-name condition plist)
- return plist
- finally return shackle-default-rule))
-
-(shackle-mode)
+++ /dev/null
-;;; -*- lexical-binding: t -*-
-
-(require 'ediff)
-(setq ediff-window-setup-function 'ediff-setup-windows-plain
- ediff-split-window-function 'split-window-horizontally)
-
-
-(require 'git-gutter)
-
-(add-hook 'git-gutter:update-hooks 'magit-revert-buffer-hook)
-
-(setq git-gutter:ask-p nil)
-
-(defun git-gutter:popup-hunk (&optional diffinfo)
- "MODIFIED!! Popup current diff hunk. Removed the `save-window-excursion' so I can control it with shackle."
- (interactive)
- (git-gutter:awhen (or diffinfo
- (git-gutter:search-here-diffinfo git-gutter:diffinfos))
- (pop-to-buffer (git-gutter:update-popuped-buffer it))))
-
-(global-git-gutter-mode)
-
-
-(require 'magit)
-
-(setq magit-completing-read-function 'ivy-completing-read)
-(setq git-commit-finish-query-functions
- (delete #'git-commit-check-style-conventions git-commit-finish-query-functions))
-
-
-(require 'vc)
-(setq vc-follow-symlinks t)
-(setq vc-handled-backends nil)
+++ /dev/null
-Subproject commit d7e7f79ee42311a0187aa2ab4f4e2f8843fa28da
+++ /dev/null
-Subproject commit 42cad58aed2caec260f8e8ff61f78a7d3db72d1b
+++ /dev/null
-#!/bin/bash
-
-set -eu
-
-cd "$(dirname "$0")"
-
-grep submodule ../.git/config |cut -d'"' -f2|while read -r x; do ls "$x" &> /dev/null || echo ".git/config remove $x"; done
-
-find ../.git/modules/ -type d -name objects -printf '%h\n'|while read -r x; do x="$(basename "$x")"; ls "$x" &> /dev/null || echo "rm -rf .git/modules/$x"; done
+++ /dev/null
-Subproject commit f1983aa525045691e128027d2a2d74831c873d6e
+++ /dev/null
-Subproject commit 35a41c7d8233eac0b267d9593e67fb8b6235e134
+++ /dev/null
-Subproject commit 334a0b31cab6b42e4465ffdfc6f07c00cd227562
+++ /dev/null
-Subproject commit 6ec6ebc391371418efc6c98d70b013f34af5a2ee
+++ /dev/null
-Subproject commit a79bfdb5980cf6ed7bfb3b41ddc471a7b6c0ede4
+++ /dev/null
-Subproject commit 07dde72b0e356d772fb65b969bd6decfa166e4d7
+++ /dev/null
-Subproject commit 048c553999c90db0b6066b3ec647a79f4af9985d
+++ /dev/null
-Subproject commit 9ab52362600af9f97f1590f05a295538025170b3
+++ /dev/null
-Subproject commit 4b8322774d9c1d8b64a0049d1dbbc1e7ce80c1a0
+++ /dev/null
-Subproject commit 01396a5eff9fa494285e0d3139838231c05e3948
+++ /dev/null
-Subproject commit cca61a1c6b0c0fd6ecb1b0366711c618581eabb6
+++ /dev/null
-Subproject commit 14adca24eb6b0b4e311ad144c5d41972c6b044b2
+++ /dev/null
-Subproject commit e2b309689f4faf9225f290080f836e988c5a576d
+++ /dev/null
-Subproject commit 26da902d1158c0312628d57578109be54eca2415
+++ /dev/null
-Subproject commit 20f72ccc17c8233dbb7c94ebf52a2a59e7d97730
+++ /dev/null
-Subproject commit cf352c85cd15dd18aa096ba9d9ab9b7ab493e8f6
+++ /dev/null
-Subproject commit 29979e5f3301796ba606759e39ee0b1b6a2a24f3
+++ /dev/null
-Subproject commit a0977c4ce1918cc266db9d6cd7a2ab63f3a76b9a
+++ /dev/null
-Subproject commit 0e819e519ae17a2686e0881c4ca51fa873fa9b83
+++ /dev/null
-Subproject commit 8eb6668ed447988aea06467ba8f42e1f2178246f
+++ /dev/null
-Subproject commit b28d1c0670636da6db508d03872d96ffddbc10f2
+++ /dev/null
-Subproject commit 0e4bafb31d1fc2a0a420a521c2723d5526646c0b
+++ /dev/null
-Subproject commit 3495d1224ee73aa96c1d5bd131dc3a7f23d46336
+++ /dev/null
-Subproject commit d14c082354c796dd363550a03463e9382b7cfbf6
+++ /dev/null
-Subproject commit 1e090b0cd4ea58c9fb5e807e4ebd7bdb9a7b66ba
+++ /dev/null
-Subproject commit 051734091aba17a54af96b81beebdbfc84c26459
+++ /dev/null
-Subproject commit a9d7764f80b241978f3d4e76bc981ef10bab5d70
+++ /dev/null
-Subproject commit 8a5e95c8514315cb40c47f1acdb68a4ace921497
+++ /dev/null
-Subproject commit 43ba8b563bee3426cead0e6d4ddc09398e1a349d
+++ /dev/null
-Subproject commit 402d6df56457e9c512c3d77c7bcb0d04c77715f1
+++ /dev/null
-Subproject commit 1c88d2a2fdd2efb3e990da69d6fedeaee5ff71a2
+++ /dev/null
-Subproject commit 68c58c0194ff03cd147fcec99f0ee90ba9178875
+++ /dev/null
-Subproject commit e005666df39ca767e6d5ab71b1a55d8c08395259
+++ /dev/null
-Subproject commit 3ac940e97f3d03e48ca9d7fcd74916a9b01c72f3
+++ /dev/null
-Subproject commit f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f
+++ /dev/null
-Subproject commit 2848a90addae086b657605b84a7fbecf2c4c1c65
+++ /dev/null
-Subproject commit fc5e1c58f94472944c4aa838f00f6adcac6fa992
+++ /dev/null
-Subproject commit 5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6
'(lazy-highlight ((t (:background "#302733"))))
'(default (
(((type tty)) (:stipple nil :background nil :foreground nil :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :width normal))
- (((type graphic)) (:stipple nil :background "#211D1D" :foreground "#DADADA" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :width normal))
+ (((type graphic)) (:stipple nil :background "#000000" :foreground "#DADADA" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :width normal))
)))
+++ /dev/null
-.git
-.hg
-.svn
-CVS
--- /dev/null
+Subproject commit 1394f5c07a95a97e39d616a1d7054d7c9bc49ba3
--- /dev/null
+Subproject commit e8f4e0fe9c9a80a6a26e2b438502aba9a799d580
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(dolist (pkg '("~/.emacs.d/text-edit"
+ "~/.emacs.d/text-edit/change-inner"
+ "~/.emacs.d/text-edit/expand-region"
+ "~/.emacs.d/text-edit/highlight-symbol"
+ "~/.emacs.d/text-edit/jump-char"
+ "~/.emacs.d/text-edit/yasnippet"))
+ (add-to-list 'load-path pkg))
+
+;;;;;;;;;;;;;;;;;
+;; My packages ;;
+;;;;;;;;;;;;;;;;;
+
+(require 'my-buffer-navigation)
+(global-set-key (kbd "C-x b") 'my/switch-to-previous-buffer)
+
+(require 'my-find-test-file)
+(global-set-key (kbd "C-x t") 'my/find-prod-or-test-file)
+
+(require 'my-frame-title)
+(setq frame-title-format '((:eval (funcall #'my/generate-frame-title))))
+(setq icon-title-format frame-title-format)
+(add-to-list 'post-command-hook #'my/terminal-update-title)
+
+(require 'my-kill-buffers)
+(add-to-list 'delete-frame-functions #'my/kill-buffers-if-deleting-last-frame)
+(global-set-key (kbd "C-x c") 'my/kill-buffers-not-in-frame)
+
+(require 'my-line-editing)
+(global-set-key (kbd "C-o") 'my/open-line-above)
+(global-set-key (kbd "M-o") 'my/open-line-below)
+(global-set-key (kbd "C-c c") 'my/copy-line)
+(global-set-key (kbd "C-c s") 'my/substitute-line)
+
+(require 'my-new-scratch-buffer)
+
+(require 'my-recentf)
+(setq recentf-save-file "~/.cache/emacs/recentf")
+(setq recentf-exclude '("/\\.emacs\\.d/recentf$" "/\\.git/"))
+(setq recentf-max-saved-items 1000)
+(recentf-mode 1)
+(my/recentf-auto-cleanup-and-save)
+
+(require 'my-window-resize)
+(global-set-key (kbd "C-x 9") 'my/window-resize-mode)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Third-party packages ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'change-inner)
+(global-set-key (kbd "M-i") 'change-inner)
+
+(require 'expand-region)
+(global-set-key (kbd "M-=") 'er/expand-region)
+
+(require 'highlight-symbol)
+(add-hook 'prog-mode-hook #'highlight-symbol-mode)
+(add-hook 'prog-mode-hook #'highlight-symbol-nav-mode)
+(setq highlight-symbol-idle-delay 0.5)
+
+(require 'jump-char)
+(global-set-key (kbd "M-g f") 'jump-char-forward)
+
+(require 'yasnippet)
+(add-hook 'prog-mode-hook #'yas-minor-mode)
+(add-hook 'python-mode-hook
+ (lambda () (set (make-local-variable 'yas-indent-line) 'fixed)))
+(yas-reload-all)
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(defun my/switch-to-previous-buffer ()
+ (interactive)
+ (switch-to-buffer (other-buffer (current-buffer) 1)))
+
+(provide 'my-buffer-navigation)
;;; -*- lexical-binding: t -*-
(require 'cl-lib)
-(require 'counsel)
(defun my/prod-file-p (file)
(not (or (string-match-p "test" file)
(t (ivy-read "Find test file" results
:action #'counsel-git-action
:caller 'my/find-prod-or-test-file)))))
+
+(provide 'my-find-test-file)
;;; -*- lexical-binding: t -*-
-(setq frame-title-format '((:eval (funcall #'my/generate-frame-title))))
-
-(setq icon-title-format frame-title-format)
-
-(add-to-list 'post-command-hook #'my/terminal-update-title)
-
-
(defun my/generate-frame-title ()
- "Returns a string like 'filename (dirname) (hostname)'"
+ "Return a string like \"filename (dirname) (hostname)\"."
(let ((t-name
(if (buffer-file-name)
(file-name-nondirectory (buffer-file-name))
"If using a terminal frame then sends the escape codes to update the title."
(if (terminal-parameter (frame-terminal) 'terminal-initted)
(send-string-to-terminal (concat "\033]0;" (my/generate-frame-title) "\007"))))
+
+(provide 'my-frame-title)
;;; -*- lexical-binding: t -*-
-(add-to-list 'delete-frame-functions #'my/kill-buffers-if-deleting-last-frame)
-
(defun my/kill-buffers-if-deleting-last-frame (frame)
"Kill all buffers when closing the last frame"
(when (equal (list frame) (my/frame-list-ignoring-initial-frame))
(not (buffer-modified-p buffer))
(null (buffer-file-name buffer))))
(kill-buffer buffer)))
+
+(provide 'my-kill-buffers)
(line-beginning-position (+ 1 arg)))
(message "Copied %d lines" arg))
-(defun my/duplicate-line (arg)
- "Duplicate current line, leaving point in lower line. With ARG duplicates the line that many lines."
- (interactive "*p")
- (let* ((start (line-beginning-position 1))
- (end (line-beginning-position 2))
- (at-eof (= end (line-end-position) (point-max))))
- (kill-ring-save start end)
- (when at-eof
- (kill-append "\n" t))
- (save-mark-and-excursion
- (forward-line)
- (dotimes (ignored arg)
- (yank)))
- (forward-line)
- (back-to-indentation)))
-
(defun my/open-line-above (arg)
"Open a new line above point with indentation. With ARG insert that many lines."
(interactive "*p")
(kill-line arg))
(if (not (string-equal major-mode "fundamental-mode"))
(indent-for-tab-command)))
+
+(provide 'my-line-editing)
(setq initial-scratch-message nil)
(setq initial-major-mode 'emacs-lisp-mode)
-(defun my/scratch-buffer ()
+(defun my/new-scratch-buffer ()
"Create a new scratch buffer to work in. (could be *scratch* - *scratchX*)"
(interactive)
(let ((n 0)
(get-buffer bufname)))
(switch-to-buffer (get-buffer-create bufname))
(funcall initial-major-mode)))
+
+(provide 'my-new-scratch-buffer)
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+;; Auto-cleanup and auto-save with no (message)
+
+(defvar my/recentf-list-prev nil)
+
+(defun my/recentf-periodic ()
+ (when (not (equal recentf-list my/recentf-list-prev))
+ (let ((inhibit-message t)) (recentf-cleanup))
+ (let ((inhibit-message t)) (recentf-save-list))
+ (setq my/recentf-list-prev recentf-list)))
+
+(defun my/recentf-auto-cleanup-and-save ()
+ (run-with-idle-timer 30 t #'my/recentf-periodic))
+
+(provide 'my-recentf)
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(defun my/window-resize-mode ()
+ (interactive)
+ (message "Resize window with the arrow keys")
+ (let ((keymap (make-sparse-keymap)))
+ (define-key keymap [up] #'enlarge-window)
+ (define-key keymap [down] #'shrink-window)
+ (define-key keymap [left] #'shrink-window-horizontally)
+ (define-key keymap [right] #'enlarge-window-horizontally)
+ (set-transient-map keymap t)))
+
+(provide 'my-window-resize)
--- /dev/null
+Subproject commit 297546f0853a6a51f5b05e954d0c6aea8caa5ec2
--- /dev/null
+#!/bin/bash
+
+cd "$(dirname "$0")"
+find . -name .git -type f -printf '%h\n' | sed 's/^\.//' | sort > .ignore
--- /dev/null
+Subproject commit eb8fbfa5582a8e5880e2eaa66d15d498bca6a45a
--- /dev/null
+Subproject commit 13f9fcd09d40132e9e1346a69e7b293d835a85f2
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(dolist (pkg '("~/.emacs.d/utils/compat/"
+ "~/.emacs.d/utils/dash/"
+ "~/.emacs.d/utils/s/"))
+ (add-to-list 'load-path pkg))
--- /dev/null
+Subproject commit dda84d38fffdaf0c9b12837b504b402af910d01d
--- /dev/null
+Subproject commit b8b2727a72fdf64ac98e6cfa136a43cb0cacf72f
--- /dev/null
+;;; -*- lexical-binding: t -*-
+
+(dolist (pkg '("~/.emacs.d/vc/magit/lisp"
+ "~/.emacs.d/vc/magit-popup"
+ "~/.emacs.d/vc/magit-transient/lisp"
+ "~/.emacs.d/vc/with-editor/lisp"
+ "~/.emacs.d/vc/diff-hl"))
+ (add-to-list 'load-path pkg))
+
+(require 'diff-hl)
+(require 'diff-hl-show-hunk)
+(global-diff-hl-mode 1)
+
+(require 'magit)
+(setq transient-history-file "~/.cache/emacs/transient-history.el")
+(setq magit-completing-read-function 'ivy-completing-read)
+(setq git-commit-finish-query-functions
+ (delete #'git-commit-check-style-conventions git-commit-finish-query-functions))
+(global-set-key (kbd "C-x v s") 'magit-status)
+(global-set-key (kbd "C-x v v") 'magit-dispatch)
+(global-set-key (kbd "C-x v f") 'magit-file-dispatch)
--- /dev/null
+Subproject commit 54d37dc14c3f715dd0328a70bc65d63c54ee9613
--- /dev/null
+Subproject commit b14f44e91341ca70c21946baf70162dd13a30310
--- /dev/null
+Subproject commit d43db3c58c34d4dbc3ce6f68ec24fecf3452b20e