From 1eaae12207e1b7f2c7adac3c069814ad17ab6c1a Mon Sep 17 00:00:00 2001 From: Rui Silva Date: Wed, 20 Dec 2017 19:15:19 +0000 Subject: [PATCH 001/145] Fix private module readme's links --- modules/private/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/README.org b/modules/private/README.org index 1046141fa..b9723dbc7 100644 --- a/modules/private/README.org +++ b/modules/private/README.org @@ -5,4 +5,4 @@ Use this directory to store your private configuration modules. Mine is included as a reference. I recommend you neither delete nor rename it, to avoid merge conflicts upstream. ----- -You'll find [[/wiki/Customization][more information about customizing Doom]] on the [[/wiki][wiki]]. +You'll find [[https://github.com/hlissner/doom-emacs/wiki/Customization][more information about customizing Doom]] on the [[https://github.com/hlissner/doom-emacs/wiki][wiki]]. From bd1a4e31f6b47423ca3a87ec2fb20ad53f02f03a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 19:51:33 -0500 Subject: [PATCH 002/145] doctor: log! => section! --- bin/doom-doctor | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index a57693582..676e78355 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -75,7 +75,7 @@ (defmacro error! (&rest args) `(message (color 1 (color 31 ,@args)))) (defmacro warn! (&rest args) `(message (color 1 (color 33 ,@args)))) (defmacro success! (&rest args) `(message (color 1 (color 32 ,@args)))) -(defmacro log! (&rest args) `(if doom-debug-mode (message (color 34 ,@args)))) +(defmacro section! (&rest args) `(message (color 34 ,@args))) (defmacro explain! (&rest args) `(message (indented 2 (autofill ,@args)))) ;;; Polyfills @@ -120,7 +120,7 @@ ;; --- is emacs set up properly? ------------------------------ -(log! "test-emacs") +(section! "test-emacs") (check! (version< emacs-version "25.1") (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) (explain! @@ -133,13 +133,13 @@ ;; --- is the environment set up properly? -------------------- ;; windows? windows -(log! "test-windows") +(section! "test-windows") (check! (memq system-type '(windows-nt ms-dos cygwin)) (warn! "Warning: Windows detected") (explain! "DOOM was designed for MacOS and Linux. Expect a bumpy ride!")) ;; are all default fonts present -(log! "test-fonts") +(section! "test-fonts") (if (not (fboundp 'find-font)) (progn (warn! "Warning: unable to detect font") @@ -162,7 +162,7 @@ "case, ignore this warning.")))))) ;; gnutls-cli & openssl -(log! "test-gnutls") +(section! "test-gnutls") (cond ((executable-find "gnutls-cli")) ((executable-find "openssl") (let* ((output (shell-command-to-string "openssl ciphers -v")) @@ -198,7 +198,7 @@ "network, provider, government, neckbearded mother-in-laws, geeky roommates, " "or just about anyone who knows more about computers than you do!")))) -(log! "test-tls") +(section! "test-tls") (cond ((not (string-match-p "\\_" system-configuration-features)) (warn! "Warning: You didn't install Emacs with gnutls support") (explain! @@ -253,7 +253,7 @@ (error! "Nope!"))) ;; bsd vs gnu tar -(log! "test-tar") +(section! "test-tar") (let ((tar-bin (or (executable-find "gtar") (executable-find "tar")))) (if tar-bin From c3c5de93c7f6a8cc0ef4b825f99ad78d7306ee77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 19:52:06 -0500 Subject: [PATCH 003/145] doctor: rewrite TLS heuristics Fixes "peculiar error" in #175, #285, #288 --- bin/doom-doctor | 77 ++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 676e78355..7247bfd52 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -20,9 +20,10 @@ (defvar doom-errors 0) (defmacro check! (cond &rest body) (declare (indent defun)) - `(when ,cond - ,@body - (setq doom-errors (1+ doom-errors)))) + `(let ((it ,cond)) + (when it + ,@body + (setq doom-errors (1+ doom-errors))))) (defun indented (spc msg) (declare (indent defun)) @@ -57,17 +58,6 @@ "\n"))) (buffer-string))) -(defmacro wait-for! (var if-body &optional else-body) - (declare (indent defun)) - `(let ((i 0)) - (while (and (not ,var) - (< i 5)) - (sleep-for 1) - (setq i (1+ i))) - (if ,var - ,if-body - ,else-body))) - (defun color (code msg &rest args) (format "\e[%dm%s\e[%dm" code (apply #'format msg args) 0)) @@ -211,43 +201,40 @@ " brew tap d12frosted/emacs-plus" " brew install emacs-plus")))) + ((not (fboundp 'url-retrieve-synchronously)) + (error! "Can't find url-retrieve-synchronously function. Are you running Emacs 24+?")) + ((or (executable-find "gnutls-cli") (executable-find "openssl")) (let ((tls-checktrust t) (gnutls-verify-error t)) - (dolist (url '("https://elpa.gnu.org" - "https://melpa.org")) - (condition-case-unless-debug ex - (let (result) - (let ((inhibit-message t)) - (url-retrieve url (lambda (status &rest _) (setq result status)))) - (wait-for! result - (when (getenv "DEBUG") - (success! "Verified %s" (nth 2 (split-string url "/")))) - (signal 'timed-out url))) - ('timed-out - (error! "Timed out trying to contact %s" ex)) - ('error - (check! t - (error! "Rejected %s" url) - (explain! (pp-to-string ex)))))) + (dolist (url '("https://elpa.gnu.org" "https://melpa.org")) + (check! (condition-case-unless-debug e + (if (let ((inhibit-message t)) (url-retrieve-synchronously url)) + (ignore (success! "Validated %s" url)) + 'empty) + ('timed-out 'timeout) + ('error e)) + (pcase it + (`empty (error! "Couldn't reach %s" url)) + (`timeout (error! "Timed out trying to contact %s" ex)) + (_ + (error! "Failed to validate %s" url) + (when (getenv "DEBUG") + (explain! (pp-to-string it))))))) (dolist (url '("https://self-signed.badssl.com" "https://wrong.host.badssl.com/")) - (condition-case-unless-debug ex - (let (result) - (let ((inhibit-message t)) - (url-retrieve url (lambda (status &rest _) (setq result status)))) - (wait-for! result - (check! t - (warn! "Verified %s (this shouldn't happen!)" (nth 2 (split-string url "/"))) - (explain! (pp-to-string result))) - (signal 'timed-out url))) - ('timed-out - (error! "Timed out trying to contact %s" ex)) - ('error - (when (getenv "DEBUG") - (success! "Rejected %s (a good thing!)" url) - (explain! (pp-to-string ex)))))))) + (check! (condition-case-unless-debug e + (if (let ((inhibit-message t)) (url-retrieve-synchronously url)) + t + 'empty) + ('timed-out 'timeout) + ('error (ignore (success! "Successfully rejected %s" url)))) + (pcase it + (`empty (error! "Couldn't reach %s" url)) + (`timeout (error! "Timed out trying to contact %s" ex)) + (_ + (error! "Validated %s (this shouldn't happen!)" url))))))) (t (error! "Nope!"))) From 4af354c693a6ee4291f20e13b2b64628e18d6442 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 19:57:15 -0500 Subject: [PATCH 004/145] Fix doom/am-i-secure --- core/autoload/debug.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 77b48b4c5..0bffa5da3 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -65,7 +65,7 @@ selection of all minor-modes, active or not." in '("https://wrong.host.badssl.com/" "https://self-signed.badssl.com/") if (condition-case _e - (url-retrieve bad (lambda (_retrieved) t)) + (url-retrieve-synchronously bad) (error nil)) collect bad))) (error (format "tls seems to be misconfigured (it got %s)." From 4e83cd516c2b041cb0d168be5096e7859e3e202b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 20:07:46 -0500 Subject: [PATCH 005/145] Add unicode symbols to package management output --- core/autoload/packages.el | 13 ++++++------- core/core-packages.el | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 7fb7356ad..9cd1ab917 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -354,14 +354,14 @@ package.el as appropriate." (dolist (pkg packages) (message! "Installing %s" (car pkg)) (doom--condition-case! - (message! " %s%s" + (message! "%s%s" (cond ((and (package-installed-p (car pkg)) (not (doom-package-different-backend-p (car pkg)))) - (dark (white "ALREADY INSTALLED"))) + (dark (white "⚠ ALREADY INSTALLED"))) ((doom-install-package (car pkg) (cdr pkg)) - (green "DONE")) + (green "✓ DONE")) (t - (red "FAILED"))) + (red "✕ FAILED"))) (if (plist-member (cdr pkg) :pin) (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) ""))))) @@ -404,8 +404,7 @@ package.el as appropriate." (message! (let ((result (doom-update-package (car pkg) t))) (color (if result 'green 'red) - " %s" - (if result "DONE" "FAILED")))))) + (if result "✓ DONE" "✕ FAILED")))))) (message! (bold (green "Finished!"))) (doom//reload-load-path))))) @@ -446,7 +445,7 @@ package.el as appropriate." (let ((result (doom-delete-package pkg t))) (color (if result 'green 'red) "%s %s" - (if result "Removed" "Failed to remove") + (if result "✓ Removed" "✕ Failed to remove") pkg))))) (message! (bold (green "Finished!"))) diff --git a/core/core-packages.el b/core/core-packages.el index e7013fbc4..0905da477 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -572,11 +572,11 @@ This should be run whenever init.el or an autoload file is modified. Running (message "Deleted old autoloads.el")) (dolist (file (reverse targets)) (message (cond ((not (doom-packages--read-if-cookies file)) - "Ignoring %s") + "⚠ Ignoring %s") ((update-file-autoloads file nil doom-autoload-file) - "Nothing in %s") + "✕ Nothing in %s") (t - "Scanned %s")) + "✓ Scanned %s")) (file-relative-name file doom-emacs-dir))) (let ((buf (get-file-buffer doom-autoload-file)) current-sexp) @@ -657,13 +657,13 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (short-name (file-relative-name target doom-emacs-dir))) (cl-incf (cond ((eq result 'no-byte-compile) - (message! (dark (white "Ignored %s" short-name))) + (message! (dark (white "⚠ Ignored %s" short-name))) total-noop) ((null result) - (message! (red "Failed to compile %s" short-name)) + (message! (red "✕ Failed to compile %s" short-name)) total-fail) (t - (message! (green "Compiled %s" short-name)) + (message! (green "✓ Compiled %s" short-name)) (quiet! (load target t t)) total-ok)))))) (message! From 34c74d2d5c682b605f10dc0598ab5de3ab8c2db8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 20:10:14 -0500 Subject: [PATCH 006/145] doom//packages-install: fix skipped cleanup code --- core/autoload/packages.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 9cd1ab917..cea192d69 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -364,10 +364,10 @@ package.el as appropriate." (red "✕ FAILED"))) (if (plist-member (cdr pkg) :pin) (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) - ""))))) + "")))) - (message! (bold (green "Finished!"))) - (doom//reload-load-path)))) + (message! (bold (green "Finished!"))) + (doom//reload-load-path))))) ;;;###autoload (defun doom//packages-update () From 27a229ec9be64fb0b0c73849fe49fa07cf12af4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Dec 2017 20:10:45 -0500 Subject: [PATCH 007/145] lang/org: use emacsmirror for org-plus-contrib --- modules/lang/org/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 84999f094..b04980c74 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -5,7 +5,7 @@ ;; this module requires). orgmode.org offers no secure access to this repo. If ;; this bothers you, comment out this `package!' block and download ;; org-plus-contrib from orgmode.org. -(package! org-plus-contrib :recipe (:fetcher git :url "http://orgmode.org/org-mode.git")) +(package! org-plus-contrib :recipe (:fetcher github :repo "emacsmirror/org" :files (:defaults "contrib/lisp/*.el"))) (package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) (package! toc-org) From 961a55e764e68ff2f11e0a8ba12c7297c2311f75 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Dec 2017 01:35:59 -0500 Subject: [PATCH 008/145] Activate insert-mode in git-commit-mode #282 --- modules/feature/version-control/+git.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 4467441bf..8a8770880 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,6 +1,10 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- ;;;###if (not (featurep! -git)) +(when (featurep! :feature evil) + (add-hook 'git-commit-mode-hook #'evil-insert-state)) + + (def-package! gitconfig-mode :mode "/\\.?git/?config$" :mode "/\\.gitmodules$") From 98e324b7856832282e412e233fa3cda2445afcc4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 04:02:47 -0500 Subject: [PATCH 009/145] Fix 'not installed' errors for built-in packages #288 Caused by doom-package-backend not taking into account that a package could be built-in. Derp! --- core/autoload/packages.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index cea192d69..80f863f37 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -170,7 +170,8 @@ Used by `doom//packages-autoremove'." (append (mapcar #'car doom-packages) doom-core-packages))) (append (package--removable-packages) (cl-loop for pkg in package-selected-packages - if (doom-package-different-backend-p pkg) + if (and (doom-package-different-backend-p pkg) + (not (package-built-in-p pkg))) collect pkg)))) ;;;###autoload From a5596c89233d032bf3091191f04c0bcf26d7a988 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 14:30:31 -0500 Subject: [PATCH 010/145] Ensure doom-autoload-file directory exists first --- core/core-packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-packages.el b/core/core-packages.el index 0905da477..cb15b90a7 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -578,6 +578,7 @@ This should be run whenever init.el or an autoload file is modified. Running (t "✓ Scanned %s")) (file-relative-name file doom-emacs-dir))) + (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (get-file-buffer doom-autoload-file)) current-sexp) (unwind-protect From 6343e8ad853160ddcb416d4f15735e0dc5cee1c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 14:48:07 -0500 Subject: [PATCH 011/145] (BREAKING) Don't host-namespace local files Local cache and data files were stored in a parent folder named after your host, because I'd symlink the same config across computers via dropbox. This would cause byte-compile issues in packages, so I stopped doing this. Now that each computer gets its own clone, host-namespaced local directories are unnecessary. There's no other benefit to having them. --- core/core-packages.el | 2 +- core/core.el | 33 ++++++++++++--------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index cb15b90a7..ad1a4057e 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -140,7 +140,7 @@ startup." (setq load-path doom--base-load-path package-activated-list nil) ;; Ensure core folders exist - (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir package-user-dir)) + (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) (unless (file-directory-p dir) (make-directory dir t))) (condition-case _ (package-initialize t) diff --git a/core/core.el b/core/core.el index f3eaa03bd..cdbba0337 100644 --- a/core/core.el +++ b/core/core.el @@ -25,7 +25,7 @@ "If non-nil, all doom functions will be verbose. Set DEBUG=1 in the command line or use --debug-init to enable this.") -(defvar doom-emacs-dir (expand-file-name user-emacs-directory) +(defvar doom-emacs-dir (file-truename user-emacs-directory) "The path to this emacs.d directory.") (defvar doom-core-dir (concat doom-emacs-dir "core/") @@ -34,38 +34,29 @@ line or use --debug-init to enable this.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") "Where configuration modules are stored.") - -;; Multi-host directories: I namespace `doom-etc-dir' and `doom-cache-dir' with -;; host names because I use the same (often symlinked) emacs.d across several -;; computers -- often simultaneously. Cache or other temporary files would -;; conflict otherwise. - (defvar doom-local-dir (concat doom-emacs-dir ".local/") "Root directory for local Emacs files. Use this as permanent storage for files that are safe to share across systems (if this config is symlinked across several computers).") -(defvar doom-host-dir (concat doom-local-dir "@" (system-name)) - "Directory for hostname-specific file storage. Used by `doom-etc-dir' and -`doom-cache-dir'.") +(defvar doom-etc-dir (concat doom-local-dir "etc/") + "Directory for non-volatile storage. For volatile story, see `doom-cache-dir'. -(defvar doom-etc-dir (concat doom-host-dir "/etc/") - "Host-namespaced directory for non-volatile storage. These are not deleted or -tampored with by DOOM functions. Use this for dependencies like servers or -config files that are stable (i.e. it should be unlikely that you need to delete -them if something goes wrong).") +Use this for dependencies like servers or config files that are stable (i.e. it +should be unlikely that you need to delete them if something goes wrong).") -(defvar doom-cache-dir (concat doom-host-dir "/cache/") - "Host-namespaced directory for volatile storage. Deleted when `doom/reset' is -called. Use this for transient files that are generated on the fly like caches -and temporary files. Anything that may need to be cleared if there are -problems.") +(defvar doom-cache-dir (concat doom-local-dir "cache/") + "Directory for volatile storage. + +Deleted when `doom/reset' is called. Use this for transient files; on-the-fly +like caches and temporary files. Anything that you don't mind deleting if there +are problems.") (defvar doom-packages-dir (concat doom-local-dir "packages/") "Where package.el and quelpa plugins (and their caches) are stored.") (defvar doom-autoload-file (concat doom-local-dir "autoloads.el") - "Location of the autoloads file generated by `doom/reload-autoloads'.") + "Where `doom//reload-autoloads' will generate its autoloads file.") (defgroup doom nil "DOOM Emacs, an Emacs configuration for a stubborn, shell-dwelling and From e9f34d8bdb1d4505b1e9a6f43e08d8edc107c8b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 14:53:17 -0500 Subject: [PATCH 012/145] core-package tests: ensure quelpa-dir is set properly --- core/test/autoload-package.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el index 23db6873e..ddd6ef85f 100644 --- a/core/test/autoload-package.el +++ b/core/test/autoload-package.el @@ -12,6 +12,7 @@ affects your Emacs packages)." (doom-etc-dir (concat doom-local-dir "etc/")) (doom-cache-dir (concat doom-local-dir "cache/")) (package-user-dir (expand-file-name "elpa" doom-packages-dir)) + (quelpa-dir (expand-file-name "quelpa" doom-packages-dir)) package-alist package-archive-contents package-initialize) From a74218f490908ca525e40ca246d1bdc85062e9e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:17:03 -0500 Subject: [PATCH 013/145] lang/java: remove redundant server-install code + minor refactor meghanada-mode already auto-installs the server. It doesn't need our help. --- modules/lang/java/+meghanada.el | 11 ++--------- modules/lang/java/config.el | 2 ++ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 4b7fe91cf..70fc4d404 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -10,19 +10,12 @@ meghanada-use-eldoc t meghanada-use-auto-start t) - (add-hook 'java-mode-hook #'rainbow-delimiters-mode) - - ;; Setup on first use - (unless (bound-and-true-p byte-compile-current-file) - (meghanada-install-server) - (if (file-exists-p (meghanada--locate-server-jar)) - (add-hook! 'meghanada-mode-hook #'(flycheck-mode eldoc-mode)) - (warn "java-mode: meghanada-server not installed, java-mode will run with reduced functionality"))) - (set! :jump 'java-mode :definition #'meghanada-jump-declaration :references #'meghanada-reference) + (add-hook! 'meghanada-mode-hook #'(flycheck-mode eldoc-mode)) + ;; (def-menu! +java/refactor-menu "Refactoring commands for `java-mode' buffers." diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index e96aaee00..8194c7923 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -1,5 +1,7 @@ ;;; lang/java/config.el -*- lexical-binding: t; -*- +(add-hook 'java-mode-hook #'rainbow-delimiters-mode) + (cond ((featurep! +meghanada) (load! +meghanada)) ((featurep! +eclim) ; FIXME lang/java +eclim ;;(load! +eclim) From a2ab90300359f922d09edd07f322e5f1bcc229ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:19:08 -0500 Subject: [PATCH 014/145] Only reset gc-cons-threshold during user startup --- core/core.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index cdbba0337..fbb63263a 100644 --- a/core/core.el +++ b/core/core.el @@ -162,9 +162,10 @@ ability to invoke the debugger in debug mode." ;; Initialize (eval-and-compile (defvar doom--file-name-handler-alist file-name-handler-alist) - (setq gc-cons-threshold 402653184 - gc-cons-percentage 0.6 - file-name-handler-alist nil) + (unless (or after-init-time noninteractive) + (setq gc-cons-threshold 402653184 + gc-cons-percentage 0.6 + file-name-handler-alist nil)) (require 'core-packages (concat doom-core-dir "core-packages")) (eval-when-compile From 02c14f560d07ca0c95ce709c65a853945601af63 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:21:36 -0500 Subject: [PATCH 015/145] Refactor bootstrap process + add doom-initialize-load-path --- core/core-lib.el | 1 - core/core-packages.el | 58 +++++++++++++++++++------------------------ core/core.el | 34 ++++++++++++------------- 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 4bf932203..d812d2b3e 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,6 +1,5 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(require 'cl-lib) (require 'subr-x) (load "async-autoloads" nil t) (load "persistent-soft-autoloads" nil t) diff --git a/core/core-packages.el b/core/core-packages.el index ad1a4057e..39bf222f0 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -51,11 +51,6 @@ "Non-nil if doom is done initializing (once `doom-post-init-hook' is done). If this is nil after Emacs has started something is wrong.") -(defvar doom-package-init-p nil - "If non-nil, doom's package system has been initialized (by -`doom-initialize'). This will be nill if you byte-compile your configuration (as -intended).") - (defvar doom-init-time nil "The time it took, in seconds, for DOOM Emacs to initialize.") @@ -136,18 +131,33 @@ are installed. If you byte-compile core/core.el, this function will be avoided to speed up startup." ;; Called early during initialization; only use native functions! - (when (or (not doom-package-init-p) force-p) + (when (or force-p (not doom-init-p)) (setq load-path doom--base-load-path package-activated-list nil) ;; Ensure core folders exist (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) (unless (file-directory-p dir) (make-directory dir t))) + ;; Ensure core packages are installed (condition-case _ (package-initialize t) - ('error - (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize t))) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize t))) + (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) + (when core-packages + (message "Installing core packages") + (package-refresh-contents) + (dolist (package core-packages) + (let ((inhibit-message t)) + (package-install package)) + (if (package-installed-p package) + (message "✓ Installed %s" package) + (error "✕ Couldn't install %s" package))) + (message "Installing core packages...done"))) + (setq doom-init-p t))) + +(defun doom-initialize-load-path (&optional force-p) + (when (or force-p (not doom--package-load-path)) ;; We could let `package-initialize' fill `load-path', but it does more than ;; that alone (like load autoload files). If you want something prematurely ;; optimizated right, ya gotta do it yourself. @@ -155,23 +165,7 @@ startup." ;; Also, in some edge cases involving package initialization during a ;; non-interactive session, `package-initialize' fails to fill `load-path'. (setq doom--package-load-path (directory-files package-user-dir t "^[^.]" t) - load-path (append load-path doom--package-load-path)) - ;; Ensure core packages are installed - (dolist (pkg doom-core-packages) - (unless (package-installed-p pkg) - (unless doom--refreshed-p - (package-refresh-contents) - (setq doom--refreshed-p t)) - (let ((inhibit-message t)) - (package-install pkg)) - (if (package-installed-p pkg) - (message "Installed %s" pkg) - (error "Couldn't install %s" pkg)))) - (load "quelpa" nil t) - (load "use-package" nil t) - (setq doom-package-init-p t) - (unless noninteractive - (message "Doom initialized")))) + load-path (append doom--base-load-path doom--package-load-path)))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -186,7 +180,7 @@ startup." If FORCE-P is non-nil, do it even if they are. This aggressively reloads core autoload files." - (doom-initialize force-p) + (doom-initialize-load-path force-p) (with-temp-buffer ; prevent buffer-local settings from propagating (let ((noninteractive t) (load-prefer-newer t) @@ -313,19 +307,17 @@ MODULES is an malformed plist of modules to load." (doom-initialize-modules modules) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) - (unless noninteractive + (message "Doom initialized") ,@(cl-loop for (module . submodule) in (doom-module-pairs) for module-path = (doom-module-path module submodule) collect `(load! init ,module-path t) into inits collect `(load! config ,module-path t) into configs finally return (append inits configs)) - (when (display-graphic-p) (require 'server) (unless (server-running-p) (server-start))) - (add-hook 'doom-init-hook #'doom-packages--display-benchmark t) (message "Doom modules initialized")))) @@ -532,7 +524,7 @@ call `doom/reload-load-path' remotely (through emacsclient)." (when (server-running-p) (server-eval-at server-name '(doom//reload-load-path)))) (t - (doom-initialize t) + (doom-initialize-load-path t) (message "Reloaded %d packages" (length doom--package-load-path)) (run-with-timer 1 nil #'redraw-display) (run-hooks 'doom-reload-hook)))) @@ -555,7 +547,7 @@ This should be run whenever init.el or an autoload file is modified. Running ;; state. `doom-initialize-packages' will have side effects otherwise. (and (doom-packages--async-run 'doom//reload-autoloads) (load doom-autoload-file)) - (doom-initialize-packages) + (doom-initialize-packages t) (let ((targets (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir)))) diff --git a/core/core.el b/core/core.el index fbb63263a..79f9e1481 100644 --- a/core/core.el +++ b/core/core.el @@ -112,13 +112,14 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." (load custom-file t t) ;; be quiet at startup; don't load or display anything unnecessary -(advice-add #'display-startup-echo-area-message :override #'ignore) -(setq inhibit-startup-message t - inhibit-startup-echo-area-message user-login-name - inhibit-default-init t - initial-major-mode 'fundamental-mode - initial-scratch-message nil - mode-line-format nil) +(unless noninteractive + (advice-add #'display-startup-echo-area-message :override #'ignore) + (setq inhibit-startup-message t + inhibit-startup-echo-area-message user-login-name + inhibit-default-init t + initial-major-mode 'fundamental-mode + initial-scratch-message nil + mode-line-format nil)) ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. @@ -144,10 +145,9 @@ ability to invoke the debugger in debug mode." nil) (defun doom|finalize () - (unless (or doom-init-p noninteractive) + (unless (or (not after-init-time) noninteractive) (dolist (hook '(doom-init-hook doom-post-init-hook)) - (run-hook-wrapped hook #'doom-try-run-hook hook)) - (setq doom-init-p t)) + (run-hook-wrapped hook #'doom-try-run-hook hook))) ;; Don't keep gc-cons-threshold too high. It helps to stave off the GC while ;; Emacs starts up, but afterwards it causes stuttering and random freezes. So @@ -167,10 +167,10 @@ ability to invoke the debugger in debug mode." gc-cons-percentage 0.6 file-name-handler-alist nil)) - (require 'core-packages (concat doom-core-dir "core-packages")) - (eval-when-compile - (doom-initialize)) - (setq load-path (eval-when-compile load-path) + (require 'cl-lib) + (load (concat doom-core-dir "core-packages") nil t) + (setq load-path (eval-when-compile (doom-initialize t) + (doom-initialize-load-path t)) doom--package-load-path (eval-when-compile doom--package-load-path)) (load! core-lib) @@ -187,10 +187,10 @@ ability to invoke the debugger in debug mode." (load! core-popups) ; taming sudden yet inevitable windows (load! core-editor) ; baseline configuration for text editing (load! core-projects) ; making Emacs project-aware - (load! core-keybinds))) ; centralized keybind system + which-key + (load! core-keybinds)) ; centralized keybind system + which-key -(add-hook! '(emacs-startup-hook doom-reload-hook) - #'doom|finalize) + (add-hook! '(emacs-startup-hook doom-reload-hook) + #'doom|finalize)) (provide 'core) ;;; core.el ends here From 6922fe11fe329881387b1a5fd97985cb76d8c7e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:21:53 -0500 Subject: [PATCH 016/145] Refactor doom-initialize-packages --- core/core-packages.el | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 39bf222f0..f1322515f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -182,37 +182,32 @@ If FORCE-P is non-nil, do it even if they are. This aggressively reloads core autoload files." (doom-initialize-load-path force-p) (with-temp-buffer ; prevent buffer-local settings from propagating - (let ((noninteractive t) - (load-prefer-newer t) - (load-fn - (lambda (file &optional noerror) - (condition-case-unless-debug ex - (load file noerror :nomessage :nosuffix) - ('error - (error (format "(doom-initialize-packages) %s in %s: %s" - (car ex) - (file-relative-name file doom-emacs-dir) - (error-message-string ex)) - :error)))))) + (cl-flet + ((_load + (file &optional noerror interactive) + (condition-case-unless-debug ex + (let ((load-prefer-newer t) + (noninteractive (not interactive))) + (load file noerror :nomessage :nosuffix)) + ('error + (error (format "(doom-initialize-packages) %s in %s: %s" + (car ex) + (file-relative-name file doom-emacs-dir) + (error-message-string ex)) + :error))))) (when (or force-p (not doom-modules)) (setq doom-modules nil) - (let (noninteractive) - (load (concat doom-core-dir "core.el") nil t)) - (funcall load-fn (expand-file-name "init.el" doom-emacs-dir)) + (_load (concat doom-core-dir "core.el") nil 'interactive) + (_load (expand-file-name "init.el" doom-emacs-dir)) (when load-p - (let (noninteractive) - (funcall load-fn (doom-module-path :private user-login-name "init.el") t)) - (mapc load-fn (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))) - (cl-loop for (module . submodule) in (doom-module-pairs) - for path = (doom-module-path module submodule "config.el") - do (funcall load-fn path t)))) + (mapc #'_load (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))) + (_load (expand-file-name "init.el" doom-emacs-dir) nil 'interactive))) (when (or force-p (not doom-packages)) (setq doom-packages nil) - (funcall load-fn (expand-file-name "packages.el" doom-core-dir)) + (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for (module . submodule) in (doom-module-pairs) for path = (doom-module-path module submodule "packages.el") - do (funcall load-fn path t))))) - (doom|finalize)) + do (_load path 'noerror)))))) (defun doom-initialize-modules (modules) "Adds MODULES to `doom-modules'. MODULES must be in mplist format. From 883c12f860ea66342d1dbc8c626f3b2106ed02b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:22:42 -0500 Subject: [PATCH 017/145] recentf: use file-truename on all entries + update recentf-exclude --- core/core-editor.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 4b178e97c..8cdf4014b 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -141,13 +141,12 @@ with functions that require it (like modeline segments)." (setq recentf-save-file (concat doom-etc-dir "recentf") recentf-max-menu-items 0 recentf-max-saved-items 300 + recentf-filename-handlers '(file-truename) recentf-exclude (list "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) - (concat "^" (replace-regexp-in-string - (concat "@" (regexp-quote (system-name))) - "@" (abbreviate-file-name doom-host-dir)))))) + (concat "^" (abbreviate-file-name (file-truename doom-local-dir)))))) ;; From efc7ec38ae67596feffed3c136e86252c2b3b637 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:23:48 -0500 Subject: [PATCH 018/145] core-packages: general, minor refactor --- core/core-packages.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index f1322515f..06997cad4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -276,15 +276,14 @@ is sorted by order of insertion unless ALL-P is non-nil. If ALL-P is non-nil, include all modules, enabled or otherwise." (unless (hash-table-p doom-modules) (error "doom-modules is uninitialized")) - (cl-loop for key being the hash-keys of doom-modules - collect key)) + (hash-table-keys doom-modules)) (defun doom-packages--display-benchmark () (message "Doom loaded %s packages across %d modules in %.03fs" ;; Certainly imprecise, especially where custom additions to ;; load-path are concerned, but I don't mind a [small] margin of ;; error in the plugin count in exchange for faster startup. - (- (length load-path) (length doom--base-load-path)) + (length doom--package-load-path) (hash-table-size doom-modules) (setq doom-init-time (float-time (time-subtract after-init-time before-init-time))))) @@ -514,13 +513,13 @@ call `doom/reload-load-path' remotely (through emacsclient)." (interactive) (byte-recompile-file (expand-file-name "core.el" doom-core-dir) t) (cond (noninteractive - (message "Reloading...") (require 'server) (when (server-running-p) + (message "Reloading active Emacs session...") (server-eval-at server-name '(doom//reload-load-path)))) (t (doom-initialize-load-path t) - (message "Reloaded %d packages" (length doom--package-load-path)) + (message "%d packages reloaded" (length doom--package-load-path)) (run-with-timer 1 nil #'redraw-display) (run-hooks 'doom-reload-hook)))) @@ -558,13 +557,14 @@ This should be run whenever init.el or an autoload file is modified. Running (delete-file doom-autoload-file) (message "Deleted old autoloads.el")) (dolist (file (reverse targets)) - (message (cond ((not (doom-packages--read-if-cookies file)) - "⚠ Ignoring %s") - ((update-file-autoloads file nil doom-autoload-file) - "✕ Nothing in %s") - (t - "✓ Scanned %s")) - (file-relative-name file doom-emacs-dir))) + (message + (cond ((not (doom-packages--read-if-cookies file)) + "⚠ Ignoring %s") + ((update-file-autoloads file nil doom-autoload-file) + "✕ Nothing in %s") + (t + "✓ Scanned %s")) + (file-relative-name file doom-emacs-dir))) (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (get-file-buffer doom-autoload-file)) current-sexp) From 9a9f2ce036dc70fb1ebb1fd08d67cf8cc493f07e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:24:13 -0500 Subject: [PATCH 019/145] Fix make clean printing long, relative paths in output --- core/core-packages.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 06997cad4..2565a4bc5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -680,13 +680,13 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." (byte-recompile-directory package-user-dir 0 t)) (defun doom//clean-byte-compiled-files () - "Delete all the compiled elc files in your Emacs configuration. - -This excludes compiled packages in `doom-packages-dir'.'" + "Delete all the compiled elc files in your Emacs configuration. This excludes +compiled packages.'" (interactive) (let ((targets (append (list (expand-file-name "init.elc" doom-emacs-dir)) (directory-files-recursively doom-core-dir "\\.elc$") - (directory-files-recursively doom-modules-dir "\\.elc$")))) + (directory-files-recursively doom-modules-dir "\\.elc$"))) + (default-directory doom-emacs-dir)) (unless (cl-loop for path in targets if (file-exists-p path) collect path From 7ab8958971551cd4e58496fc1a46d6932de448f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:25:02 -0500 Subject: [PATCH 020/145] Refactor package management api + remove doom-initialize --- core/autoload/packages.el | 67 +++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 80f863f37..c2049afdd 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -1,11 +1,13 @@ ;;; core/autoload/packages.el -*- lexical-binding: t; -*- +(require 'use-package) +(require 'quelpa) + (defvar doom--last-refresh nil) ;;;###autoload (defun doom-refresh-packages (&optional force-p) "Refresh ELPA packages." - (doom-initialize) (when force-p (doom-refresh-clear-cache)) (unless (or (persistent-soft-fetch 'last-pkg-refresh "emacs") @@ -31,13 +33,14 @@ "Get which backend the package NAME was installed with. Can either be elpa or quelpa. Throws an error if NOERROR is nil and the package isn't installed." (cl-assert (symbolp name) t) - (doom-initialize) (cond ((and (or (quelpa-setup-p) (error "Could not initialize quelpa")) (assq name quelpa-cache)) 'quelpa) ((assq name package-alist) 'elpa) + ((package-built-in-p name) + 'emacs) ((not noerror) (error "%s package is not installed" name)))) @@ -84,7 +87,7 @@ installed with. Returns nil otherwise, or if package isn't installed." (doom-initialize-packages) (and (package-installed-p name) (let* ((plist (cdr (assq name doom-packages))) - (old-backend (doom-package-backend name t)) + (old-backend (doom-package-backend name 'noerror)) (new-backend (if (plist-get plist :recipe) 'quelpa 'elpa))) (not (eq old-backend new-backend))))) @@ -114,14 +117,12 @@ If INSTALLED-ONLY-P, only return packages that are installed." ;;;###autoload (defun doom-get-depending-on (name) "Return a list of packages that depend on the package named NAME." - (doom-initialize) (when-let* ((desc (cadr (assq name package-alist)))) (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)))) ;;;###autoload (defun doom-get-dependencies-for (name &optional only) "Return a list of dependencies for a package." - (doom-initialize) (package--get-deps name only)) ;;;###autoload @@ -156,8 +157,9 @@ Used by `doom//packages-update'." (load ,(expand-file-name "core.el" doom-core-dir))) (doom-package-outdated-p ',pkg))) futures)) - (append (delq nil (mapcar #'doom-package-outdated-p elpa-pkgs)) - (delq nil (mapcar #'async-get (reverse futures))))))) + (delq nil + (append (mapcar #'doom-package-outdated-p elpa-pkgs) + (mapcar #'async-get (reverse futures))))))) ;;;###autoload (defun doom-get-orphaned-packages () @@ -214,7 +216,6 @@ Used by `doom//packages-install'." (symbol-name (car other)))) (defun doom--packages-choose (prompt) - (doom-initialize) (let ((table (cl-loop for pkg in package-alist unless (package-built-in-p (cdr pkg)) collect (cons (package-desc-full-name (cdr pkg)) @@ -270,7 +271,6 @@ example; the package name can be omitted)." (defun doom-update-package (name &optional force-p) "Updates package NAME (a symbol) if it is out of date, using quelpa or package.el as appropriate." - (doom-initialize) (unless (package-installed-p name) (user-error "%s isn't installed" name)) (when (doom-package-different-backend-p name) @@ -299,7 +299,6 @@ package.el as appropriate." (defun doom-delete-package (name &optional force-p) "Uninstalls package NAME if it exists, and clears it from `quelpa-cache'." - (doom-initialize) (unless (package-installed-p name) (user-error "%s isn't installed" name)) (let ((inhibit-message (not doom-debug-mode)) @@ -319,13 +318,14 @@ package.el as appropriate." ;; -;; Interactive commands +;; Batch/interactive commands ;; ;;;###autoload (defun doom//packages-install () "Interactive command for installing missing packages." (interactive) + (message! "Looking for packages to install...") (let ((packages (doom-get-missing-packages))) (cond ((not packages) (message! (green "No packages to install!"))) @@ -414,29 +414,28 @@ package.el as appropriate." (defun doom//packages-autoremove () "Interactive command for auto-removing orphaned packages." (interactive) + (message! "Looking for orphaned packages...") (let ((packages (doom-get-orphaned-packages))) (cond ((not packages) (message! (green "No unused packages to remove"))) - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be deleted:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (sym) - (format - "+ %s (%s)" - sym - (let ((backend (doom-package-backend sym))) - (if (doom-package-different-backend-p sym) - (if (eq backend 'quelpa) - "QUELPA->ELPA" - "ELPA->QUELPA") - (if (eq backend 'quelpa) - "QUELPA" - "ELPA"))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) + ((not + (or (getenv "YES") + (y-or-n-p + (format + "%s packages will be deleted:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (sym) + (format "+ %s (%s)" sym + (let ((backend (doom-package-backend sym))) + (if (doom-package-different-backend-p sym) + (if (eq backend 'quelpa) + "QUELPA->ELPA" + "ELPA->QUELPA") + (upcase (symbol-name backend)))))) + (sort (cl-copy-list packages) #'string-lessp) + "\n"))))) (message! (yellow "Aborted!"))) (t @@ -453,6 +452,10 @@ package.el as appropriate." (doom//reload-load-path))))) +;; +;; Interactive commands +;; + ;;;###autoload (defalias 'doom/install-package #'package-install) @@ -478,7 +481,9 @@ Use this interactively. Use `doom-delete-package' for direct calls." (if (package-installed-p package) (if (y-or-n-p (format "%s will be deleted. Confirm?" package)) (message "%s %s" - (if (doom-delete-package package t) "Deleted" "Failed to delete") + (if (doom-delete-package package t) + "Deleted" + "Failed to delete") package) (message "Aborted")) (message "%s isn't installed" package)))) From 317536a02a61fbbfdfd481203d3d505e3987c723 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 15:25:19 -0500 Subject: [PATCH 021/145] ui/doom-dashboard: use doom--package-load-path to count packages --- modules/ui/doom-dashboard/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 1929f5438..4e0933962 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -163,7 +163,7 @@ whose dimensions may not be fully initialized by the time this is run." (+doom-dashboard-center +doom-dashboard--width (format "Loaded %d packages in %d modules in %.02fs" - (- (length load-path) (length doom--base-load-path)) + (length doom--package-load-path) (hash-table-size doom-modules) (if (floatp doom-init-time) doom-init-time 0.0))) 'face 'font-lock-comment-face) From 1873a48e7164e95ce94fdda950d6f1111c5a4a25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 16:33:08 -0500 Subject: [PATCH 022/145] ui/doom-dashboard: fix trailing highlights in whitespace-mode #297 --- modules/ui/doom-dashboard/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 4e0933962..3a68a4621 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -25,6 +25,7 @@ loading.") "Major mode for the DOOM dashboard buffer." (read-only-mode +1) (setq truncate-lines t) + (setq-local whitespace-style nil) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist))) From 3bbb78f7796c5c889bd08e7268d28d3f953806f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 17:05:01 -0500 Subject: [PATCH 023/145] doom//byte-compile: better error handling (revert on error) --- core/core-packages.el | 63 ++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 2565a4bc5..52def1d97 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -634,33 +634,42 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (error "No targets to compile")) (let ((use-package-expand-minimally t)) (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (dolist (target compile-targets) - (when (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p file elc-file)))) - (let ((result (if (doom-packages--read-if-cookies target) - (byte-compile-file target) - 'no-byte-compile)) - (short-name (file-relative-name target doom-emacs-dir))) - (cl-incf - (cond ((eq result 'no-byte-compile) - (message! (dark (white "⚠ Ignored %s" short-name))) - total-noop) - ((null result) - (message! (red "✕ Failed to compile %s" short-name)) - total-fail) - (t - (message! (green "✓ Compiled %s" short-name)) - (quiet! (load target t t)) - total-ok)))))) - (message! - (bold - (color (if (= total-fail 0) 'green 'red) - "%s %s file(s) %s" - (if recompile-p "Recompiled" "Compiled") - (format "%d/%d" total-ok (- (length compile-targets) total-noop)) - (format "(%s ignored)" total-noop))))))))) + (condition-case ex + (progn + (dolist (target compile-targets) + (when (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p file elc-file)))) + (let ((result (if (doom-packages--read-if-cookies target) + (byte-compile-file target) + 'no-byte-compile)) + (short-name (file-relative-name target doom-emacs-dir))) + (cl-incf + (cond ((eq result 'no-byte-compile) + (message! (dark (white "⚠ Ignored %s" short-name))) + total-noop) + ((null result) + (message! (red "✕ Failed to compile %s" short-name)) + total-fail) + (t + (message! (green "✓ Compiled %s" short-name)) + (quiet! (load target t t)) + total-ok)))))) + (message! + (bold + (color (if (= total-fail 0) 'green 'red) + "%s %s file(s) %s" + (if recompile-p "Recompiled" "Compiled") + (format "%d/%d" total-ok (- (length compile-targets) total-noop)) + (format "(%s ignored)" total-noop))))) + (error + (message! (red "\n%%s\n\n%%s\n\n%%s") + "There were breaking errors." + (error-message-string ex) + "Reverting changes...") + (doom//clean-byte-compiled-files) + (message! (green "Finished (nothing was byte-compiled)"))))))))) (defun doom//byte-compile-core (&optional recompile-p) "Byte compile the core Doom files. From d57d0d9305d0a0222efce9544c8abef3e0c9e623 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Dec 2017 17:10:13 -0500 Subject: [PATCH 024/145] Better error-handling for missing fonts #301 --- core/core-ui.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a2f3f011a..ec0573665 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -182,9 +182,13 @@ local value, whether or not it's permanent-local. Therefore, we cycle (when (fontp doom-variable-pitch-font) (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) ('error - (lwarn 'doom-ui :error - "Failed to set fonts because %s" - (error-message-string ex)))) + (if (string-prefix-p "Font not available: " (error-message-string ex)) + (lwarn 'doom-ui :warning + "Could not find the '%s' font on your system, falling back to system font" + (font-get (caddr ex) :family)) + (lwarn 'doom-ui :error + "Unexpected error while initializing fonts: %s" + (error-message-string ex))))) (run-hooks 'doom-init-ui-hook)) (defun doom|reload-ui-in-daemon (frame) From ebd82024e5747062459f1b20c4ec7ea787b22a0d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 01:47:27 -0500 Subject: [PATCH 025/145] Fix doom-fetch & remove --depth 1 --- core/autoload/system.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/system.el b/core/autoload/system.el index 6fb264fc3..97b44e2da 100644 --- a/core/autoload/system.el +++ b/core/autoload/system.el @@ -48,8 +48,8 @@ is given, returns t if it matches the current system, and nil otherwise." Requires the corresponding client, e.g. git for git repos, hg for mercurial, etc." (let* ((command (pcase fetcher - (:github "git clone --depth 1 --recursive https://github.com/%s.git") - (:git "git clone --depth 1 --recursive %s") + (:github "git clone --recursive https://github.com/%s.git") + (:git "git clone --recursive %s") (:gist "git clone https://gist.github.com/%s.git") ;; TODO Add hg (_ (error "%s is not a valid fetcher" fetcher)))) @@ -61,8 +61,8 @@ etc." (error "%s couldn't be found" command)) (unless (file-directory-p dest) (funcall (if noninteractive - (lambda (&rest args) (princ (shell-command-to-string args))) + (lambda (c) (princ (shell-command-to-string c))) #'async-shell-command) (format "%s %s %s" bin args (shell-quote-argument dest))) - (message! "Cloning %s -> %s" location dest)))) + (message! "Cloning %s -> %s" location (file-relative-name dest))))) From 88a3732ae7e13d2a5570c31bac37e4b2128a2f3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:09:40 -0500 Subject: [PATCH 026/145] Add doom-project-{find-file,browse} functions --- core/core-projects.el | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core/core-projects.el b/core/core-projects.el index 01e8e88f4..6409f5b6b 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -76,6 +76,29 @@ which case they're relative to `default-directory'). If they start with a slash, they are absolute." (doom--resolve-path-forms files (doom-project-root))) +(defun doom-project-find-file (dir) + "Fuzzy-find a file in DIR." + (interactive) + (let ((default-directory dir) + ;; Necessary to isolate this search from the current project + projectile-project-name + projectile-require-project-root + projectile-cached-buffer-file-name + projectile-cached-project-root) + (call-interactively + ;; completion modules may remap this command + (or (command-remapping #'projectile-find-file) + #'projectile-find-file)))) + +(defun doom-project-browse (dir) + "TODO" + (interactive) + (let ((default-directory dir)) + (call-interactively + ;; completion modules may remap this command + (or (command-remapping #'find-file) + #'find-file)))) + ;; ;; Projects From 79fbaf3d987a870f8aa27da2760c434c0f345f33 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:27:42 -0500 Subject: [PATCH 027/145] Add private/default This will replace private/hlissner. Addresses #301 --- init.example.el | 7 +- modules/private/default/+commands.el | 99 +++ modules/private/default/autoload/default.el | 45 + modules/private/default/autoload/evil.el | 38 + modules/private/default/config.el | 893 ++++++++++++++++++++ modules/private/default/packages.el | 7 + 6 files changed, 1087 insertions(+), 2 deletions(-) create mode 100644 modules/private/default/+commands.el create mode 100644 modules/private/default/autoload/default.el create mode 100644 modules/private/default/autoload/evil.el create mode 100644 modules/private/default/config.el create mode 100644 modules/private/default/packages.el diff --git a/init.example.el b/init.example.el index 752f734b6..3a7a691a7 100644 --- a/init.example.el +++ b/init.example.el @@ -130,7 +130,10 @@ ;twitter ; twitter client https://twitter.com/vnought ;write ; emacs as a word processor (latex + org + markdown) - ;; This is the private module of Doom's maintainer; use it as a reference + ;; Private modules are where you place your personal configuration files. + ;; By default, they are not tracked. There is one module included here, + ;; the defaults module. It contains a Spacemacs-inspired keybinding + ;; scheme and additional ex commands for evil-mode. Use it as a reference ;; for your own. - :private hlissner) + :private default) diff --git a/modules/private/default/+commands.el b/modules/private/default/+commands.el new file mode 100644 index 000000000..fb8eb939b --- /dev/null +++ b/modules/private/default/+commands.el @@ -0,0 +1,99 @@ +;;; private/default/+commands.el -*- lexical-binding: t; -*- + +(defalias 'ex! 'evil-ex-define-cmd) + +;; Commands defined elsewhere +;;(ex! "al[ign]" #'+evil:align) +;;(ex! "g[lobal]" #'+evil:global) + +;; Custom commands +;; Editing +(ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me +(ex! "al[ign]" #'+evil:align) +(ex! "enhtml" #'+web:encode-html-entities) +(ex! "dehtml" #'+web:decode-html-entities) +(ex! "mc" #'+evil:mc) +(ex! "iedit" #'evil-multiedit-ex-match) +(ex! "na[rrow]" #'+evil:narrow-buffer) +(ex! "retab" #'+evil:retab) + +;; External resources +;; TODO (ex! "db" #'doom:db) +;; TODO (ex! "dbu[se]" #'doom:db-select) +;; TODO (ex! "go[ogle]" #'doom:google-search) +(ex! "lo[okup]" #'+jump:online) +(ex! "http" #'httpd-start) ; start http server +(ex! "repl" #'+eval:repl) ; invoke or send to repl +;; TODO (ex! "rx" 'doom:regex) ; open re-builder +(ex! "sh[ell]" #'+eshell:run) +(ex! "t[mux]" #'+tmux:run) ; send to tmux +(ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux +(ex! "x" #'doom/open-project-scratch-buffer) + +;; GIT +(ex! "gist" #'+gist:send) ; send current buffer/region to gist +(ex! "gistl" #'+gist:list) ; list gists by user +(ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab +(ex! "gissues" #'+vcs/git-browse-issues) ; show github issues +(ex! "git" #'magit-status) ; open magit status window +(ex! "gstage" #'magit-stage) +(ex! "gunstage" #'magit-unstage) +(ex! "gblame" #'magit-blame) +(ex! "grevert" #'git-gutter:revert-hunk) + +;; Dealing with buffers +(ex! "clean[up]" #'doom/cleanup-buffers) +(ex! "k[ill]" #'doom/kill-this-buffer) +(ex! "k[ill]all" #'+hlissner:kill-all-buffers) +(ex! "k[ill]m" #'+hlissner:kill-matching-buffers) +(ex! "k[ill]o" #'doom/kill-other-buffers) +(ex! "l[ast]" #'doom/popup-restore) +(ex! "m[sg]" #'view-echo-area-messages) +(ex! "pop[up]" #'doom/popup-this-buffer) + +;; Project navigation +(ex! "a" #'projectile-find-other-file) +(ex! "cd" #'+hlissner:cd) +(cond ((featurep! :completion ivy) + (ex! "ag" #'+ivy:ag) + (ex! "agc[wd]" #'+ivy:ag-cwd) + (ex! "rg" #'+ivy:rg) + (ex! "rgc[wd]" #'+ivy:rg-cwd) + (ex! "sw[iper]" #'+ivy:swiper) + (ex! "todo" #'+ivy:todo)) + ((featurep! :completion helm) + (ex! "ag" #'+helm:ag) + (ex! "agc[wd]" #'+helm:ag-cwd) + (ex! "rg" #'+helm:rg) + (ex! "rgc[wd]" #'+helm:rg-cwd) + (ex! "sw[oop]" #'+helm:swoop) + (ex! "todo" #'+helm:todo))) + +;; Project tools +(ex! "build" #'+eval/build) +(ex! "debug" #'+debug/run) +(ex! "er[rors]" #'flycheck-list-errors) + +;; File operations +(ex! "cp" #'+evil:copy-this-file) +(ex! "mv" #'+evil:move-this-file) +(ex! "rm" #'+evil:delete-this-file) + +;; Sessions/tabs +(ex! "sclear" #'+workspace/kill-session) +(ex! "sl[oad]" #'+workspace:load-session) +(ex! "ss[ave]" #'+workspace:save-session) +(ex! "tabc[lose]" #'+workspace:delete) +(ex! "tabclear" #'doom/kill-all-buffers) +(ex! "tabl[ast]" #'+workspace/switch-to-last) +(ex! "tabload" #'+workspace:load) +(ex! "tabn[ew]" #'+workspace:new) +(ex! "tabn[ext]" #'+workspace:switch-next) +(ex! "tabp[rev]" #'+workspace:switch-previous) +(ex! "tabr[ename]" #'+workspace:rename) +(ex! "tabs" #'+workspace/display) +(ex! "tabsave" #'+workspace:save) + +;; Org-mode +(ex! "cap" #'+org-capture/dwim) + diff --git a/modules/private/default/autoload/default.el b/modules/private/default/autoload/default.el new file mode 100644 index 000000000..4f329e789 --- /dev/null +++ b/modules/private/default/autoload/default.el @@ -0,0 +1,45 @@ +;; private/default/autoload/default.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +default/yank-buffer-filename () + "Copy the current buffer's path to the kill ring." + (interactive) + (if-let* ((filename (or buffer-file-name (bound-and-true-p list-buffers-directory)))) + (message (kill-new (abbreviate-file-name filename))) + (error "Couldn't find filename in current buffer"))) + +(defmacro +default--def-browse-in! (name dir &optional prefix) + (let ((prefix (cdr (doom-module-from-path load-file-name)))) + `(defun ,(intern (format "%s/browse-%s" (or prefix '+default) name)) () + (interactive) + (doom-project-browse ,dir)))) + +(defmacro +default--def-find-in! (name dir) + (let ((prefix (cdr (doom-module-from-path load-file-name)))) + `(defun ,(intern (format "+%s/find-in-%s" prefix name)) () + (interactive) + (doom-project-find-file ,dir)))) + + +;;;###autoload (autoload '+default/browse-project "private/default/autoload" nil t) +(+default--def-browse-in project (doom-project-root)) + +;;;###autoload (autoload '+default/find-in-templates "private/default/autoload" nil t) +(+default--def-find-in! templates +file-templates-dir) +;;;###autoload (autoload '+default/browse-templates "private/default/autoload" nil t) +(+default--def-browse-in! templates +file-templates-dir) + +;;;###autoload (autoload '+default/find-in-emacsd "private/default/autoload" nil t) +(+default--def-find-in! emacsd doom-emacs-dir) +;;;###autoload (autoload '+default/browse-emacsd "private/default/autoload" nil t) +(+default--def-browse-in! emacsd doom-emacs-dir) + +;;;###autoload (autoload '+default/find-in-notes "private/default/autoload" nil t) +(+default--def-find-in! notes +org-dir) +;;;###autoload (autoload '+default/browse-notes "private/default/autoload" nil t) +(+default--def-browse-in! notes +org-dir) + +;;;###autoload (autoload '+default/find-in-snippets "private/default/autoload" nil t) +(+default--def-find-in! snippets +default-snippets-dir) +;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' + diff --git a/modules/private/default/autoload/evil.el b/modules/private/default/autoload/evil.el new file mode 100644 index 000000000..01a37f28c --- /dev/null +++ b/modules/private/default/autoload/evil.el @@ -0,0 +1,38 @@ +;; private/default/autoload/evil.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) + +;;;###autoload (autoload '+default:multi-next-line "private/default/autoload/evil" nil t) +(evil-define-motion +default:multi-next-line (count) + "Move down 6 lines." + :type line + (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode)))) + (evil-line-move (* 6 (or count 1))))) + +;;;###autoload (autoload '+default:multi-previous-line "private/default/autoload/evil" nil t) +(evil-define-motion +default:multi-previous-line (count) + "Move up 6 lines." + :type line + (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode)))) + (evil-line-move (- (* 6 (or count 1)))))) + +;;;###autoload (autoload '+default:cd "private/default/autoload/evil" nil t) +(evil-define-command +default:cd () + "Change `default-directory' with `cd'." + (interactive "") + (cd input)) + +;;;###autoload (autoload '+default:kill-all-buffers "private/default/autoload/evil" nil t) +(evil-define-command +default:kill-all-buffers (&optional bang) + "Kill all buffers. If BANG, kill current session too." + (interactive "") + (if bang + (+workspace/kill-session) + (doom/kill-all-buffers))) + +;;;###autoload (autoload '+default:kill-matching-buffers "private/default/autoload/evil" nil t) +(evil-define-command +default:kill-matching-buffers (&optional bang pattern) + "Kill all buffers matching PATTERN regexp. If BANG, only match project +buffers." + (interactive "") + (doom/kill-matching-buffers pattern bang)) + diff --git a/modules/private/default/config.el b/modules/private/default/config.el new file mode 100644 index 000000000..72a7e0531 --- /dev/null +++ b/modules/private/default/config.el @@ -0,0 +1,893 @@ +;;; private/default/config.el -*- lexical-binding: t; -*- + +(def-package! emacs-snippets) + + +;; +;; Custom Ex-commands for `evil-mode' +;; + +(when (featurep 'evil) + (defalias 'ex! 'evil-ex-define-cmd) + + ;;; Commands defined elsewhere + ;;(ex! "al[ign]" #'+evil:align) + ;;(ex! "g[lobal]" #'+evil:global) + + ;;; Custom commands + ;; Editing + (ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me + (ex! "al[ign]" #'+evil:align) + (ex! "enhtml" #'+web:encode-html-entities) + (ex! "dehtml" #'+web:decode-html-entities) + (ex! "mc" #'+evil:mc) + (ex! "iedit" #'evil-multiedit-ex-match) + (ex! "na[rrow]" #'+evil:narrow-buffer) + (ex! "retab" #'+evil:retab) + ;; External resources + ;; TODO (ex! "db" #'doom:db) + ;; TODO (ex! "dbu[se]" #'doom:db-select) + ;; TODO (ex! "go[ogle]" #'doom:google-search) + (ex! "lo[okup]" #'+jump:online) + (ex! "http" #'httpd-start) ; start http server + (ex! "repl" #'+eval:repl) ; invoke or send to repl + ;; TODO (ex! "rx" 'doom:regex) ; open re-builder + (ex! "sh[ell]" #'+eshell:run) + (ex! "t[mux]" #'+tmux:run) ; send to tmux + (ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux + (ex! "x" #'doom/open-project-scratch-buffer) + ;; GIT + (ex! "gist" #'+gist:send) ; send current buffer/region to gist + (ex! "gistl" #'+gist:list) ; list gists by user + (ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab + (ex! "gissues" #'+vcs/git-browse-issues) ; show github issues + (ex! "git" #'magit-status) ; open magit status window + (ex! "gstage" #'magit-stage) + (ex! "gunstage" #'magit-unstage) + (ex! "gblame" #'magit-blame) + (ex! "grevert" #'git-gutter:revert-hunk) + ;; Dealing with buffers + (ex! "clean[up]" #'doom/cleanup-buffers) + (ex! "k[ill]" #'doom/kill-this-buffer) + (ex! "k[ill]all" #'+hlissner:kill-all-buffers) + (ex! "k[ill]m" #'+hlissner:kill-matching-buffers) + (ex! "k[ill]o" #'doom/kill-other-buffers) + (ex! "l[ast]" #'doom/popup-restore) + (ex! "m[sg]" #'view-echo-area-messages) + (ex! "pop[up]" #'doom/popup-this-buffer) + ;; Project navigation + (ex! "a" #'projectile-find-other-file) + (ex! "cd" #'+hlissner:cd) + (cond ((featurep! :completion ivy) + (ex! "ag" #'+ivy:ag) + (ex! "agc[wd]" #'+ivy:ag-cwd) + (ex! "rg" #'+ivy:rg) + (ex! "rgc[wd]" #'+ivy:rg-cwd) + (ex! "sw[iper]" #'+ivy:swiper) + (ex! "todo" #'+ivy:todo)) + ((featurep! :completion helm) + (ex! "ag" #'+helm:ag) + (ex! "agc[wd]" #'+helm:ag-cwd) + (ex! "rg" #'+helm:rg) + (ex! "rgc[wd]" #'+helm:rg-cwd) + (ex! "sw[oop]" #'+helm:swoop) + (ex! "todo" #'+helm:todo))) + ;; Project tools + (ex! "build" #'+eval/build) + (ex! "debug" #'+debug/run) + (ex! "er[rors]" #'flycheck-list-errors) + ;; File operations + (ex! "cp" #'+evil:copy-this-file) + (ex! "mv" #'+evil:move-this-file) + (ex! "rm" #'+evil:delete-this-file) + ;; Sessions/tabs + (ex! "sclear" #'+workspace/kill-session) + (ex! "sl[oad]" #'+workspace:load-session) + (ex! "ss[ave]" #'+workspace:save-session) + (ex! "tabc[lose]" #'+workspace:delete) + (ex! "tabclear" #'doom/kill-all-buffers) + (ex! "tabl[ast]" #'+workspace/switch-to-last) + (ex! "tabload" #'+workspace:load) + (ex! "tabn[ew]" #'+workspace:new) + (ex! "tabn[ext]" #'+workspace:switch-next) + (ex! "tabp[rev]" #'+workspace:switch-previous) + (ex! "tabr[ename]" #'+workspace:rename) + (ex! "tabs" #'+workspace/display) + (ex! "tabsave" #'+workspace:save) + ;; Org-mode + (ex! "cap" #'+org-capture/dwim)) + + +;; +;; Keybindings +;; + +(map! [remap evil-jump-to-tag] #'projectile-find-tag + [remap find-tag] #'projectile-find-tag + + ;; Ensure there are no conflicts + :nmvo doom-leader-key nil + :nmvo doom-localleader-key nil + + ;; --- Global keybindings --------------------------- + ;; Make M-x available everywhere + :gnvime "M-x" #'execute-extended-command + :gnvime "A-x" #'execute-extended-command + + ;; A little sandbox to run code in + :gnvime "M-;" #'eval-expression + :gnvime "M-:" #'doom/open-scratch-buffer + + ;; Text-scaling + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + + ;; Simple window navigation/manipulation + "C-`" #'doom/popup-toggle + "C-~" #'doom/popup-raise + "M-t" #'+workspace/new + "M-T" #'+workspace/display + "M-w" #'delete-window + "M-W" #'+workspace/close-workspace-or-frame + "M-n" #'evil-buffer-new + "M-N" #'make-frame + "M-1" (λ! (+workspace/switch-to 0)) + "M-2" (λ! (+workspace/switch-to 1)) + "M-3" (λ! (+workspace/switch-to 2)) + "M-4" (λ! (+workspace/switch-to 3)) + "M-5" (λ! (+workspace/switch-to 4)) + "M-6" (λ! (+workspace/switch-to 5)) + "M-7" (λ! (+workspace/switch-to 6)) + "M-8" (λ! (+workspace/switch-to 7)) + "M-9" (λ! (+workspace/switch-to 8)) + "M-0" #'+workspace/switch-to-last + + ;; Other sensible, textmate-esque global bindings + :ne "M-r" #'+eval/buffer + :ne "M-R" #'+eval/region-and-replace + :ne "M-b" #'+eval/build + :ne "M-a" #'mark-whole-buffer + :ne "M-c" #'evil-yank + :ne "M-q" (if (daemonp) #'delete-frame #'save-buffers-kill-emacs) + :ne "M-f" #'swiper + :ne "C-M-f" #'doom/toggle-fullscreen + :n "M-s" #'save-buffer + :m "A-j" #'+hlissner:multi-next-line + :m "A-k" #'+hlissner:multi-previous-line + :nv "C-SPC" #'+evil:fold-toggle + :gnvimer "M-v" #'clipboard-yank + ;; Easier window navigation + :en "C-h" #'evil-window-left + :en "C-j" #'evil-window-down + :en "C-k" #'evil-window-up + :en "C-l" #'evil-window-right + + "C-x p" #'doom/other-popup + + + ;; --- ------------------------------------- + (:leader + :desc "Ex command" :nv ";" #'evil-ex + :desc "M-x" :nv ":" #'execute-extended-command + :desc "Pop up scratch buffer" :nv "x" #'doom/open-scratch-buffer + :desc "Org Capture" :nv "X" #'+org-capture/open + + ;; Most commonly used + :desc "Find file in project" :n "SPC" #'projectile-find-file + :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer + :desc "Switch buffer" :n "<" #'switch-to-buffer + :desc "Browse files" :n "." #'find-file + :desc "Toggle last popup" :n "~" #'doom/popup-toggle + :desc "Eval expression" :n "`" #'eval-expression + :desc "Blink cursor line" :n "DEL" #'+doom/blink-cursor + :desc "Jump to bookmark" :n "RET" #'bookmark-jump + + ;; C-u is used by evil + :desc "Universal argument" :n "u" #'universal-argument + :desc "window" :n "w" evil-window-map + + (:desc "previous..." :prefix "[" + :desc "Text size" :nv "[" #'text-scale-decrease + :desc "Buffer" :nv "b" #'doom/previous-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk + :desc "Todo" :nv "t" #'hl-todo-previous + :desc "Error" :nv "e" #'previous-error + :desc "Workspace" :nv "w" #'+workspace/switch-left + :desc "Smart jump" :nv "h" #'smart-backward + :desc "Spelling error" :nv "s" #'evil-prev-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-previous-word-generic) + + (:desc "next..." :prefix "]" + :desc "Text size" :nv "]" #'text-scale-increase + :desc "Buffer" :nv "b" #'doom/next-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk + :desc "Todo" :nv "t" #'hl-todo-next + :desc "Error" :nv "e" #'next-error + :desc "Workspace" :nv "w" #'+workspace/switch-right + :desc "Smart jump" :nv "l" #'smart-forward + :desc "Spelling error" :nv "s" #'evil-next-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) + + (:desc "search" :prefix "/" + :desc "Swiper" :nv "/" #'swiper + :desc "Imenu" :nv "i" #'imenu + :desc "Imenu across buffers" :nv "I" #'imenu-anywhere + :desc "Online providers" :nv "o" #'+jump/online-select) + + (:desc "workspace" :prefix "TAB" + :desc "Display tab bar" :n "TAB" #'+workspace/display + :desc "New workspace" :n "n" #'+workspace/new + :desc "Load workspace from file" :n "l" #'+workspace/load + :desc "Load last session" :n "L" (λ! (+workspace/load-session)) + :desc "Save workspace to file" :n "s" #'+workspace/save + :desc "Autosave current session" :n "S" #'+workspace/save-session + :desc "Switch workspace" :n "." #'+workspace/switch-to + :desc "Kill all buffers" :n "x" #'doom/kill-all-buffers + :desc "Delete session" :n "X" #'+workspace/kill-session + :desc "Delete this workspace" :n "d" #'+workspace/delete + :desc "Load session" :n "L" #'+workspace/load-session + :desc "Next workspace" :n "]" #'+workspace/switch-right + :desc "Previous workspace" :n "[" #'+workspace/switch-left + :desc "Switch to 1st workspace" :n "1" (λ! (+workspace/switch-to 0)) + :desc "Switch to 2nd workspace" :n "2" (λ! (+workspace/switch-to 1)) + :desc "Switch to 3rd workspace" :n "3" (λ! (+workspace/switch-to 2)) + :desc "Switch to 4th workspace" :n "4" (λ! (+workspace/switch-to 3)) + :desc "Switch to 5th workspace" :n "5" (λ! (+workspace/switch-to 4)) + :desc "Switch to 6th workspace" :n "6" (λ! (+workspace/switch-to 5)) + :desc "Switch to 7th workspace" :n "7" (λ! (+workspace/switch-to 6)) + :desc "Switch to 8th workspace" :n "8" (λ! (+workspace/switch-to 7)) + :desc "Switch to 9th workspace" :n "9" (λ! (+workspace/switch-to 8)) + :desc "Switch to last workspace" :n "0" #'+workspace/switch-to-last) + + (:desc "buffer" :prefix "b" + :desc "New empty buffer" :n "n" #'evil-buffer-new + :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer + :desc "Switch buffer" :n "B" #'switch-to-buffer + :desc "Kill buffer" :n "k" #'doom/kill-this-buffer + :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers + :desc "Save buffer" :n "s" #'save-buffer + :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer + :desc "Bury buffer" :n "z" #'bury-buffer + :desc "Next buffer" :n "]" #'doom/next-buffer + :desc "Previous buffer" :n "[" #'doom/previous-buffer + :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) + + (:desc "code" :prefix "c" + :desc "List errors" :n "x" #'flycheck-list-errors + :desc "Evaluate buffer/region" :n "e" #'+eval/buffer + :v "e" #'+eval/region + :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region + :desc "Build tasks" :nv "b" #'+eval/build + :desc "Jump to definition" :n "d" #'+jump/definition + :desc "Jump to references" :n "D" #'+jump/references + :desc "Open REPL" :n "r" #'+eval/open-repl + :v "r" #'+eval:repl) + + (:desc "file" :prefix "f" + :desc "Find file" :n "." #'find-file + :desc "Sudo find file" :n ">" #'doom/sudo-find-file + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Find file from here" :n "?" #'counsel-file-jump + :desc "Find other file" :n "a" #'projectile-find-other-file + :desc "Open project editorconfig" :n "c" #'editorconfig-find-current-editorconfig + :desc "Find file in dotfiles" :n "d" #'+default/find-in-dotfiles + :desc "Browse dotfiles" :n "D" #'+default/browse-dotfiles + :desc "Find file in emacs.d" :n "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" :n "E" #'+default/browse-emacsd + :desc "Recent files" :n "r" #'recentf-open-files + :desc "Recent project files" :n "R" #'projectile-recentf + :desc "Yank filename" :n "y" #'+default/yank-buffer-filename) + + (:desc "git" :prefix "g" + :desc "Git status" :n "S" #'magit-status + :desc "Git blame" :n "b" #'magit-blame + :desc "Git time machine" :n "t" #'git-timemachine-toggle + :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk + :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk + :desc "Git revert buffer" :n "R" #'vc-revert + :desc "List gists" :n "g" #'+gist:list + :desc "Next hunk" :nv "]" #'git-gutter:next-hunk + :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) + + (:desc "help" :prefix "h" + :n "h" help-map + :desc "Apropos" :n "a" #'apropos + :desc "Reload theme" :n "R" #'doom//reload-theme + :desc "Find library" :n "l" #'find-library + :desc "Toggle Emacs log" :n "m" #'doom/popup-toggle-messages + :desc "Command log" :n "L" #'global-command-log-mode + :desc "Describe function" :n "f" #'describe-function + :desc "Describe key" :n "k" #'describe-key + :desc "Describe char" :n "c" #'describe-char + :desc "Describe mode" :n "M" #'describe-mode + :desc "Describe variable" :n "v" #'describe-variable + :desc "Describe face" :n "F" #'describe-face + :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe DOOM module" :n "d" #'doom/describe-module + :desc "Find definition" :n "." #'+jump/definition + :desc "Find references" :n "/" #'+jump/references + :desc "Find documentation" :n "h" #'+jump/documentation + :desc "What face" :n "'" #'doom/what-face + :desc "What minor modes" :n ";" #'doom/what-minor-mode + :desc "Info" :n "i" #'info + :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) + + (:desc "insert" :prefix "i" + :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From snippet" :nv "s" #'yas-insert-snippet) + + (:desc "notes" :prefix "n" + :desc "Find file in notes" :n "n" #'+default/find-in-notes + :desc "Browse notes" :n "N" #'+default/browse-notes + :desc "Org capture" :n "x" #'+org-capture/open + :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode + :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) + + (:desc "open" :prefix "o" + :desc "Default browser" :n "b" #'browse-url-of-file + :desc "Debugger" :n "d" #'+debug/open + :desc "REPL" :n "r" #'+eval/open-repl + :v "r" #'+eval:repl + :desc "Neotree" :n "n" #'+neotree/toggle + :desc "Terminal" :n "t" #'+term/open-popup + :desc "Terminal in project" :n "T" #'+term/open-popup-in-project + + ;; applications + :desc "APP: elfeed" :n "E" #'=rss + :desc "APP: email" :n "M" #'=email + :desc "APP: twitter" :n "T" #'=twitter + :desc "APP: regex" :n "X" #'=regex + + ;; macos + (:when IS-MAC + :desc "Reveal in Finder" :n "o" #'+macos/reveal-in-finder + :desc "Reveal project in Finder" :n "O" #'+macos/reveal-project-in-finder + :desc "Send to Transmit" :n "u" #'+macos/send-to-transmit + :desc "Send project to Transmit" :n "U" #'+macos/send-project-to-transmit + :desc "Send to Launchbar" :n "l" #'+macos/send-to-launchbar + :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar)) + + (:desc "project" :prefix "p" + :desc "Browse project" :n "." #'+default/browse-project + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Run cmd in project root" :nv "!" #'projectile-run-shell-command-in-root + :desc "Switch project" :n "p" #'projectile-switch-project + :desc "Recent project files" :n "r" #'projectile-recentf + :desc "List project tasks" :n "t" #'+ivy/tasks + :desc "Pop term in project" :n "o" #'+term/open-popup-in-project + :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) + + (:desc "quit" :prefix "q" + :desc "Quit" :n "q" #'evil-save-and-quit + :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) + + (:desc "remote" :prefix "r" + :desc "Upload local" :n "u" #'+upload/local + :desc "Upload local (force)" :n "U" (λ! (+upload/local t)) + :desc "Download remote" :n "d" #'+upload/remote-download + :desc "Diff local & remote" :n "D" #'+upload/diff + :desc "Browse remote files" :n "." #'+upload/browse + :desc "Detect remote changes" :n ">" #'+upload/check-remote) + + (:desc "snippets" :prefix "s" + :desc "New snippet" :n "n" #'yas-new-snippet + :desc "Insert snippet" :nv "i" #'yas-insert-snippet + :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file + :desc "Find snippet" :n "S" #'+default/find-in-snippets) + + (:desc "toggle" :prefix "t" + :desc "Flyspell" :n "s" #'flyspell-mode + :desc "Flycheck" :n "f" #'flycheck-mode + :desc "Line numbers" :n "l" #'doom/toggle-line-numbers + :desc "Fullscreen" :n "f" #'doom/toggle-fullscreen + :desc "Indent guides" :n "i" #'highlight-indentation-mode + :desc "Indent guides (column)" :n "I" #'highlight-indentation-current-column-mode + :desc "Impatient mode" :n "h" #'+impatient-mode/toggle + :desc "Big mode" :n "b" #'doom-big-font-mode + :desc "Evil goggles" :n "g" #'+evil-goggles/toggle)) + + + ;; --- Personal vim-esque bindings ------------------ + :n "zx" #'doom/kill-this-buffer + :n "ZX" #'bury-buffer + :n "]b" #'doom/next-buffer + :n "[b" #'doom/previous-buffer + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left + :m "gt" #'+workspace/switch-right + :m "gT" #'+workspace/switch-left + :m "gd" #'+jump/definition + :m "gD" #'+jump/references + :m "gh" #'+jump/documentation + :n "gp" #'+evil/reselect-paste + :n "gr" #'+eval:region + :n "gR" #'+eval/buffer + :v "gR" #'+eval:replace-region + :v "@" #'+evil:macro-on-all-lines + :n "g@" #'+evil:macro-on-all-lines + ;; repeat in visual mode (FIXME buggy) + :v "." #'evil-repeat + ;; don't leave visual mode after shifting + :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + ;; paste from recent yank register (which isn't overwritten) + :v "C-p" "\"0p" + + (:map evil-window-map ; prefix "C-w" + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'ace-window + ;; Swapping windows + "H" #'+evil/window-move-left + "J" #'+evil/window-move-down + "K" #'+evil/window-move-up + "L" #'+evil/window-move-right + "C-S-w" #'ace-swap-window + ;; Window undo/redo + "u" #'winner-undo + "C-u" #'winner-undo + "C-r" #'winner-redo + "o" #'doom/window-enlargen + ;; Delete window + "c" #'+workspace/close-window-or-workspace + "C-C" #'ace-delete-window) + + + ;; --- Plugin bindings ------------------------------ + ;; auto-yasnippet + :i [C-tab] #'aya-expand + :nv [C-tab] #'aya-create + + ;; company-mode (vim-like omnicompletion) + :i "C-SPC" #'+company/complete + (:prefix "C-x" + :i "C-l" #'+company/whole-lines + :i "C-k" #'+company/dict-or-keywords + :i "C-f" #'company-files + :i "C-]" #'company-etags + :i "s" #'company-ispell + :i "C-s" #'company-yasnippet + :i "C-o" #'company-capf + :i "C-n" #'company-dabbrev-code + :i "C-p" #'+company/dabbrev-code-previous) + (:after company + (:map company-active-map + ;; Don't interfere with `evil-delete-backward-word' in insert mode + "C-w" nil + "C-o" #'company-search-kill-others + "C-n" #'company-select-next + "C-p" #'company-select-previous + "C-h" #'company-quickhelp-manual-begin + "C-S-h" #'company-show-doc-buffer + "C-S-s" #'company-search-candidates + "C-s" #'company-filter-candidates + "C-SPC" #'company-complete-common + "C-h" #'company-quickhelp-manual-begin + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous + [escape] (λ! (company-abort) (evil-normal-state 1))) + ;; Automatically applies to `company-filter-map' + (:map company-search-map + "C-n" #'company-search-repeat-forward + "C-p" #'company-search-repeat-backward + "C-s" (λ! (company-search-abort) (company-filter-candidates)) + [escape] #'company-search-abort)) + + ;; counsel + (:after counsel + (:map counsel-ag-map + [backtab] #'+ivy/wgrep-occur ; search/replace on results + "C-SPC" #'ivy-call-and-recenter ; preview + "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) + + ;; evil-commentary + :n "gc" #'evil-commentary + + ;; evil-exchange + :n "gx" #'evil-exchange + + ;; evil-matchit + :nv [tab] #'+evil/matchit-or-toggle-fold + + ;; evil-magit + (:after evil-magit + :map (magit-status-mode-map magit-revision-mode-map) + :n "C-j" nil + :n "C-k" nil) + + ;; evil-mc + (:prefix "gz" + :nv "m" #'evil-mc-make-all-cursors + :nv "u" #'evil-mc-undo-all-cursors + :nv "z" #'+evil/mc-make-cursor-here + :nv "t" #'+evil/mc-toggle-cursors + :nv "n" #'evil-mc-make-and-goto-next-cursor + :nv "p" #'evil-mc-make-and-goto-prev-cursor + :nv "N" #'evil-mc-make-and-goto-last-cursor + :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "d" #'evil-mc-make-and-goto-next-match + :nv "D" #'evil-mc-make-and-goto-prev-match) + (:after evil-mc + :map evil-mc-key-map + :nv "C-n" #'evil-mc-make-and-goto-next-cursor + :nv "C-N" #'evil-mc-make-and-goto-last-cursor + :nv "C-p" #'evil-mc-make-and-goto-prev-cursor + :nv "C-P" #'evil-mc-make-and-goto-first-cursor) + + ;; evil-multiedit + :v "R" #'evil-multiedit-match-all + :n "M-d" #'evil-multiedit-match-symbol-and-next + :n "M-D" #'evil-multiedit-match-symbol-and-prev + :v "M-d" #'evil-multiedit-match-and-next + :v "M-D" #'evil-multiedit-match-and-prev + :nv "C-M-d" #'evil-multiedit-restore + (:after evil-multiedit + (:map evil-multiedit-state-map + "M-d" #'evil-multiedit-match-and-next + "M-D" #'evil-multiedit-match-and-prev + "RET" #'evil-multiedit-toggle-or-restrict-region) + (:map (evil-multiedit-state-map evil-multiedit-insert-state-map) + "C-n" #'evil-multiedit-next + "C-p" #'evil-multiedit-prev)) + + ;; evil-snipe + (:after evil-snipe + ;; Binding to switch to evil-easymotion/avy after a snipe + :map evil-snipe-parent-transient-map + "C-;" (λ! (require 'evil-easymotion) + (call-interactively + (evilem-create #'evil-snipe-repeat + :bind ((evil-snipe-scope 'whole-buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight)))))) + + ;; evil-surround + :v "S" #'evil-surround-region + :o "s" #'evil-surround-edit + :o "S" #'evil-Surround-edit + + ;; expand-region + :v "v" #'er/expand-region + :v "V" #'er/contract-region + + ;; flycheck + :m "]e" #'next-error + :m "[e" #'previous-error + (:after flycheck + :map flycheck-error-list-mode-map + :n "C-n" #'flycheck-error-list-next-error + :n "C-p" #'flycheck-error-list-previous-error + :n "j" #'flycheck-error-list-next-error + :n "k" #'flycheck-error-list-previous-error + :n "RET" #'flycheck-error-list-goto-error) + + ;; flyspell + :m "]S" #'flyspell-correct-word-generic + :m "[S" #'flyspell-correct-previous-word-generic + + ;; git-gutter + :m "]d" #'git-gutter:next-hunk + :m "[d" #'git-gutter:previous-hunk + + ;; git-timemachine + (:after git-timemachine + (:map git-timemachine-mode-map + :n "C-p" #'git-timemachine-show-previous-revision + :n "C-n" #'git-timemachine-show-next-revision + :n "[[" #'git-timemachine-show-previous-revision + :n "]]" #'git-timemachine-show-next-revision + :n "q" #'git-timemachine-quit + :n "gb" #'git-timemachine-blame)) + + ;; gist + (:after gist + :map gist-list-menu-mode-map + :n "RET" #'+gist/open-current + :n "b" #'gist-browse-current-url + :n "c" #'gist-add-buffer + :n "d" #'gist-kill-current + :n "f" #'gist-fork + :n "q" #'quit-window + :n "r" #'gist-list-reload + :n "s" #'gist-star + :n "S" #'gist-unstar + :n "y" #'gist-print-current-url) + + ;; helm + (:after helm + (:map helm-map + "ESC" nil + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + "C-u" #'helm-delete-minibuffer-contents + "C-w" #'backward-kill-word + "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! + "C-b" #'backward-word + [left] #'backward-char + [right] #'forward-char + [escape] #'helm-keyboard-quit + [tab] #'helm-execute-persistent-action) + + (:after helm-files + (:map helm-generic-files-map + :e "ESC" #'helm-keyboard-quit) + (:map helm-find-files-map + "C-w" #'helm-find-files-up-one-level + "TAB" #'helm-execute-persistent-action)) + + (:after helm-ag + (:map helm-ag-map + "" #'helm-ag-edit))) + + ;; hl-todo + :m "]t" #'hl-todo-next + :m "[t" #'hl-todo-previous + + ;; ivy + (:after ivy + :map ivy-minibuffer-map + [escape] #'keyboard-escape-quit + "C-SPC" #'ivy-call-and-recenter + "TAB" #'ivy-partial + "M-v" #'yank + "M-z" #'undo + "C-r" #'evil-paste-from-register + "C-k" #'ivy-previous-line + "C-j" #'ivy-next-line + "C-l" #'ivy-alt-done + "C-w" #'ivy-backward-kill-word + "C-u" #'ivy-kill-line + "C-b" #'backward-word + "C-f" #'forward-word) + + ;; neotree + (:after neotree + :map neotree-mode-map + :n "g" nil + :n [tab] #'neotree-quick-look + :n "RET" #'neotree-enter + :n [backspace] #'evil-window-prev + :n "c" #'neotree-create-node + :n "r" #'neotree-rename-node + :n "d" #'neotree-delete-node + :n "j" #'neotree-next-line + :n "k" #'neotree-previous-line + :n "n" #'neotree-next-line + :n "p" #'neotree-previous-line + :n "h" #'+neotree/collapse-or-up + :n "l" #'+neotree/expand-or-open + :n "J" #'neotree-select-next-sibling-node + :n "K" #'neotree-select-previous-sibling-node + :n "H" #'neotree-select-up-node + :n "L" #'neotree-select-down-node + :n "G" #'evil-goto-line + :n "gg" #'evil-goto-first-line + :n "v" #'neotree-enter-vertical-split + :n "s" #'neotree-enter-horizontal-split + :n "q" #'neotree-hide + :n "R" #'neotree-refresh) + + ;; realgud + (:after realgud + :map realgud:shortkey-mode-map + :n "j" #'evil-next-line + :n "k" #'evil-previous-line + :n "h" #'evil-backward-char + :n "l" #'evil-forward-char + :m "n" #'realgud:cmd-next + :m "b" #'realgud:cmd-break + :m "B" #'realgud:cmd-clear + :n "c" #'realgud:cmd-continue) + + ;; rotate-text + :n "!" #'rotate-text + + ;; smart-forward + :nv "K" #'smart-up + :m "g]" #'smart-forward + :m "g[" #'smart-backward + + ;; undo-tree -- undo/redo for visual regions + :v "C-u" #'undo-tree-undo + :v "C-r" #'undo-tree-redo + + ;; yasnippet + (:after yasnippet + (:map yas-keymap + "C-e" #'+snippets/goto-end-of-field + "C-a" #'+snippets/goto-start-of-field + "" #'+snippets/goto-end-of-field + "" #'+snippets/goto-start-of-field + "" #'+snippets/delete-to-start-of-field + [escape] #'evil-normal-state + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) + (:map yas-minor-mode-map + :i "" yas-maybe-expand + :v "" #'+snippets/expand-on-region)) + + + ;; --- Major mode bindings -------------------------- + (:after markdown-mode + (:map markdown-mode-map + ;; fix conflicts with private bindings + "" nil + "" nil + "" nil)) + + + ;; --- Custom evil text-objects --------------------- + :textobj "a" #'evil-inner-arg #'evil-outer-arg + :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block + :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent + :textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up + :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down + + + ;; --- Built-in plugins ----------------------------- + (:after comint + ;; TAB auto-completion in term buffers + :map comint-mode-map [tab] #'company-complete) + + (:after debug + ;; For elisp debugging + :map debugger-mode-map + :n "RET" #'debug-help-follow + :n "e" #'debugger-eval-expression + :n "n" #'debugger-step-through + :n "c" #'debugger-continue) + + (:map help-mode-map + :n "[[" #'help-go-back + :n "]]" #'help-go-forward + :n "o" #'ace-link-help + :n "q" #'quit-window + :n "Q" #'+ivy-quit-and-resume) + + (:after vc-annotate + :map vc-annotate-mode-map + :n "q" #'kill-this-buffer + :n "d" #'vc-annotate-show-diff-revision-at-line + :n "D" #'vc-annotate-show-changeset-diff-revision-at-line + :n "SPC" #'vc-annotate-show-log-revision-at-line + :n "]]" #'vc-annotate-next-revision + :n "[[" #'vc-annotate-prev-revision + :n "TAB" #'vc-annotate-toggle-annotation-visibility + :n "RET" #'vc-annotate-find-revision-at-line)) + + +;; +;; Custom functionality +;; + +;; Fix ;/, as repeat-keys in evil-mode, without overriding ;/, bindings +(defmacro do-repeat! (command next-func prev-func) + "Repeat motions with ;/," + (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) + `(progn + (defun ,fn-sym (&rest _) + (define-key evil-motion-state-map (kbd ";") ',next-func) + (define-key evil-motion-state-map (kbd ",") ',prev-func)) + (advice-add #',command :before #',fn-sym)))) + +;; n/N +(do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) + +;; f/F/t/T/s/S +(after! evil-snipe + (setq evil-snipe-repeat-keys nil + evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; + + (do-repeat! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) + +;; */# +(after! evil-visualstar + (do-repeat! evil-visualstar/begin-search-forward + evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-visualstar/begin-search-backward + evil-ex-search-previous evil-ex-search-next)) + +(after! evil-easymotion + (let ((prefix (concat doom-leader-key " /"))) + ;; NOTE `evilem-default-keybinds' unsets all other keys on the prefix (in + ;; motion state) + (evilem-default-keybindings prefix) + (evilem-define (kbd (concat prefix " n")) #'evil-ex-search-next) + (evilem-define (kbd (concat prefix " N")) #'evil-ex-search-previous) + (evilem-define (kbd (concat prefix " s")) #'evil-snipe-repeat + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + (evilem-define (kbd (concat prefix " S")) #'evil-snipe-repeat-reverse + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))))) + + +;; +;; Keybinding fixes +;; + +;; This section is dedicated to "fixing" certain keys so that they behave +;; properly, more like vim, or how I like it. + +(map! (:map input-decode-map + [S-iso-lefttab] [backtab] + (:unless window-system "TAB" [tab])) ; Fix TAB in terminal + + ;; I want C-a and C-e to be a little smarter. C-a will jump to + ;; indentation. Pressing it again will send you to the true bol. Same goes + ;; for C-e, except it will ignore comments and trailing whitespace before + ;; jumping to eol. + :i "C-a" #'doom/backward-to-bol-or-indent + :i "C-e" #'doom/forward-to-last-non-comment-or-eol + :i "C-u" #'doom/backward-kill-to-bol-and-indent + + ;; textmate-esque newline insertion + :i [M-return] #'evil-open-below + :i [S-M-return] #'evil-open-above + ;; textmate-esque deletion + [M-backspace] #'doom/backward-kill-to-bol-and-indent + :i [backspace] #'delete-backward-char + :i [M-backspace] #'doom/backward-kill-to-bol-and-indent + ;; Emacsien motions for insert mode + :i "C-b" #'backward-word + :i "C-f" #'forward-word + + ;; Highjacks space/backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented blocks intelligently + ;; c) do none of this when inside a string + :i "SPC" #'doom/inflate-space-maybe + :i [remap delete-backward-char] #'doom/deflate-space-maybe + :i [remap newline] #'doom/newline-and-indent + + (:after org + (:map org-mode-map + :i [remap doom/inflate-space-maybe] #'org-self-insert-command + :i "C-e" #'org-end-of-line + :i "C-a" #'org-beginning-of-line)) + + ;; Restore common editing keys (and ESC) in minibuffer + (:map (minibuffer-local-map + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map + evil-ex-completion-map + evil-ex-search-keymap + read-expression-map) + [escape] #'abort-recursive-edit + "C-r" #'evil-paste-from-register + "C-a" #'move-beginning-of-line + "C-w" #'doom/minibuffer-kill-word + "C-u" #'doom/minibuffer-kill-line + "C-b" #'backward-word + "C-f" #'forward-word + "M-z" #'doom/minibuffer-undo) + + (:map messages-buffer-mode-map + "M-;" #'eval-expression + "A-;" #'eval-expression) + + (:map tabulated-list-mode-map + [remap evil-record-macro] #'doom/popup-close-maybe) + + (:after view + (:map view-mode-map "" #'View-quit-all))) diff --git a/modules/private/default/packages.el b/modules/private/default/packages.el new file mode 100644 index 000000000..08571bf1e --- /dev/null +++ b/modules/private/default/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; private/default/packages.el + +(package! emacs-snippets + :recipe (:fetcher github + :repo "hlissner/emacs-snippets" + :files ("*"))) From 46b5d5a64acbb398ee7c2477a54e52e1f6a831e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:29:56 -0500 Subject: [PATCH 028/145] Remove private/hlissner (moved to hlissner/doom-emacs-private repo) --- modules/private/hlissner/+bindings.el | 795 ------------------ modules/private/hlissner/+commands.el | 98 --- modules/private/hlissner/.gitignore | 2 - modules/private/hlissner/autoload/evil.el | 37 - modules/private/hlissner/autoload/hlissner.el | 53 -- modules/private/hlissner/config.el | 108 --- modules/private/hlissner/init.el | 52 -- 7 files changed, 1145 deletions(-) delete mode 100644 modules/private/hlissner/+bindings.el delete mode 100644 modules/private/hlissner/+commands.el delete mode 100644 modules/private/hlissner/.gitignore delete mode 100644 modules/private/hlissner/autoload/evil.el delete mode 100644 modules/private/hlissner/autoload/hlissner.el delete mode 100644 modules/private/hlissner/config.el delete mode 100644 modules/private/hlissner/init.el diff --git a/modules/private/hlissner/+bindings.el b/modules/private/hlissner/+bindings.el deleted file mode 100644 index 7ad4807d2..000000000 --- a/modules/private/hlissner/+bindings.el +++ /dev/null @@ -1,795 +0,0 @@ -;;; private/hlissner/+bindings.el -*- lexical-binding: t; -*- - -(defmacro find-file-in! (path &optional project-p) - "Returns an interactive function for searching files." - `(lambda () (interactive) - (let ((default-directory ,path)) - (call-interactively - ',(command-remapping - (if project-p - #'projectile-find-file - #'find-file)))))) - -(map! - [remap evil-jump-to-tag] #'projectile-find-tag - [remap find-tag] #'projectile-find-tag - ;; ensure there are no conflicts - :nmvo doom-leader-key nil - :nmvo doom-localleader-key nil) - -(map! - ;; --- Global keybindings --------------------------- - ;; Make M-x available everywhere - :gnvime "M-x" #'execute-extended-command - :gnvime "A-x" #'execute-extended-command - ;; Emacs debug utilities - :gnvime "M-;" #'eval-expression - :gnvime "M-:" #'doom/open-scratch-buffer - ;; Text-scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease - ;; Simple window navigation/manipulation - "C-`" #'doom/popup-toggle - "C-~" #'doom/popup-raise - "M-t" #'+workspace/new - "M-T" #'+workspace/display - "M-w" #'delete-window - "M-W" #'+workspace/close-workspace-or-frame - "M-n" #'evil-buffer-new - "M-N" #'make-frame - "M-1" (λ! (+workspace/switch-to 0)) - "M-2" (λ! (+workspace/switch-to 1)) - "M-3" (λ! (+workspace/switch-to 2)) - "M-4" (λ! (+workspace/switch-to 3)) - "M-5" (λ! (+workspace/switch-to 4)) - "M-6" (λ! (+workspace/switch-to 5)) - "M-7" (λ! (+workspace/switch-to 6)) - "M-8" (λ! (+workspace/switch-to 7)) - "M-9" (λ! (+workspace/switch-to 8)) - "M-0" #'+workspace/switch-to-last - ;; Other sensible, textmate-esque global bindings - :ne "M-r" #'+eval/buffer - :ne "M-R" #'+eval/region-and-replace - :ne "M-b" #'+eval/build - :ne "M-a" #'mark-whole-buffer - :ne "M-c" #'evil-yank - :ne "M-q" (if (daemonp) #'delete-frame #'save-buffers-kill-emacs) - :ne "M-f" #'swiper - :ne "C-M-f" #'doom/toggle-fullscreen - :n "M-s" #'save-buffer - :m "A-j" #'+hlissner:multi-next-line - :m "A-k" #'+hlissner:multi-previous-line - :nv "C-SPC" #'+evil:fold-toggle - :gnvimer "M-v" #'clipboard-yank - ;; Easier window navigation - :en "C-h" #'evil-window-left - :en "C-j" #'evil-window-down - :en "C-k" #'evil-window-up - :en "C-l" #'evil-window-right - - "C-x p" #'doom/other-popup - - - ;; --- ------------------------------------- - (:leader - :desc "Ex command" :nv ";" #'evil-ex - :desc "M-x" :nv ":" #'execute-extended-command - :desc "Pop up scratch buffer" :nv "x" #'doom/open-scratch-buffer - :desc "Org Capture" :nv "X" #'+org-capture/open - - ;; Most commonly used - :desc "Find file in project" :n "SPC" #'projectile-find-file - :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer - :desc "Switch buffer" :n "<" #'switch-to-buffer - :desc "Browse files" :n "." #'find-file - :desc "Toggle last popup" :n "~" #'doom/popup-toggle - :desc "Eval expression" :n "`" #'eval-expression - :desc "Blink cursor line" :n "DEL" #'+doom/blink-cursor - :desc "Jump to bookmark" :n "RET" #'bookmark-jump - - ;; C-u is used by evil - :desc "Universal argument" :n "u" #'universal-argument - :desc "window" :n "w" evil-window-map - - (:desc "previous..." :prefix "[" - :desc "Text size" :nv "[" #'text-scale-decrease - :desc "Buffer" :nv "b" #'doom/previous-buffer - :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk - :desc "Todo" :nv "t" #'hl-todo-previous - :desc "Error" :nv "e" #'previous-error - :desc "Workspace" :nv "w" #'+workspace/switch-left - :desc "Smart jump" :nv "h" #'smart-backward - :desc "Spelling error" :nv "s" #'evil-prev-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-previous-word-generic) - - (:desc "next..." :prefix "]" - :desc "Text size" :nv "]" #'text-scale-increase - :desc "Buffer" :nv "b" #'doom/next-buffer - :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk - :desc "Todo" :nv "t" #'hl-todo-next - :desc "Error" :nv "e" #'next-error - :desc "Workspace" :nv "w" #'+workspace/switch-right - :desc "Smart jump" :nv "l" #'smart-forward - :desc "Spelling error" :nv "s" #'evil-next-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) - - (:desc "search" :prefix "/" - :desc "Swiper" :nv "/" #'swiper - :desc "Imenu" :nv "i" #'imenu - :desc "Imenu across buffers" :nv "I" #'imenu-anywhere - :desc "Online providers" :nv "o" #'+jump/online-select) - - (:desc "workspace" :prefix "TAB" - :desc "Display tab bar" :n "TAB" #'+workspace/display - :desc "New workspace" :n "n" #'+workspace/new - :desc "Load workspace from file" :n "l" #'+workspace/load - :desc "Load last session" :n "L" (λ! (+workspace/load-session)) - :desc "Save workspace to file" :n "s" #'+workspace/save - :desc "Autosave current session" :n "S" #'+workspace/save-session - :desc "Switch workspace" :n "." #'+workspace/switch-to - :desc "Kill all buffers" :n "x" #'doom/kill-all-buffers - :desc "Delete session" :n "X" #'+workspace/kill-session - :desc "Delete this workspace" :n "d" #'+workspace/delete - :desc "Load session" :n "L" #'+workspace/load-session - :desc "Next workspace" :n "]" #'+workspace/switch-right - :desc "Previous workspace" :n "[" #'+workspace/switch-left - :desc "Switch to 1st workspace" :n "1" (λ! (+workspace/switch-to 0)) - :desc "Switch to 2nd workspace" :n "2" (λ! (+workspace/switch-to 1)) - :desc "Switch to 3rd workspace" :n "3" (λ! (+workspace/switch-to 2)) - :desc "Switch to 4th workspace" :n "4" (λ! (+workspace/switch-to 3)) - :desc "Switch to 5th workspace" :n "5" (λ! (+workspace/switch-to 4)) - :desc "Switch to 6th workspace" :n "6" (λ! (+workspace/switch-to 5)) - :desc "Switch to 7th workspace" :n "7" (λ! (+workspace/switch-to 6)) - :desc "Switch to 8th workspace" :n "8" (λ! (+workspace/switch-to 7)) - :desc "Switch to 9th workspace" :n "9" (λ! (+workspace/switch-to 8)) - :desc "Switch to last workspace" :n "0" #'+workspace/switch-to-last) - - (:desc "buffer" :prefix "b" - :desc "New empty buffer" :n "n" #'evil-buffer-new - :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer - :desc "Switch buffer" :n "B" #'switch-to-buffer - :desc "Kill buffer" :n "k" #'doom/kill-this-buffer - :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers - :desc "Save buffer" :n "s" #'save-buffer - :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer - :desc "Bury buffer" :n "z" #'bury-buffer - :desc "Next buffer" :n "]" #'doom/next-buffer - :desc "Previous buffer" :n "[" #'doom/previous-buffer - :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) - - (:desc "code" :prefix "c" - :desc "List errors" :n "x" #'flycheck-list-errors - :desc "Evaluate buffer/region" :n "e" #'+eval/buffer - :v "e" #'+eval/region - :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region - :desc "Build tasks" :nv "b" #'+eval/build - :desc "Jump to definition" :n "d" #'+jump/definition - :desc "Jump to references" :n "D" #'+jump/references - :desc "Open REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl) - - (:desc "file" :prefix "f" - :desc "Find file" :n "." #'find-file - :desc "Sudo find file" :n ">" #'doom/sudo-find-file - :desc "Find file in project" :n "/" #'projectile-find-file - :desc "Find file from here" :n "?" #'counsel-file-jump - :desc "Find other file" :n "a" #'projectile-find-other-file - :desc "Open project editorconfig" :n "c" #'editorconfig-find-current-editorconfig - :desc "Find file in dotfiles" :n "d" #'+hlissner/find-in-dotfiles - :desc "Browse dotfiles" :n "D" #'+hlissner/browse-dotfiles - :desc "Find file in emacs.d" :n "e" #'+hlissner/find-in-emacsd - :desc "Browse emacs.d" :n "E" #'+hlissner/browse-emacsd - :desc "Recent files" :n "r" #'recentf-open-files - :desc "Recent project files" :n "R" #'projectile-recentf - :desc "Yank filename" :n "y" #'+hlissner/yank-buffer-filename) - - (:desc "git" :prefix "g" - :desc "Git status" :n "S" #'magit-status - :desc "Git blame" :n "b" #'magit-blame - :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk - :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk - :desc "Git revert buffer" :n "R" #'vc-revert - :desc "List gists" :n "g" #'+gist:list - :desc "Next hunk" :nv "]" #'git-gutter:next-hunk - :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) - - (:desc "help" :prefix "h" - :n "h" help-map - :desc "Apropos" :n "a" #'apropos - :desc "Reload theme" :n "R" #'doom//reload-theme - :desc "Find library" :n "l" #'find-library - :desc "Toggle Emacs log" :n "m" #'doom/popup-toggle-messages - :desc "Command log" :n "L" #'global-command-log-mode - :desc "Describe function" :n "f" #'describe-function - :desc "Describe key" :n "k" #'describe-key - :desc "Describe char" :n "c" #'describe-char - :desc "Describe mode" :n "M" #'describe-mode - :desc "Describe variable" :n "v" #'describe-variable - :desc "Describe face" :n "F" #'describe-face - :desc "Describe DOOM setting" :n "s" #'doom/describe-setting - :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Find definition" :n "." #'+jump/definition - :desc "Find references" :n "/" #'+jump/references - :desc "Find documentation" :n "h" #'+jump/documentation - :desc "What face" :n "'" #'doom/what-face - :desc "What minor modes" :n ";" #'doom/what-minor-mode - :desc "Info" :n "i" #'info - :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) - - (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'counsel-yank-pop - :desc "From snippet" :nv "s" #'yas-insert-snippet) - - (:desc "notes" :prefix "n" - :desc "Find file in notes" :n "n" #'+hlissner/find-in-notes - :desc "Browse notes" :n "N" #'+hlissner/browse-notes - :desc "Org capture" :n "x" #'+org-capture/open - :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode - :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) - - (:desc "open" :prefix "o" - :desc "Default browser" :n "b" #'browse-url-of-file - :desc "Debugger" :n "d" #'+debug/open - :desc "REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl - :desc "Neotree" :n "n" #'+neotree/toggle - :desc "Terminal" :n "t" #'+term/open-popup - :desc "Terminal in project" :n "T" #'+term/open-popup-in-project - - ;; applications - :desc "APP: elfeed" :n "E" #'=rss - :desc "APP: email" :n "M" #'=email - :desc "APP: twitter" :n "T" #'=twitter - :desc "APP: regex" :n "X" #'=regex - - ;; macos - (:when IS-MAC - :desc "Reveal in Finder" :n "o" #'+macos/reveal-in-finder - :desc "Reveal project in Finder" :n "O" #'+macos/reveal-project-in-finder - :desc "Send to Transmit" :n "u" #'+macos/send-to-transmit - :desc "Send project to Transmit" :n "U" #'+macos/send-project-to-transmit - :desc "Send to Launchbar" :n "l" #'+macos/send-to-launchbar - :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar)) - - (:desc "project" :prefix "p" - :desc "Browse project" :n "." (find-file-in! (doom-project-root)) - :desc "Find file in project" :n "/" #'projectile-find-file - :desc "Run cmd in project root" :nv "!" #'projectile-run-shell-command-in-root - :desc "Switch project" :n "p" #'projectile-switch-project - :desc "Recent project files" :n "r" #'projectile-recentf - :desc "List project tasks" :n "t" #'+ivy/tasks - :desc "Pop term in project" :n "o" #'+term/open-popup-in-project - :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) - - (:desc "quit" :prefix "q" - :desc "Quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) - - (:desc "remote" :prefix "r" - :desc "Upload local" :n "u" #'+upload/local - :desc "Upload local (force)" :n "U" (λ! (+upload/local t)) - :desc "Download remote" :n "d" #'+upload/remote-download - :desc "Diff local & remote" :n "D" #'+upload/diff - :desc "Browse remote files" :n "." #'+upload/browse - :desc "Detect remote changes" :n ">" #'+upload/check-remote) - - (:desc "snippets" :prefix "s" - :desc "New snippet" :n "n" #'yas-new-snippet - :desc "Insert snippet" :nv "i" #'yas-insert-snippet - :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file - :desc "Find snippet" :n "S" #'+hlissner/find-in-snippets) - - (:desc "toggle" :prefix "t" - :desc "Flyspell" :n "s" #'flyspell-mode - :desc "Flycheck" :n "f" #'flycheck-mode - :desc "Line numbers" :n "l" #'doom/toggle-line-numbers - :desc "Fullscreen" :n "f" #'doom/toggle-fullscreen - :desc "Indent guides" :n "i" #'highlight-indentation-mode - :desc "Indent guides (column)" :n "I" #'highlight-indentation-current-column-mode - :desc "Impatient mode" :n "h" #'+impatient-mode/toggle - :desc "Big mode" :n "b" #'doom-big-font-mode - :desc "Evil goggles" :n "g" #'+evil-goggles/toggle)) - - - ;; --- Personal vim-esque bindings ------------------ - :n "zx" #'doom/kill-this-buffer - :n "ZX" #'bury-buffer - :n "]b" #'doom/next-buffer - :n "[b" #'doom/previous-buffer - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left - :m "gt" #'+workspace/switch-right - :m "gT" #'+workspace/switch-left - :m "gd" #'+jump/definition - :m "gD" #'+jump/references - :m "gh" #'+jump/documentation - :n "gp" #'+evil/reselect-paste - :n "gr" #'+eval:region - :n "gR" #'+eval/buffer - :v "gR" #'+eval:replace-region - :v "@" #'+evil:macro-on-all-lines - :n "g@" #'+evil:macro-on-all-lines - ;; repeat in visual mode (FIXME buggy) - :v "." #'evil-repeat - ;; don't leave visual mode after shifting - :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv - ;; paste from recent yank register (which isn't overwritten) - :v "C-p" "\"0p" - - (:map evil-window-map ; prefix "C-w" - ;; Navigation - "C-h" #'evil-window-left - "C-j" #'evil-window-down - "C-k" #'evil-window-up - "C-l" #'evil-window-right - "C-w" #'ace-window - ;; Swapping windows - "H" #'+evil/window-move-left - "J" #'+evil/window-move-down - "K" #'+evil/window-move-up - "L" #'+evil/window-move-right - "C-S-w" #'ace-swap-window - ;; Window undo/redo - "u" #'winner-undo - "C-u" #'winner-undo - "C-r" #'winner-redo - "o" #'doom/window-enlargen - ;; Delete window - "c" #'+workspace/close-window-or-workspace - "C-C" #'ace-delete-window) - - - ;; --- Plugin bindings ------------------------------ - ;; auto-yasnippet - :i [C-tab] #'aya-expand - :nv [C-tab] #'aya-create - - ;; company-mode (vim-like omnicompletion) - :i "C-SPC" #'+company/complete - (:prefix "C-x" - :i "C-l" #'+company/whole-lines - :i "C-k" #'+company/dict-or-keywords - :i "C-f" #'company-files - :i "C-]" #'company-etags - :i "s" #'company-ispell - :i "C-s" #'company-yasnippet - :i "C-o" #'company-capf - :i "C-n" #'company-dabbrev-code - :i "C-p" #'+company/dabbrev-code-previous) - (:after company - (:map company-active-map - ;; Don't interfere with `evil-delete-backward-word' in insert mode - "C-w" nil - "C-o" #'company-search-kill-others - "C-n" #'company-select-next - "C-p" #'company-select-previous - "C-h" #'company-quickhelp-manual-begin - "C-S-h" #'company-show-doc-buffer - "C-S-s" #'company-search-candidates - "C-s" #'company-filter-candidates - "C-SPC" #'company-complete-common - "C-h" #'company-quickhelp-manual-begin - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous - [escape] (λ! (company-abort) (evil-normal-state 1))) - ;; Automatically applies to `company-filter-map' - (:map company-search-map - "C-n" #'company-search-repeat-forward - "C-p" #'company-search-repeat-backward - "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort)) - - ;; counsel - (:after counsel - (:map counsel-ag-map - [backtab] #'+ivy/wgrep-occur ; search/replace on results - "C-SPC" #'ivy-call-and-recenter ; preview - "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) - - ;; evil-commentary - :n "gc" #'evil-commentary - - ;; evil-exchange - :n "gx" #'evil-exchange - - ;; evil-matchit - :nv [tab] #'+evil/matchit-or-toggle-fold - - ;; evil-magit - (:after evil-magit - :map (magit-status-mode-map magit-revision-mode-map) - :n "C-j" nil - :n "C-k" nil) - - ;; evil-mc - (:prefix "gz" - :nv "m" #'evil-mc-make-all-cursors - :nv "u" #'evil-mc-undo-all-cursors - :nv "z" #'+evil/mc-make-cursor-here - :nv "t" #'+evil/mc-toggle-cursors - :nv "n" #'evil-mc-make-and-goto-next-cursor - :nv "p" #'evil-mc-make-and-goto-prev-cursor - :nv "N" #'evil-mc-make-and-goto-last-cursor - :nv "P" #'evil-mc-make-and-goto-first-cursor - :nv "d" #'evil-mc-make-and-goto-next-match - :nv "D" #'evil-mc-make-and-goto-prev-match) - (:after evil-mc - :map evil-mc-key-map - :nv "C-n" #'evil-mc-make-and-goto-next-cursor - :nv "C-N" #'evil-mc-make-and-goto-last-cursor - :nv "C-p" #'evil-mc-make-and-goto-prev-cursor - :nv "C-P" #'evil-mc-make-and-goto-first-cursor) - - ;; evil-multiedit - :v "R" #'evil-multiedit-match-all - :n "M-d" #'evil-multiedit-match-symbol-and-next - :n "M-D" #'evil-multiedit-match-symbol-and-prev - :v "M-d" #'evil-multiedit-match-and-next - :v "M-D" #'evil-multiedit-match-and-prev - :nv "C-M-d" #'evil-multiedit-restore - (:after evil-multiedit - (:map evil-multiedit-state-map - "M-d" #'evil-multiedit-match-and-next - "M-D" #'evil-multiedit-match-and-prev - "RET" #'evil-multiedit-toggle-or-restrict-region) - (:map (evil-multiedit-state-map evil-multiedit-insert-state-map) - "C-n" #'evil-multiedit-next - "C-p" #'evil-multiedit-prev)) - - ;; evil-snipe - (:after evil-snipe - ;; Binding to switch to evil-easymotion/avy after a snipe - :map evil-snipe-parent-transient-map - "C-;" (λ! (require 'evil-easymotion) - (call-interactively - (evilem-create #'evil-snipe-repeat - :bind ((evil-snipe-scope 'whole-buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight)))))) - - ;; evil-surround - :v "S" #'evil-surround-region - :o "s" #'evil-surround-edit - :o "S" #'evil-Surround-edit - - ;; expand-region - :v "v" #'er/expand-region - :v "V" #'er/contract-region - - ;; flycheck - :m "]e" #'next-error - :m "[e" #'previous-error - (:after flycheck - :map flycheck-error-list-mode-map - :n "C-n" #'flycheck-error-list-next-error - :n "C-p" #'flycheck-error-list-previous-error - :n "j" #'flycheck-error-list-next-error - :n "k" #'flycheck-error-list-previous-error - :n "RET" #'flycheck-error-list-goto-error) - - ;; flyspell - :m "]S" #'flyspell-correct-word-generic - :m "[S" #'flyspell-correct-previous-word-generic - - ;; git-gutter - :m "]d" #'git-gutter:next-hunk - :m "[d" #'git-gutter:previous-hunk - - ;; git-timemachine - (:after git-timemachine - (:map git-timemachine-mode-map - :n "C-p" #'git-timemachine-show-previous-revision - :n "C-n" #'git-timemachine-show-next-revision - :n "[[" #'git-timemachine-show-previous-revision - :n "]]" #'git-timemachine-show-next-revision - :n "q" #'git-timemachine-quit - :n "gb" #'git-timemachine-blame)) - - ;; gist - (:after gist - :map gist-list-menu-mode-map - :n "RET" #'+gist/open-current - :n "b" #'gist-browse-current-url - :n "c" #'gist-add-buffer - :n "d" #'gist-kill-current - :n "f" #'gist-fork - :n "q" #'quit-window - :n "r" #'gist-list-reload - :n "s" #'gist-star - :n "S" #'gist-unstar - :n "y" #'gist-print-current-url) - - ;; helm - (:after helm - (:map helm-map - "ESC" nil - "C-S-n" #'helm-next-source - "C-S-p" #'helm-previous-source - "C-u" #'helm-delete-minibuffer-contents - "C-w" #'backward-kill-word - "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! - "C-b" #'backward-word - [left] #'backward-char - [right] #'forward-char - [escape] #'helm-keyboard-quit - [tab] #'helm-execute-persistent-action) - - (:after helm-files - (:map helm-generic-files-map - :e "ESC" #'helm-keyboard-quit) - (:map helm-find-files-map - "C-w" #'helm-find-files-up-one-level - "TAB" #'helm-execute-persistent-action)) - - (:after helm-ag - (:map helm-ag-map - "" #'helm-ag-edit))) - - ;; hl-todo - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous - - ;; ivy - (:after ivy - :map ivy-minibuffer-map - [escape] #'keyboard-escape-quit - "C-SPC" #'ivy-call-and-recenter - "TAB" #'ivy-partial - "M-v" #'yank - "M-z" #'undo - "C-r" #'evil-paste-from-register - "C-k" #'ivy-previous-line - "C-j" #'ivy-next-line - "C-l" #'ivy-alt-done - "C-w" #'ivy-backward-kill-word - "C-u" #'ivy-kill-line - "C-b" #'backward-word - "C-f" #'forward-word) - - ;; neotree - (:after neotree - :map neotree-mode-map - :n "g" nil - :n [tab] #'neotree-quick-look - :n "RET" #'neotree-enter - :n [backspace] #'evil-window-prev - :n "c" #'neotree-create-node - :n "r" #'neotree-rename-node - :n "d" #'neotree-delete-node - :n "j" #'neotree-next-line - :n "k" #'neotree-previous-line - :n "n" #'neotree-next-line - :n "p" #'neotree-previous-line - :n "h" #'+neotree/collapse-or-up - :n "l" #'+neotree/expand-or-open - :n "J" #'neotree-select-next-sibling-node - :n "K" #'neotree-select-previous-sibling-node - :n "H" #'neotree-select-up-node - :n "L" #'neotree-select-down-node - :n "G" #'evil-goto-line - :n "gg" #'evil-goto-first-line - :n "v" #'neotree-enter-vertical-split - :n "s" #'neotree-enter-horizontal-split - :n "q" #'neotree-hide - :n "R" #'neotree-refresh) - - ;; realgud - (:after realgud - :map realgud:shortkey-mode-map - :n "j" #'evil-next-line - :n "k" #'evil-previous-line - :n "h" #'evil-backward-char - :n "l" #'evil-forward-char - :m "n" #'realgud:cmd-next - :m "b" #'realgud:cmd-break - :m "B" #'realgud:cmd-clear - :n "c" #'realgud:cmd-continue) - - ;; rotate-text - :n "!" #'rotate-text - - ;; smart-forward - :nv "K" #'smart-up - :m "g]" #'smart-forward - :m "g[" #'smart-backward - - ;; undo-tree -- undo/redo for visual regions - :v "C-u" #'undo-tree-undo - :v "C-r" #'undo-tree-redo - - ;; yasnippet - (:after yasnippet - (:map yas-keymap - "C-e" #'+snippets/goto-end-of-field - "C-a" #'+snippets/goto-start-of-field - "" #'+snippets/goto-end-of-field - "" #'+snippets/goto-start-of-field - "" #'+snippets/delete-to-start-of-field - [escape] #'evil-normal-state - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) - (:map yas-minor-mode-map - :i "" yas-maybe-expand - :v "" #'+snippets/expand-on-region)) - - - ;; --- Major mode bindings -------------------------- - (:after markdown-mode - (:map markdown-mode-map - ;; fix conflicts with private bindings - "" nil - "" nil - "" nil)) - - - ;; --- Custom evil text-objects --------------------- - :textobj "a" #'evil-inner-arg #'evil-outer-arg - :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block - :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent - :textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up - :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down - - - ;; --- Built-in plugins ----------------------------- - (:after comint - ;; TAB auto-completion in term buffers - :map comint-mode-map [tab] #'company-complete) - - (:after debug - ;; For elisp debugging - :map debugger-mode-map - :n "RET" #'debug-help-follow - :n "e" #'debugger-eval-expression - :n "n" #'debugger-step-through - :n "c" #'debugger-continue) - - (:map help-mode-map - :n "[[" #'help-go-back - :n "]]" #'help-go-forward - :n "o" #'ace-link-help - :n "q" #'quit-window - :n "Q" #'+ivy-quit-and-resume) - - (:after vc-annotate - :map vc-annotate-mode-map - :n "q" #'kill-this-buffer - :n "d" #'vc-annotate-show-diff-revision-at-line - :n "D" #'vc-annotate-show-changeset-diff-revision-at-line - :n "SPC" #'vc-annotate-show-log-revision-at-line - :n "]]" #'vc-annotate-next-revision - :n "[[" #'vc-annotate-prev-revision - :n "TAB" #'vc-annotate-toggle-annotation-visibility - :n "RET" #'vc-annotate-find-revision-at-line)) - - -;; --- Custom key functionality --------------------- -(defmacro do-repeat! (command next-func prev-func) - "Repeat motions with ;/," - (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) - `(progn - (defun ,fn-sym (&rest _) - (define-key evil-motion-state-map (kbd ";") ',next-func) - (define-key evil-motion-state-map (kbd ",") ',prev-func)) - (advice-add #',command :before #',fn-sym)))) - -;; n/N -(do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) - -;; f/F/t/T/s/S -(after! evil-snipe - (setq evil-snipe-repeat-keys nil - evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; - - (do-repeat! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) - -;; */# -(after! evil-visualstar - (do-repeat! evil-visualstar/begin-search-forward - evil-ex-search-next evil-ex-search-previous) - (do-repeat! evil-visualstar/begin-search-backward - evil-ex-search-previous evil-ex-search-next)) - -;; evil-easymotion -(after! evil-easymotion - (let ((prefix (concat doom-leader-key " /"))) - ;; NOTE `evilem-default-keybinds' unsets all other keys on the prefix (in - ;; motion state) - (evilem-default-keybindings prefix) - (evilem-define (kbd (concat prefix " n")) #'evil-ex-search-next) - (evilem-define (kbd (concat prefix " N")) #'evil-ex-search-previous) - (evilem-define (kbd (concat prefix " s")) #'evil-snipe-repeat - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - (evilem-define (kbd (concat prefix " S")) #'evil-snipe-repeat-reverse - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))))) - - -;; -;; Keybinding fixes -;; - -;; This section is dedicated to "fixing" certain keys so that they behave -;; properly, more like vim, or how I like it. - -(map! (:map input-decode-map - [S-iso-lefttab] [backtab] - (:unless window-system "TAB" [tab])) ; Fix TAB in terminal - - ;; I want C-a and C-e to be a little smarter. C-a will jump to - ;; indentation. Pressing it again will send you to the true bol. Same goes - ;; for C-e, except it will ignore comments and trailing whitespace before - ;; jumping to eol. - :i "C-a" #'doom/backward-to-bol-or-indent - :i "C-e" #'doom/forward-to-last-non-comment-or-eol - :i "C-u" #'doom/backward-kill-to-bol-and-indent - - ;; textmate-esque newline insertion - :i [M-return] #'evil-open-below - :i [S-M-return] #'evil-open-above - ;; textmate-esque deletion - [M-backspace] #'doom/backward-kill-to-bol-and-indent - :i [backspace] #'delete-backward-char - :i [M-backspace] #'doom/backward-kill-to-bol-and-indent - ;; Emacsien motions for insert mode - :i "C-b" #'backward-word - :i "C-f" #'forward-word - - ;; Highjacks space/backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented blocks intelligently - ;; c) do none of this when inside a string - :i "SPC" #'doom/inflate-space-maybe - :i [remap delete-backward-char] #'doom/deflate-space-maybe - :i [remap newline] #'doom/newline-and-indent - - (:after org - (:map org-mode-map - :i [remap doom/inflate-space-maybe] #'org-self-insert-command - :i "C-e" #'org-end-of-line - :i "C-a" #'org-beginning-of-line)) - - ;; Restore common editing keys (and ESC) in minibuffer - (:map (minibuffer-local-map - minibuffer-local-ns-map - minibuffer-local-completion-map - minibuffer-local-must-match-map - minibuffer-local-isearch-map - evil-ex-completion-map - evil-ex-search-keymap - read-expression-map) - [escape] #'abort-recursive-edit - "C-r" #'evil-paste-from-register - "C-a" #'move-beginning-of-line - "C-w" #'doom/minibuffer-kill-word - "C-u" #'doom/minibuffer-kill-line - "C-b" #'backward-word - "C-f" #'forward-word - "M-z" #'doom/minibuffer-undo) - - (:map messages-buffer-mode-map - "M-;" #'eval-expression - "A-;" #'eval-expression) - - (:map tabulated-list-mode-map - [remap evil-record-macro] #'doom/popup-close-maybe) - - (:after view - (:map view-mode-map "" #'View-quit-all))) diff --git a/modules/private/hlissner/+commands.el b/modules/private/hlissner/+commands.el deleted file mode 100644 index 260a4d761..000000000 --- a/modules/private/hlissner/+commands.el +++ /dev/null @@ -1,98 +0,0 @@ -;;; private/hlissner/+commands.el -*- lexical-binding: t; -*- - -(defalias 'ex! 'evil-ex-define-cmd) - -;;; Commands defined elsewhere -;;(ex! "al[ign]" #'+evil:align) -;;(ex! "g[lobal]" #'+evil:global) - -;;; Custom commands -;; Editing -(ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me -(ex! "al[ign]" #'+evil:align) -(ex! "enhtml" #'+web:encode-html-entities) -(ex! "dehtml" #'+web:decode-html-entities) -(ex! "mc" #'+evil:mc) -(ex! "iedit" #'evil-multiedit-ex-match) -(ex! "na[rrow]" #'+evil:narrow-buffer) -(ex! "retab" #'+evil:retab) - -;; External resources -;; TODO (ex! "db" #'doom:db) -;; TODO (ex! "dbu[se]" #'doom:db-select) -;; TODO (ex! "go[ogle]" #'doom:google-search) -(ex! "lo[okup]" #'+jump:online) -(ex! "http" #'httpd-start) ; start http server -(ex! "repl" #'+eval:repl) ; invoke or send to repl -;; TODO (ex! "rx" 'doom:regex) ; open re-builder -(ex! "sh[ell]" #'+eshell:run) -(ex! "t[mux]" #'+tmux:run) ; send to tmux -(ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux -(ex! "x" #'doom/open-project-scratch-buffer) - -;; GIT -(ex! "gist" #'+gist:send) ; send current buffer/region to gist -(ex! "gistl" #'+gist:list) ; list gists by user -(ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab -(ex! "gissues" #'+vcs/git-browse-issues) ; show github issues -(ex! "git" #'magit-status) ; open magit status window -(ex! "gstage" #'magit-stage) -(ex! "gunstage" #'magit-unstage) -(ex! "gblame" #'magit-blame) -(ex! "grevert" #'git-gutter:revert-hunk) - -;; Dealing with buffers -(ex! "clean[up]" #'doom/cleanup-buffers) -(ex! "k[ill]" #'doom/kill-this-buffer) -(ex! "k[ill]all" #'+hlissner:kill-all-buffers) -(ex! "k[ill]m" #'+hlissner:kill-matching-buffers) -(ex! "k[ill]o" #'doom/kill-other-buffers) -(ex! "l[ast]" #'doom/popup-restore) -(ex! "m[sg]" #'view-echo-area-messages) -(ex! "pop[up]" #'doom/popup-this-buffer) - -;; Project navigation -(ex! "a" #'projectile-find-other-file) -(ex! "cd" #'+hlissner:cd) -(cond ((featurep! :completion ivy) - (ex! "ag" #'+ivy:ag) - (ex! "agc[wd]" #'+ivy:ag-cwd) - (ex! "rg" #'+ivy:rg) - (ex! "rgc[wd]" #'+ivy:rg-cwd) - (ex! "sw[iper]" #'+ivy:swiper) - (ex! "todo" #'+ivy:todo)) - ((featurep! :completion helm) - (ex! "ag" #'+helm:ag) - (ex! "agc[wd]" #'+helm:ag-cwd) - (ex! "rg" #'+helm:rg) - (ex! "rgc[wd]" #'+helm:rg-cwd) - (ex! "sw[oop]" #'+helm:swoop) - (ex! "todo" #'+helm:todo))) - -;; Project tools -(ex! "build" #'+eval/build) -(ex! "debug" #'+debug/run) -(ex! "er[rors]" #'flycheck-list-errors) - -;; File operations -(ex! "cp" #'+evil:copy-this-file) -(ex! "mv" #'+evil:move-this-file) -(ex! "rm" #'+evil:delete-this-file) - -;; Sessions/tabs -(ex! "sclear" #'+workspace/kill-session) -(ex! "sl[oad]" #'+workspace:load-session) -(ex! "ss[ave]" #'+workspace:save-session) -(ex! "tabc[lose]" #'+workspace:delete) -(ex! "tabclear" #'doom/kill-all-buffers) -(ex! "tabl[ast]" #'+workspace/switch-to-last) -(ex! "tabload" #'+workspace:load) -(ex! "tabn[ew]" #'+workspace:new) -(ex! "tabn[ext]" #'+workspace:switch-next) -(ex! "tabp[rev]" #'+workspace:switch-previous) -(ex! "tabr[ename]" #'+workspace:rename) -(ex! "tabs" #'+workspace/display) -(ex! "tabsave" #'+workspace:save) - -;; Org-mode -(ex! "cap" #'+org-capture/dwim) diff --git a/modules/private/hlissner/.gitignore b/modules/private/hlissner/.gitignore deleted file mode 100644 index d31426933..000000000 --- a/modules/private/hlissner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -snippets -.authinfo.gpg diff --git a/modules/private/hlissner/autoload/evil.el b/modules/private/hlissner/autoload/evil.el deleted file mode 100644 index 0845af2d2..000000000 --- a/modules/private/hlissner/autoload/evil.el +++ /dev/null @@ -1,37 +0,0 @@ -;;; private/hlissner/autoload/evil.el -*- lexical-binding: t; -*- -;;;###if (featurep! :feature evil) - -;;;###autoload (autoload '+hlissner:multi-next-line "private/hlissner/autoload/evil" nil t) -(evil-define-motion +hlissner:multi-next-line (count) - "Move down 6 lines." - :type line - (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode)))) - (evil-line-move (* 6 (or count 1))))) - -;;;###autoload (autoload '+hlissner:multi-previous-line "private/hlissner/autoload/evil" nil t) -(evil-define-motion +hlissner:multi-previous-line (count) - "Move up 6 lines." - :type line - (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode)))) - (evil-line-move (- (* 6 (or count 1)))))) - -;;;###autoload (autoload '+hlissner:cd "private/hlissner/autoload/evil" nil t) -(evil-define-command +hlissner:cd () - "Change `default-directory' with `cd'." - (interactive "") - (cd input)) - -;;;###autoload (autoload '+hlissner:kill-all-buffers "private/hlissner/autoload/evil" nil t) -(evil-define-command +hlissner:kill-all-buffers (&optional bang) - "Kill all buffers. If BANG, kill current session too." - (interactive "") - (if bang - (+workspace/kill-session) - (doom/kill-all-buffers))) - -;;;###autoload (autoload '+hlissner:kill-matching-buffers "private/hlissner/autoload/evil" nil t) -(evil-define-command +hlissner:kill-matching-buffers (&optional bang pattern) - "Kill all buffers matching PATTERN regexp. If BANG, only match project -buffers." - (interactive "") - (doom/kill-matching-buffers pattern bang)) diff --git a/modules/private/hlissner/autoload/hlissner.el b/modules/private/hlissner/autoload/hlissner.el deleted file mode 100644 index 236676fc2..000000000 --- a/modules/private/hlissner/autoload/hlissner.el +++ /dev/null @@ -1,53 +0,0 @@ -;;; private/hlissner/autoload/hlissner.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +hlissner/install-snippets () - "Install my snippets from https://github.com/hlissner/emacs-snippets into -private/hlissner/snippets." - (interactive) - (doom-fetch :github "hlissner/emacs-snippets" - (expand-file-name "snippets" (doom-module-path :private 'hlissner)))) - -;;;###autoload -(defun +hlissner/yank-buffer-filename () - "Copy the current buffer's path to the kill ring." - (interactive) - (if-let* ((filename (or buffer-file-name (bound-and-true-p list-buffers-directory)))) - (message (kill-new (abbreviate-file-name filename))) - (error "Couldn't find filename in current buffer"))) - -(defmacro +hlissner-def-finder! (name dir) - "Define a pair of find-file and browse functions." - `(progn - (defun ,(intern (format "+hlissner/find-in-%s" name)) () - (interactive) - (let ((default-directory ,dir) - projectile-project-name - projectile-require-project-root - projectile-cached-buffer-file-name - projectile-cached-project-root) - (call-interactively (command-remapping #'projectile-find-file)))) - (defun ,(intern (format "+hlissner/browse-%s" name)) () - (interactive) - (let ((default-directory ,dir)) - (call-interactively (command-remapping #'find-file)))))) - -;;;###autoload (autoload '+hlissner/find-in-templates "private/hlissner/autoload/hlissner" nil t) -;;;###autoload (autoload '+hlissner/browse-templates "private/hlissner/autoload/hlissner" nil t) -(+hlissner-def-finder! templates +file-templates-dir) - -;;;###autoload (autoload '+hlissner/find-in-snippets "private/hlissner/autoload/hlissner" nil t) -;;;###autoload (autoload '+hlissner/browse-snippets "private/hlissner/autoload/hlissner" nil t) -(+hlissner-def-finder! snippets +hlissner-snippets-dir) - -;;;###autoload (autoload '+hlissner/find-in-dotfiles "private/hlissner/autoload/hlissner" nil t) -;;;###autoload (autoload '+hlissner/browse-dotfiles "private/hlissner/autoload/hlissner" nil t) -(+hlissner-def-finder! dotfiles (expand-file-name ".dotfiles" "~")) - -;;;###autoload (autoload '+hlissner/find-in-emacsd "private/hlissner/autoload/hlissner" nil t) -;;;###autoload (autoload '+hlissner/browse-emacsd "private/hlissner/autoload/hlissner" nil t) -(+hlissner-def-finder! emacsd doom-emacs-dir) - -;;;###autoload (autoload '+hlissner/find-in-notes "private/hlissner/autoload/hlissner" nil t) -;;;###autoload (autoload '+hlissner/browse-notes "private/hlissner/autoload/hlissner" nil t) -(+hlissner-def-finder! notes +org-dir) diff --git a/modules/private/hlissner/config.el b/modules/private/hlissner/config.el deleted file mode 100644 index b034ad8c9..000000000 --- a/modules/private/hlissner/config.el +++ /dev/null @@ -1,108 +0,0 @@ -;;; private/hlissner/config.el -*- lexical-binding: t; -*- - -(defvar +hlissner-dir (file-name-directory load-file-name)) -(defvar +hlissner-snippets-dir (expand-file-name "snippets/" +hlissner-dir)) - -;; -(when (featurep! :feature evil) - (load! +bindings) ; my key bindings - (load! +commands)) ; my custom ex commands - - -;; -;; Global config -;; - -(setq epa-file-encrypt-to user-mail-address - auth-sources (list (expand-file-name ".authinfo.gpg" +hlissner-dir)) - +doom-modeline-buffer-file-name-style 'relative-from-project) - -(defun +hlissner*no-authinfo-for-tramp (orig-fn &rest args) - "Don't look into .authinfo for local sudo TRAMP buffers." - (let ((auth-sources (if (equal tramp-current-method "sudo") nil auth-sources))) - (apply orig-fn args))) -(advice-add #'tramp-read-passwd :around #'+hlissner*no-authinfo-for-tramp) - - -;; -;; Modules -;; - -(after! smartparens - ;; Auto-close more conservatively and expand braces on RET - (let ((unless-list '(sp-point-before-word-p - sp-point-after-word-p - sp-point-before-same-p))) - (sp-pair "'" nil :unless unless-list) - (sp-pair "\"" nil :unless unless-list)) - (sp-pair "{" nil :post-handlers '(("||\n[i]" "RET") ("| " " ")) - :unless '(sp-point-before-word-p sp-point-before-same-p)) - (sp-pair "(" nil :post-handlers '(("||\n[i]" "RET") ("| " " ")) - :unless '(sp-point-before-word-p sp-point-before-same-p)) - (sp-pair "[" nil :post-handlers '(("| " " ")) - :unless '(sp-point-before-word-p sp-point-before-same-p))) - -;; feature/evil -(after! evil-mc - ;; Make evil-mc resume its cursors when I switch to insert mode - (add-hook! 'evil-mc-before-cursors-created - (add-hook 'evil-insert-state-entry-hook #'evil-mc-resume-cursors nil t)) - (add-hook! 'evil-mc-after-cursors-deleted - (remove-hook 'evil-insert-state-entry-hook #'evil-mc-resume-cursors t))) - -;; feature/snippets -(after! yasnippet - ;; Don't use default snippets, use mine. - (setq yas-snippet-dirs - (append (list '+hlissner-snippets-dir) - (delq 'yas-installed-snippets-dir yas-snippet-dirs)))) - -;; completion/helm -(after! helm - ;; Hide header lines in helm. I don't like them - (set-face-attribute 'helm-source-header nil :height 0.1)) - -;; lang/org -(after! org-bullets - ;; The standard unicode characters are usually misaligned depending on the - ;; font. This bugs me. Personally, markdown #-marks for headlines are more - ;; elegant, so we use those. - (setq org-bullets-bullet-list '("#"))) - -;; app/irc -(after! circe - (setq +irc-notifications-watch-strings '("v0" "vnought" "hlissner")) - - (set! :irc "irc.snoonet.org" - `(:tls t - :nick "v0" - :port 6697 - :sasl-username ,(+pass-get-user "irc/snoonet.org") - :sasl-password ,(+pass-get-secret "irc/snoonet.org") - :channels (:after-auth "#ynought")))) - -;; app/email -(after! mu4e - (setq smtpmail-stream-type 'starttls - smtpmail-default-smtp-server "smtp.gmail.com" - smtpmail-smtp-server "smtp.gmail.com" - smtpmail-smtp-service 587) - - (set! :email "gmail.com" - '((mu4e-sent-folder . "/gmail.com/Sent Mail") - (mu4e-drafts-folder . "/gmail.com/Drafts") - (mu4e-trash-folder . "/gmail.com/Trash") - (mu4e-refile-folder . "/gmail.com/All Mail") - (smtpmail-smtp-user . "hlissner") - (user-mail-address . "hlissner@gmail.com") - (mu4e-compose-signature . "---\nHenrik"))) - - (set! :email "lissner.net" - '((mu4e-sent-folder . "/lissner.net/Sent Mail") - (mu4e-drafts-folder . "/lissner.net/Drafts") - (mu4e-trash-folder . "/lissner.net/Trash") - (mu4e-refile-folder . "/lissner.net/All Mail") - (smtpmail-smtp-user . "henrik@lissner.net") - (user-mail-address . "henrik@lissner.net") - (mu4e-compose-signature . "---\nHenrik Lissner")) - t)) diff --git a/modules/private/hlissner/init.el b/modules/private/hlissner/init.el deleted file mode 100644 index 37eb5c43a..000000000 --- a/modules/private/hlissner/init.el +++ /dev/null @@ -1,52 +0,0 @@ -;;; private/hlissner/init.el -*- lexical-binding: t; -*- - -;; An extra measure to prevent the flash of unstyled mode-line while Emacs is -;; booting up (when Doom is byte-compiled). -(setq-default mode-line-format nil) - -;; I've swapped these keys on my keyboard -(setq x-super-keysym 'alt - x-alt-keysym 'meta) - -(setq user-mail-address "henrik@lissner.net" - user-full-name "Henrik Lissner") - -(setq doom-big-font (font-spec :family "Fira Mono" :size 19)) - -(pcase (system-name) - ("proteus" - ;; My 13" laptop has very little screen estate, so we use a bitmap font - ;; there. For Doom, that means we need to take up less space! - (setq-default line-spacing 1) - - (setq doom-font (font-spec :family "kakwa kakwafont" :size 12) - doom-variable-pitch-font (font-spec :family "kakwa kakwafont") - doom-unicode-font (font-spec :family "UT Ttyp0") - ;; ui/doom-modeline - +doom-modeline-height 23 - ;; `doom-themes' - doom-neotree-enable-variable-pitch nil - doom-neotree-project-size 1.2 - doom-neotree-line-spacing 0 - doom-neotree-folder-size 1.0 - doom-neotree-chevron-size 0.6) - (add-hook! doom-big-font-mode - (setq +doom-modeline-height (if doom-big-font-mode 37 23))) - - ;; No highlighted bar in the mode-line - (setq +doom-modeline-bar-width 1) - (custom-set-faces '(doom-modeline-bar ((t (:background nil)))))) - - (_ - ;; Everywhere else, I have big displays and plenty of space, so use it! - (setq doom-font (font-spec :family "Fira Mono" :size 12) - doom-variable-pitch-font (font-spec :family "Fira Sans") - doom-unicode-font (font-spec :family "DejaVu Sans Mono") - org-ellipsis "  ") - - ;; Fira Mono doesn't have italics, so we highlight it instead. - (add-hook! doom-post-init - (set-face-attribute 'italic nil :weight 'ultra-light :foreground "#ffffff")) - - (add-hook! doom-big-font-mode - (setq +doom-modeline-height (if doom-big-font-mode 37 29))))) From 660857952bedb3e35de60c7b01b0b0a1086881f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:34:47 -0500 Subject: [PATCH 029/145] Update changelog --- CHANGELOG.org | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CHANGELOG.org b/CHANGELOG.org index 113e95879..1b319e219 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -12,6 +12,41 @@ - [[#200-jan-17-2017][2.0.0 (Jan 17, 2017)]] * Unreleased (develop) ++ *Module changes:* + + Removed =private/hlissner= and added =private/default=, which is serve as a + more generic "starter" module for new users. My private module is now at + [[https://github.com/hlissner/doom-emacs-private][hlissner/doom-emacs-private]]. ++ =general= + + Fix "peculiar error" messages when running =bin/doom-doctor=, caused by + poorly thought out error handling (see [[https://github.com/hlissner/doom-emacs/issues/175][#175]]). + + Fix ~doom/am-i-secure~ command. + + Add unicode symbols to package management commands. Looks a little nicer <3. + + Transform =recentf= entries into their absolute paths with symlinks resolved + (using ~file-truename~). + + Local data and cache files are no longer host-namespaced. Originally, this + was meant to facilitate using the same config files (symlinked) across + different computers (e.g. via dropbox). Byte-compiled packages on one + computer would cause errors on another, so I abandoned this practice, making + ~doom-host-dir~ unnecessary. + + Fix an issue during live byte-compilation (with auto-compile-on-save-mode) + where ~gc-cons-threshold~ would get set to 304mb in the user's active + session, causing freezes and stuttering. + + Improve error handling when byte compiling Doom. It now cleans up after + itself is something goes wrong. + + Fix =stringp= error thrown by ~doom-fetch~ in noninteractive sessions. + + =core-ui= Fix cryptic missing-font errors (also, they are warnings now). + + =core-projects= Add ~doom-project-find-file~ and ~doom-project-browse~ for + interactively fuzzy-finding and opening files in a directory/project. ++ =feature= + + =version-control= When evil-mode is available, start git commit message + buffers in insert mode (see [[https://github.com/hlissner/doom-emacs/issues/300][#300]]). ++ =ui= + + =doom-dashboard= Fix whitespace-mode turning the Doom dashboard into a + Christmas tree (by highlighting trailing whitespace). ++ =lang= + + =org= Change repo source for org-plus-contrib to emacsmirror. + + =java= Fix Doom install meghanada server while byte compiling your Emacs + configuration. * 2.0.8 (Dec 09, 2017) + *Module changes:* From 024e0407ebe39f397d1633e150dc8fb018b02214 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:49:49 -0500 Subject: [PATCH 030/145] private/default: fix old keybind references --- modules/private/default/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 72a7e0531..7f609749c 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -49,15 +49,15 @@ ;; Dealing with buffers (ex! "clean[up]" #'doom/cleanup-buffers) (ex! "k[ill]" #'doom/kill-this-buffer) - (ex! "k[ill]all" #'+hlissner:kill-all-buffers) - (ex! "k[ill]m" #'+hlissner:kill-matching-buffers) + (ex! "k[ill]all" #'+default:kill-all-buffers) + (ex! "k[ill]m" #'+default:kill-matching-buffers) (ex! "k[ill]o" #'doom/kill-other-buffers) (ex! "l[ast]" #'doom/popup-restore) (ex! "m[sg]" #'view-echo-area-messages) (ex! "pop[up]" #'doom/popup-this-buffer) ;; Project navigation (ex! "a" #'projectile-find-other-file) - (ex! "cd" #'+hlissner:cd) + (ex! "cd" #'+default:cd) (cond ((featurep! :completion ivy) (ex! "ag" #'+ivy:ag) (ex! "agc[wd]" #'+ivy:ag-cwd) @@ -153,8 +153,8 @@ :ne "M-f" #'swiper :ne "C-M-f" #'doom/toggle-fullscreen :n "M-s" #'save-buffer - :m "A-j" #'+hlissner:multi-next-line - :m "A-k" #'+hlissner:multi-previous-line + :m "A-j" #'+default:multi-next-line + :m "A-k" #'+default:multi-previous-line :nv "C-SPC" #'+evil:fold-toggle :gnvimer "M-v" #'clipboard-yank ;; Easier window navigation From ee1e376cbada69efab42301a77ed4bf51bddf8cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:50:07 -0500 Subject: [PATCH 031/145] private/default: fix incorrect autoload cookies --- modules/private/default/autoload/default.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/private/default/autoload/default.el b/modules/private/default/autoload/default.el index 4f329e789..09ffac273 100644 --- a/modules/private/default/autoload/default.el +++ b/modules/private/default/autoload/default.el @@ -8,12 +8,14 @@ (message (kill-new (abbreviate-file-name filename))) (error "Couldn't find filename in current buffer"))) +;;;###autoload (defmacro +default--def-browse-in! (name dir &optional prefix) (let ((prefix (cdr (doom-module-from-path load-file-name)))) `(defun ,(intern (format "%s/browse-%s" (or prefix '+default) name)) () (interactive) (doom-project-browse ,dir)))) +;;;###autoload (defmacro +default--def-find-in! (name dir) (let ((prefix (cdr (doom-module-from-path load-file-name)))) `(defun ,(intern (format "+%s/find-in-%s" prefix name)) () @@ -21,25 +23,25 @@ (doom-project-find-file ,dir)))) -;;;###autoload (autoload '+default/browse-project "private/default/autoload" nil t) -(+default--def-browse-in project (doom-project-root)) +;;;###autoload (autoload '+default/browse-project "private/default/autoload/default" nil t) +(+default--def-browse-in! project (doom-project-root)) -;;;###autoload (autoload '+default/find-in-templates "private/default/autoload" nil t) +;;;###autoload (autoload '+default/find-in-templates "private/default/autoload/default" nil t) (+default--def-find-in! templates +file-templates-dir) -;;;###autoload (autoload '+default/browse-templates "private/default/autoload" nil t) +;;;###autoload (autoload '+default/browse-templates "private/default/autoload/default" nil t) (+default--def-browse-in! templates +file-templates-dir) -;;;###autoload (autoload '+default/find-in-emacsd "private/default/autoload" nil t) +;;;###autoload (autoload '+default/find-in-emacsd "private/default/autoload/default" nil t) (+default--def-find-in! emacsd doom-emacs-dir) -;;;###autoload (autoload '+default/browse-emacsd "private/default/autoload" nil t) +;;;###autoload (autoload '+default/browse-emacsd "private/default/autoload/default" nil t) (+default--def-browse-in! emacsd doom-emacs-dir) -;;;###autoload (autoload '+default/find-in-notes "private/default/autoload" nil t) +;;;###autoload (autoload '+default/find-in-notes "private/default/autoload/default" nil t) (+default--def-find-in! notes +org-dir) -;;;###autoload (autoload '+default/browse-notes "private/default/autoload" nil t) +;;;###autoload (autoload '+default/browse-notes "private/default/autoload/default" nil t) (+default--def-browse-in! notes +org-dir) -;;;###autoload (autoload '+default/find-in-snippets "private/default/autoload" nil t) +;;;###autoload (autoload '+default/find-in-snippets "private/default/autoload/default" nil t) (+default--def-find-in! snippets +default-snippets-dir) ;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' From e1e658145ea48114b356b1d8789bfe83c9091c36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 02:55:28 -0500 Subject: [PATCH 032/145] private/default: remove vestigial file --- modules/private/default/+commands.el | 99 ---------------------------- 1 file changed, 99 deletions(-) delete mode 100644 modules/private/default/+commands.el diff --git a/modules/private/default/+commands.el b/modules/private/default/+commands.el deleted file mode 100644 index fb8eb939b..000000000 --- a/modules/private/default/+commands.el +++ /dev/null @@ -1,99 +0,0 @@ -;;; private/default/+commands.el -*- lexical-binding: t; -*- - -(defalias 'ex! 'evil-ex-define-cmd) - -;; Commands defined elsewhere -;;(ex! "al[ign]" #'+evil:align) -;;(ex! "g[lobal]" #'+evil:global) - -;; Custom commands -;; Editing -(ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me -(ex! "al[ign]" #'+evil:align) -(ex! "enhtml" #'+web:encode-html-entities) -(ex! "dehtml" #'+web:decode-html-entities) -(ex! "mc" #'+evil:mc) -(ex! "iedit" #'evil-multiedit-ex-match) -(ex! "na[rrow]" #'+evil:narrow-buffer) -(ex! "retab" #'+evil:retab) - -;; External resources -;; TODO (ex! "db" #'doom:db) -;; TODO (ex! "dbu[se]" #'doom:db-select) -;; TODO (ex! "go[ogle]" #'doom:google-search) -(ex! "lo[okup]" #'+jump:online) -(ex! "http" #'httpd-start) ; start http server -(ex! "repl" #'+eval:repl) ; invoke or send to repl -;; TODO (ex! "rx" 'doom:regex) ; open re-builder -(ex! "sh[ell]" #'+eshell:run) -(ex! "t[mux]" #'+tmux:run) ; send to tmux -(ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux -(ex! "x" #'doom/open-project-scratch-buffer) - -;; GIT -(ex! "gist" #'+gist:send) ; send current buffer/region to gist -(ex! "gistl" #'+gist:list) ; list gists by user -(ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab -(ex! "gissues" #'+vcs/git-browse-issues) ; show github issues -(ex! "git" #'magit-status) ; open magit status window -(ex! "gstage" #'magit-stage) -(ex! "gunstage" #'magit-unstage) -(ex! "gblame" #'magit-blame) -(ex! "grevert" #'git-gutter:revert-hunk) - -;; Dealing with buffers -(ex! "clean[up]" #'doom/cleanup-buffers) -(ex! "k[ill]" #'doom/kill-this-buffer) -(ex! "k[ill]all" #'+hlissner:kill-all-buffers) -(ex! "k[ill]m" #'+hlissner:kill-matching-buffers) -(ex! "k[ill]o" #'doom/kill-other-buffers) -(ex! "l[ast]" #'doom/popup-restore) -(ex! "m[sg]" #'view-echo-area-messages) -(ex! "pop[up]" #'doom/popup-this-buffer) - -;; Project navigation -(ex! "a" #'projectile-find-other-file) -(ex! "cd" #'+hlissner:cd) -(cond ((featurep! :completion ivy) - (ex! "ag" #'+ivy:ag) - (ex! "agc[wd]" #'+ivy:ag-cwd) - (ex! "rg" #'+ivy:rg) - (ex! "rgc[wd]" #'+ivy:rg-cwd) - (ex! "sw[iper]" #'+ivy:swiper) - (ex! "todo" #'+ivy:todo)) - ((featurep! :completion helm) - (ex! "ag" #'+helm:ag) - (ex! "agc[wd]" #'+helm:ag-cwd) - (ex! "rg" #'+helm:rg) - (ex! "rgc[wd]" #'+helm:rg-cwd) - (ex! "sw[oop]" #'+helm:swoop) - (ex! "todo" #'+helm:todo))) - -;; Project tools -(ex! "build" #'+eval/build) -(ex! "debug" #'+debug/run) -(ex! "er[rors]" #'flycheck-list-errors) - -;; File operations -(ex! "cp" #'+evil:copy-this-file) -(ex! "mv" #'+evil:move-this-file) -(ex! "rm" #'+evil:delete-this-file) - -;; Sessions/tabs -(ex! "sclear" #'+workspace/kill-session) -(ex! "sl[oad]" #'+workspace:load-session) -(ex! "ss[ave]" #'+workspace:save-session) -(ex! "tabc[lose]" #'+workspace:delete) -(ex! "tabclear" #'doom/kill-all-buffers) -(ex! "tabl[ast]" #'+workspace/switch-to-last) -(ex! "tabload" #'+workspace:load) -(ex! "tabn[ew]" #'+workspace:new) -(ex! "tabn[ext]" #'+workspace:switch-next) -(ex! "tabp[rev]" #'+workspace:switch-previous) -(ex! "tabr[ename]" #'+workspace:rename) -(ex! "tabs" #'+workspace/display) -(ex! "tabsave" #'+workspace:save) - -;; Org-mode -(ex! "cap" #'+org-capture/dwim) - From 9924a43506fb4b3c8c22017c073647fcab470c15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 03:26:27 -0500 Subject: [PATCH 033/145] Fix doom-module-pairs returning pairs in arbitrary order This causes errors because of arbitrary module load order. This happens in Emacs 25.x, because hash-table-keys there uses maphash, while in Emacs 26+ it uses cl-loop. --- core/core-packages.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 52def1d97..5930ed5b1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -276,7 +276,8 @@ is sorted by order of insertion unless ALL-P is non-nil. If ALL-P is non-nil, include all modules, enabled or otherwise." (unless (hash-table-p doom-modules) (error "doom-modules is uninitialized")) - (hash-table-keys doom-modules)) + (cl-loop for key being the hash-keys of doom-modules + collect key)) (defun doom-packages--display-benchmark () (message "Doom loaded %s packages across %d modules in %.03fs" From a2a5910126210dfb721ab71bdee02bc89c8ba60d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 14:30:17 -0500 Subject: [PATCH 034/145] Revise docstring for doom-{etc,cache}-dir --- core/core.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index 79f9e1481..278b5bb34 100644 --- a/core/core.el +++ b/core/core.el @@ -40,17 +40,15 @@ that are safe to share across systems (if this config is symlinked across several computers).") (defvar doom-etc-dir (concat doom-local-dir "etc/") - "Directory for non-volatile storage. For volatile story, see `doom-cache-dir'. + "Directory for non-volatile storage. -Use this for dependencies like servers or config files that are stable (i.e. it -should be unlikely that you need to delete them if something goes wrong).") +Use this for files that don't change much, like servers binaries, external +dependencies or long-term shared data.") (defvar doom-cache-dir (concat doom-local-dir "cache/") "Directory for volatile storage. -Deleted when `doom/reset' is called. Use this for transient files; on-the-fly -like caches and temporary files. Anything that you don't mind deleting if there -are problems.") +Use this for files that change often, like cache files.") (defvar doom-packages-dir (concat doom-local-dir "packages/") "Where package.el and quelpa plugins (and their caches) are stored.") From 9d661ff71ed23fe5a1a5ea526763126f4757872b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 14:30:36 -0500 Subject: [PATCH 035/145] Move ac-php-tags-path & recentf-save-file to doom-cache-dir --- core/core-editor.el | 2 +- modules/lang/php/config.el | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 8cdf4014b..b53ea98f8 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -138,7 +138,7 @@ with functions that require it (like modeline segments)." (def-package! recentf :hook (doom-init . recentf-mode) :config - (setq recentf-save-file (concat doom-etc-dir "recentf") + (setq recentf-save-file (concat doom-cache-dir "recentf") recentf-max-menu-items 0 recentf-max-saved-items 300 recentf-filename-handlers '(file-truename) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 33b9d3373..3dfc1aa4e 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -84,8 +84,7 @@ :config (unless (executable-find "phpctags") (warn "php-mode: phpctags isn't installed, auto-completion will be gimped")) - - (setq ac-php-tags-path (concat doom-etc-dir "ac-php/"))) + (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) ;; From f9e5ef2b51bd8606d22684bee2007869d92a8c3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 16:15:29 -0500 Subject: [PATCH 036/145] Fix recentf not excluding doom-local-dir --- core/core-editor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index b53ea98f8..0b5f72ebb 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -146,7 +146,7 @@ with functions that require it (like modeline segments)." (list "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) - (concat "^" (abbreviate-file-name (file-truename doom-local-dir)))))) + (concat "^" (file-truename doom-local-dir))))) ;; From c417d732c8edba41d5c57ff580020281550916bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 16:16:12 -0500 Subject: [PATCH 037/145] private/default: fix wrong-type-argument error while byte-compiling --- modules/private/default/autoload/default.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/private/default/autoload/default.el b/modules/private/default/autoload/default.el index 09ffac273..4381c044b 100644 --- a/modules/private/default/autoload/default.el +++ b/modules/private/default/autoload/default.el @@ -9,15 +9,15 @@ (error "Couldn't find filename in current buffer"))) ;;;###autoload -(defmacro +default--def-browse-in! (name dir &optional prefix) - (let ((prefix (cdr (doom-module-from-path load-file-name)))) - `(defun ,(intern (format "%s/browse-%s" (or prefix '+default) name)) () +(defmacro +default--def-browse-in! (name dir) + (let ((prefix (cdr (doom-module-from-path (or load-file-name byte-compile-current-file))))) + `(defun ,(intern (format "%s/browse-%s" prefix name)) () (interactive) (doom-project-browse ,dir)))) ;;;###autoload (defmacro +default--def-find-in! (name dir) - (let ((prefix (cdr (doom-module-from-path load-file-name)))) + (let ((prefix (cdr (doom-module-from-path (or load-file-name byte-compile-current-file))))) `(defun ,(intern (format "+%s/find-in-%s" prefix name)) () (interactive) (doom-project-find-file ,dir)))) From e641a386acf6e55e5cff6e7f20bbecdd8168dc48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 16:16:43 -0500 Subject: [PATCH 038/145] private/default: fix malformed-function error while byte-compiling --- modules/private/default/config.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 7f609749c..0dc0581e2 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -536,14 +536,15 @@ ;; evil-snipe (:after evil-snipe - ;; Binding to switch to evil-easymotion/avy after a snipe - :map evil-snipe-parent-transient-map - "C-;" (λ! (require 'evil-easymotion) - (call-interactively - (evilem-create #'evil-snipe-repeat - :bind ((evil-snipe-scope 'whole-buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight)))))) + (:after evil-easymotion + ;; Binding to switch to evil-easymotion/avy after a snipe + :map evil-snipe-parent-transient-map + "C-;" (λ! (require 'evil-easymotion) + (call-interactively + (evilem-create #'evil-snipe-repeat + :bind ((evil-snipe-scope 'whole-buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))))))) ;; evil-surround :v "S" #'evil-surround-region From 6a0e4bd0db0913c6b891b67fadd4ae5b785f8613 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 16:24:43 -0500 Subject: [PATCH 039/145] doom-initialize-packages: reinit packages after modules --- core/core-packages.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 5930ed5b1..59435de9f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -190,13 +190,14 @@ This aggressively reloads core autoload files." (noninteractive (not interactive))) (load file noerror :nomessage :nosuffix)) ('error - (error (format "(doom-initialize-packages) %s in %s: %s" - (car ex) - (file-relative-name file doom-emacs-dir) - (error-message-string ex)) - :error))))) + (lwarn 'doom-initialize-packages :warning + "%s in %s: %s" + (car ex) + (file-relative-name file doom-emacs-dir) + (error-message-string ex)))))) (when (or force-p (not doom-modules)) - (setq doom-modules nil) + (setq doom-modules nil + doom-packages nil) (_load (concat doom-core-dir "core.el") nil 'interactive) (_load (expand-file-name "init.el" doom-emacs-dir)) (when load-p From 1ef50bd5faf9e654a4a010f23bad0a4aa69f8b74 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 19:00:56 -0500 Subject: [PATCH 040/145] private/default: fix whitespace in bindings --- modules/private/default/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 0dc0581e2..015999aca 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -256,13 +256,13 @@ (:desc "code" :prefix "c" :desc "List errors" :n "x" #'flycheck-list-errors :desc "Evaluate buffer/region" :n "e" #'+eval/buffer - :v "e" #'+eval/region + :v "e" #'+eval/region :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region :desc "Build tasks" :nv "b" #'+eval/build :desc "Jump to definition" :n "d" #'+jump/definition :desc "Jump to references" :n "D" #'+jump/references :desc "Open REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl) + :v "r" #'+eval:repl) (:desc "file" :prefix "f" :desc "Find file" :n "." #'find-file @@ -328,7 +328,7 @@ :desc "Default browser" :n "b" #'browse-url-of-file :desc "Debugger" :n "d" #'+debug/open :desc "REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl + :v "r" #'+eval:repl :desc "Neotree" :n "n" #'+neotree/toggle :desc "Terminal" :n "t" #'+term/open-popup :desc "Terminal in project" :n "T" #'+term/open-popup-in-project From 89f07f88c50f23e3def3be9d5acc26653077b4b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 22:13:48 -0500 Subject: [PATCH 041/145] General & minor refactor --- core/core-packages.el | 53 +++++++++++++++++++++++-------------------- core/core-ui.el | 8 +++---- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 59435de9f..78d69cd3d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -77,7 +77,7 @@ missing) and shouldn't be deleted.") "The load path of built in Emacs libraries.") (defvar doom--package-load-path () - "The load path of package libraries installed via ELPA or QUELPA.") + "The load path of package libraries installed via ELPA and QUELPA.") (defvar doom--base-load-path (append (list doom-core-dir doom-modules-dir) @@ -130,31 +130,34 @@ are installed. If you byte-compile core/core.el, this function will be avoided to speed up startup." - ;; Called early during initialization; only use native functions! + ;; Called early during initialization; only use native (and cl-lib) functions! (when (or force-p (not doom-init-p)) - (setq load-path doom--base-load-path - package-activated-list nil) - ;; Ensure core folders exist - (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) - (unless (file-directory-p dir) - (make-directory dir t))) - ;; Ensure core packages are installed - (condition-case _ (package-initialize t) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize t))) - (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) - (when core-packages - (message "Installing core packages") - (package-refresh-contents) - (dolist (package core-packages) - (let ((inhibit-message t)) - (package-install package)) - (if (package-installed-p package) - (message "✓ Installed %s" package) - (error "✕ Couldn't install %s" package))) - (message "Installing core packages...done"))) - (setq doom-init-p t))) + ;; Speed things up with a `load-path' for only the bare essentials + (let ((load-path doom--base-load-path)) + ;; Ensure core folders exist, otherwise we get errors + (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) + (unless (file-directory-p dir) + (make-directory dir t))) + ;; Ensure package.el is initialized; we use its state + (setq package-activated-list nil) + (condition-case _ (package-initialize t) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize t))) + ;; Ensure core packages are installed + (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) + (when core-packages + (message "Installing core packages") + (unless doom--refreshed-p + (package-refresh-contents)) + (dolist (package core-packages) + (let ((inhibit-message t)) + (package-install package)) + (if (package-installed-p package) + (message "✓ Installed %s" package) + (error "✕ Couldn't install %s" package))) + (message "Installing core packages...done"))) + (setq doom-init-p t)))) (defun doom-initialize-load-path (&optional force-p) (when (or force-p (not doom--package-load-path)) diff --git a/core/core-ui.el b/core/core-ui.el index ec0573665..2252b3df5 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -259,8 +259,7 @@ local value, whether or not it's permanent-local. Therefore, we cycle (def-package! hideshow ; built-in :commands (hs-minor-mode hs-toggle-hiding hs-already-hidden-p) - :config - (setq hs-hide-comments-when-hiding-all nil)) + :config (setq hs-hide-comments-when-hiding-all nil)) (def-package! highlight-indentation :commands (highlight-indentation-mode highlight-indentation-current-column-mode)) @@ -310,9 +309,8 @@ local value, whether or not it's permanent-local. Therefore, we cycle ;; Helps us distinguish stacked delimiter pairs. Especially in parentheses-drunk ;; languages like Lisp. (def-package! rainbow-delimiters - :commands rainbow-delimiters-mode - :config (setq rainbow-delimiters-max-face-count 3) - :init (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)) + :hook (lisp-mode . rainbow-delimiters-mode) + :config (setq rainbow-delimiters-max-face-count 3)) ;; For a distractions-free-like UI, that dynamically resizes margets and can ;; center a buffer. From 79f3f5dbb04ba5fda7df6ab130fd5d67f53fe2d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Dec 2017 22:14:22 -0500 Subject: [PATCH 042/145] Add modules/private to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f29afbc1e..47cf11c70 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .cask/ var/ /init.el +modules/private/ # emacs tempfiles that shouldn't be there .mc-lists.el From 208fbb17269ea42cc043ffda0801b0b7ba8c13ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Dec 2017 15:08:00 -0500 Subject: [PATCH 043/145] Fix invalid-file-location when capturing to todo template #296 --- modules/lang/org/+capture.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index b7c34a869..5debb99a4 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -10,16 +10,19 @@ ;; anywhere I can call org-capture (whether or not Emacs is open/running), ;; like, say, from qutebrowser, vimperator, dmenu or a global keybinding. +(defvar +org-default-todo-file "todo.org" + "TODO") + (defvar +org-default-notes-file "notes.org" "TODO") (defvar org-capture-templates '(("t" "Todo" entry - (file+headline (expand-file-name "todo.org" +org-dir) "Inbox") + (file+headline +org-default-todo-file "Inbox") "* [ ] %?\n%i" :prepend t :kill-buffer t) ("n" "Notes" entry - (file+headline org-default-notes-file "Inbox") + (file+headline +org-default-notes-file "Inbox") "* %u %?\n%i" :prepend t :kill-buffer t))) From b0c73c486e1d0ebc79a686e6960194909086fc07 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Dec 2017 15:13:36 -0500 Subject: [PATCH 044/145] lang/org: resolve +org-dir later Gives users more of a chance to change +org-dir before paths are resolved with it. Addresses #296 --- modules/lang/org/+attach.el | 8 ++++---- modules/lang/org/autoload/org-attach.el | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 94988d99e..564bb02e8 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -15,7 +15,7 @@ ;; + `+org-attach/url' ;; + :org [FILE/URL] -(defvar +org-attach-dir (expand-file-name ".attach/" +org-dir) +(defvar +org-attach-dir ".attach/" "Where to store attachments (relative to current org file).") @@ -30,7 +30,7 @@ (advice-add #'org-download-enable :override #'ignore) :config - (setq-default org-download-image-dir +org-attach-dir + (setq-default org-download-image-dir org-attach-directory org-download-heading-lvl nil org-download-timestamp "_%Y%m%d_%H%M%S") @@ -61,12 +61,12 @@ ;; (after! org - (setq org-attach-directory +org-attach-dir) + (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) (push (car (last (split-string +org-attach-dir "/" t))) projectile-globally-ignored-directories) (after! recentf - (push (format "%s.+$" (regexp-quote +org-attach-dir)) + (push (format "%s.+$" (regexp-quote org-attach-directory)) recentf-exclude))) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 0cd9a7380..fa057a016 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -98,7 +98,7 @@ the cursor." (delete-region (match-beginning 0) (match-end 0)) (newline)) (cond ((image-type-from-file-name filename) - (when (file-in-directory-p filename +org-attach-dir) + (when (file-in-directory-p filename org-attach-directory) (setq filename (file-relative-name filename +org-dir))) (insert (concat (if (= org-download-image-html-width 0) @@ -124,9 +124,7 @@ the cursor." (let* ((context (save-match-data (org-element-context))) (file (org-link-unescape (org-element-property :path context))) (default-directory - (if (string-prefix-p - (concat "./" (car (last (split-string +org-attach-dir "/" t)))) - file) + (if (file-in-directory-p file org-attach-directory) +org-dir default-directory))) (apply orig-fn args)) From 86934fe1a451ed272b7d8639035a2271f7e38c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlad=20Myhajli=C4=8Denko?= Date: Mon, 25 Dec 2017 14:30:17 +0200 Subject: [PATCH 045/145] Fix typo --- modules/tools/password-store/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index 6705fa6a8..f22d18393 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -37,7 +37,7 @@ (and (or (string-match-p "https?://" url) (error "Field for %s doesn't look like an url" item)) (browse-url url)) - (error "Username not found."))) + (error "url not found."))) (defun +pass-ivy-action--get-field (item) (let* ((data (+pass--get-entry item)) From 04820bc022cd5ed12fcee8115d06da5ad5324ab8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Dec 2017 18:59:44 -0500 Subject: [PATCH 046/145] Fix TAB in ivy only half-triggering auto-completion #303 --- modules/private/default/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 015999aca..13e11ec3c 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -633,7 +633,6 @@ :map ivy-minibuffer-map [escape] #'keyboard-escape-quit "C-SPC" #'ivy-call-and-recenter - "TAB" #'ivy-partial "M-v" #'yank "M-z" #'undo "C-r" #'evil-paste-from-register From b5cb8a0527cf52a551fcbc53c152074472037052 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Dec 2017 19:09:55 -0500 Subject: [PATCH 047/145] Disable show-trailing-whitespace in doom dashboard #297 --- modules/ui/doom-dashboard/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 3a68a4621..3a8b0b7d7 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -26,6 +26,7 @@ loading.") (read-only-mode +1) (setq truncate-lines t) (setq-local whitespace-style nil) + (setq-local show-trailing-whitespace nil) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist))) From c5a7d2cb25c32a982d7cfbc854cfab122c59997a Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Tue, 26 Dec 2017 15:08:45 +0800 Subject: [PATCH 048/145] add fish-mode file-template. --- modules/feature/file-templates/config.el | 2 +- modules/feature/file-templates/templates/fish-mode/__ | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 modules/feature/file-templates/templates/fish-mode/__ diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index b8d6fcf10..fe4fb4ff6 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -110,5 +110,5 @@ ("/\\(index\\|main\\)\\.slim$" "__" slim-mode) ;; Shell scripts ("\\.z?sh$" "__" sh-mode) + ("\\.fish$" "__" fish-mode) ("\\.zunit$" "__zunit" sh-mode)))) - diff --git a/modules/feature/file-templates/templates/fish-mode/__ b/modules/feature/file-templates/templates/fish-mode/__ new file mode 100644 index 000000000..a4ef95db3 --- /dev/null +++ b/modules/feature/file-templates/templates/fish-mode/__ @@ -0,0 +1,3 @@ +#!/usr/bin/env fish + +$0 From e5dcdadd5e866efd303e2a8f8d67cb697ff81337 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 14:14:36 -0500 Subject: [PATCH 049/145] lang/cc: (when ...) -> :when --- modules/lang/cc/config.el | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 9563ef452..124740fbe 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -163,19 +163,27 @@ compilation database is present in the project.") ;; -;; Plugins +;; Company plugins ;; -(when (featurep! :completion company) - (def-package! company-cmake :after cmake-mode) +(def-package! company-cmake + :when (featurep! :completion company) + :after cmake-mode) - (def-package! company-irony :after irony) +(def-package! company-irony + :when (featurep! :completion company) + :after irony) + +(def-package! company-irony-c-headers + :when (featurep! :completion company) + :after company-irony) + +(def-package! company-glsl + :when (featurep! :completion company) + :after glsl-mode + :config + (if (executable-find "glslangValidator") + (warn "glsl-mode: couldn't find glslangValidator, disabling company-glsl") + (set! :company-backend 'glsl-mode '(company-glsl)))) - (def-package! company-irony-c-headers :after company-irony) - (def-package! company-glsl - :after glsl-mode - :config - (if (executable-find "glslangValidator") - (warn "glsl-mode: couldn't find glslangValidator, disabling company-glsl") - (set! :company-backend 'glsl-mode '(company-glsl))))) From a02edc1d0106f1ff882b9e58ef8846c9c883dfca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 18:12:15 -0500 Subject: [PATCH 050/145] lang/cc: map cmake-mode to .cmake files --- modules/lang/cc/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 124740fbe..fb2e6ef71 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -144,7 +144,8 @@ compilation database is present in the project.") ;; (def-package! cmake-mode - :mode "CMakeLists\\.txt$" + :mode "/CMakeLists\\.txt$" + :mode "\\.cmake\\$" :config (set! :company-backend 'cmake-mode '(company-cmake company-yasnippet))) From 750b74379dd86fd08d1ff4bff3753359c36ef374 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 18:12:36 -0500 Subject: [PATCH 051/145] lang/cc: add rtags support #305 --- modules/lang/cc/config.el | 45 +++++++++++++++++++++++++++++++++++++ modules/lang/cc/packages.el | 10 +++++---- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index fb2e6ef71..0bb7b1a02 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -188,3 +188,48 @@ compilation database is present in the project.") (set! :company-backend 'glsl-mode '(company-glsl)))) +;; +;; Rtags Support +;; + +(def-package! rtags + :after cc-mode + :config + (if (not (executable-find "rdm")) + (warn "cc-mode: couldn't find rdm, disabling rtags support") + (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) + (set! :jump '(c-mode c++-mode) + :definition #'rtags-find-symbol-at-point + :references #'rtags-find-references-at-point)) + + (setq rtags-autostart-diagnostics t + rtags-use-bookmarks nil + rtags-jump-to-first-match nil + rtags-results-buffer-other-window t) + + (defun +cc|cleanup-rdm-maybe () + "Shut down the rtags daemon, if it's running." + (when (and (processp rtags-rdm-process) + (not (memq (process-status rtags-rdm-process) '(exit signal))) + (not (doom-buffers-in-mode '(c-mode c++-mode)))) + (rtags-cancel-process))) + (add-hook 'doom-cleanup-hook #'+cc|cleanup-rdm-maybe) + (add-hook 'rtags-jump-hook #'evil-set-jump) + (add-hook 'rtags-after-find-file-hook #'recenter)) + +(def-package! ivy-rtags + :when (featurep! :completion ivy) + :after rtags + :init + ;; NOTE Ivy integration breaks when rtags is byte-compiled with Emacs 26 or + ;; later, so we un-byte-compile it before we load it. + (eval-when-compile + (when (>= emacs-major-version 26) + (when-let* ((elc-file (locate-library "rtags.elc" t doom--package-load-path))) + (delete-file elc-file)))) + :config (setq rtags-display-result-backend 'ivy)) + +(def-package! helm-rtags + :when (featurep! :completion helm) + :after rtags + :config (setq rtags-display-result-backend 'helm)) diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index 8109c1886..24f69c2e6 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -8,14 +8,16 @@ (package! glsl-mode) (package! irony) (package! irony-eldoc) -(package! opencl-mode) (package! modern-cpp-font-lock) - -(when (featurep! :feature syntax-checker) - (package! flycheck-irony)) +(package! opencl-mode) (when (featurep! :completion company) (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")) (package! company-irony) (package! company-irony-c-headers)) +(package! rtags) +(when (featurep! :completion ivy) + (package! ivy-rtags)) +(when (featurep! :completion helm) + (package! helm-rtags)) From 222a2955e2c0b6e989107ac617889ba18424376d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:24:12 -0500 Subject: [PATCH 052/145] lang/cc: refactor rtags integration #305 --- modules/lang/cc/config.el | 45 +++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 0bb7b1a02..79c022d6f 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -195,25 +195,38 @@ compilation database is present in the project.") (def-package! rtags :after cc-mode :config - (if (not (executable-find "rdm")) - (warn "cc-mode: couldn't find rdm, disabling rtags support") - (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) - (set! :jump '(c-mode c++-mode) - :definition #'rtags-find-symbol-at-point - :references #'rtags-find-references-at-point)) - (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil - rtags-jump-to-first-match nil - rtags-results-buffer-other-window t) + ;; If not using ivy or helm to view results, use a pop-up window rather + ;; than displaying it in the current window... + rtags-results-buffer-other-window t + ;; ...and don't auto-jump to first match before making a selection. + rtags-jump-to-first-match nil) + + (defun +cc|init-rtags-server-maybe () + "Start the rtags server if it isn't already running." + (unless (or (processp rtags-rdm-process) + (cl-loop for proc in (list-system-processes) + for cmd = (cdr (assq 'args (process-attributes proc))) + if (string-match-p "/rdm\\_>" cmd) + return t)) + (message "Starting rtags server") + (rtags-start-process-unless-running))) + + (let ((bins (cl-remove-if-not #'executable-find '("rdm" "rc")))) + (if (/= (length bins) 2) + (warn "cc-mode: couldn't find %s, disabling rtags support" bins) + (add-hook! (c-mode c++-mode) #'+cc|init-rtags-server-maybe) + (set! :jump '(c-mode c++-mode) + :definition #'rtags-find-symbol-at-point + :references #'rtags-find-references-at-point))) + + (add-hook 'doom-cleanup-hook #'rtags-cancel-process) + + ;; Use rtags-imenu instead of imenu/counsel-imenu + (map! (:when (featurep 'ivy) :map ivy-mode-map [remap imenu] nil) + :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) - (defun +cc|cleanup-rdm-maybe () - "Shut down the rtags daemon, if it's running." - (when (and (processp rtags-rdm-process) - (not (memq (process-status rtags-rdm-process) '(exit signal))) - (not (doom-buffers-in-mode '(c-mode c++-mode)))) - (rtags-cancel-process))) - (add-hook 'doom-cleanup-hook #'+cc|cleanup-rdm-maybe) (add-hook 'rtags-jump-hook #'evil-set-jump) (add-hook 'rtags-after-find-file-hook #'recenter)) From 48539dacbca4b817aeddb3d00b39880d97d36b4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:26:42 -0500 Subject: [PATCH 053/145] feature/jump: add {ivy,helm}-xref --- modules/feature/jump/config.el | 12 ++++++++++++ modules/feature/jump/packages.el | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/modules/feature/jump/config.el b/modules/feature/jump/config.el index db7a65069..9c0bdcd15 100644 --- a/modules/feature/jump/config.el +++ b/modules/feature/jump/config.el @@ -82,6 +82,18 @@ properties: ;; Packages ;; +(def-package! ivy-xref + :when (featurep! :completion ivy) + :after xref + :config (setq xref-show-xrefs-function #'ivy-xref-show-xrefs)) + + +(def-package! helm-xref + :when (featurep! :completion helm) + :after xref + :config (setq xref-show-xrefs-function #'helm-xref-show-xrefs)) + + (def-package! dumb-jump :commands (dumb-jump-go dumb-jump-quick-look dumb-jump-back dumb-jump-result-follow) diff --git a/modules/feature/jump/packages.el b/modules/feature/jump/packages.el index 4dce3ac0d..b346e7803 100644 --- a/modules/feature/jump/packages.el +++ b/modules/feature/jump/packages.el @@ -9,3 +9,7 @@ ;; ((featurep! :completion helm) ;; (package! helm-gtags))) +(when (featurep! :completion ivy) + (package! ivy-xref)) +(when (featurep! :completion helm) + (package! helm-xref)) From e8b9c7dba7a04e3961cfa74912cc04c373b42d54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:26:59 -0500 Subject: [PATCH 054/145] feature/jump: remove gxref + commented out ggtags config --- modules/feature/jump/config.el | 25 ------------------------- modules/feature/jump/packages.el | 7 ------- 2 files changed, 32 deletions(-) diff --git a/modules/feature/jump/config.el b/modules/feature/jump/config.el index 9c0bdcd15..1c2cc0e56 100644 --- a/modules/feature/jump/config.el +++ b/modules/feature/jump/config.el @@ -104,28 +104,3 @@ properties: ((featurep! :completion helm) 'helm) (t 'popup)))) - -(def-package! gxref - :commands (gxref-xref-backend - gxref-create-db - gxref-update-db - gxref-single-update-db - gxref-set-project-dir) - :init - (setq-default xref-backend-functions '(gxref-xref-backend t))) - - -;; (def-package! ggtags -;; :commands (ggtags-find-tag-dwim -;; ggtags-find-tag-mouse -;; ggtags-find-definition -;; ggtags-find-reference -;; ggtags-find-other-symbol -;; ggtags-find-tag-regexp -;; ggtags-idutils-query -;; ggtags-grep -;; ggtags-find-file -;; ggtags-query-replace -;; ggtags-delete-tags -;; ggtags-explain-tags)) - diff --git a/modules/feature/jump/packages.el b/modules/feature/jump/packages.el index b346e7803..712158bb2 100644 --- a/modules/feature/jump/packages.el +++ b/modules/feature/jump/packages.el @@ -2,13 +2,6 @@ ;;; feature/jump/packages.el (package! dumb-jump) -(package! gxref) -;; (package! ggtags) -;; (cond ((featurep! :completion ivy) -;; (package! counsel-gtags)) -;; ((featurep! :completion helm) -;; (package! helm-gtags))) - (when (featurep! :completion ivy) (package! ivy-xref)) (when (featurep! :completion helm) From e024144f4f5a4a6d29050d4e05d4e25d813be1fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:27:14 -0500 Subject: [PATCH 055/145] Add doom-cleanup-hook to doom/cleanup-buffers --- core/autoload/buffers.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 0b6815021..d54028680 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -308,6 +308,7 @@ project." (defun doom/cleanup-buffers (&optional all-p) "Clean up buried and inactive process buffers in the current workspace." (interactive "P") + (run-hooks 'doom-cleanup-hook) (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) (n 0)) (mapc #'kill-buffer buffers) From 649c9649c17c97407053ca300fdf8e834adc86ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:27:49 -0500 Subject: [PATCH 056/145] app/rss: elfeed-org after elfeed *and* org --- modules/app/rss/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 343e74bd2..6cdce9a3c 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -56,7 +56,7 @@ (def-package! elfeed-org - :after elfeed + :after (:all org elfeed) :config (setq rmh-elfeed-org-files (let ((default-directory +org-dir)) From 10110ad9d26884601189db552a04605223539d71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:35:55 -0500 Subject: [PATCH 057/145] lang/cc: kill emacs-spawned rdm on quit #305 --- modules/lang/cc/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 79c022d6f..74671c545 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -211,7 +211,9 @@ compilation database is present in the project.") if (string-match-p "/rdm\\_>" cmd) return t)) (message "Starting rtags server") - (rtags-start-process-unless-running))) + (rtags-start-process-unless-running) + ;; Emacs-spawned rdm should be temporary + (add-hook 'kill-emacs-hook #'rtags-cancel-process))) (let ((bins (cl-remove-if-not #'executable-find '("rdm" "rc")))) (if (/= (length bins) 2) From 0b2e6abac6f6e1afc23f314098e9fd8c8fba37a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:39:20 -0500 Subject: [PATCH 058/145] lang/cc: don't undo ivy-mode-map remapping --- modules/lang/cc/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 74671c545..7894de1d5 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -226,8 +226,7 @@ compilation database is present in the project.") (add-hook 'doom-cleanup-hook #'rtags-cancel-process) ;; Use rtags-imenu instead of imenu/counsel-imenu - (map! (:when (featurep 'ivy) :map ivy-mode-map [remap imenu] nil) - :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) + (map! :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) (add-hook 'rtags-jump-hook #'evil-set-jump) (add-hook 'rtags-after-find-file-hook #'recenter)) From 2eb0c4adb6e2442ea5ae7e44618306c184e202dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:39:33 -0500 Subject: [PATCH 059/145] completion/ivy: remap globally --- modules/completion/ivy/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index bcd027078..bca99444e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -43,8 +43,7 @@ immediately runs it on the current candidate (ending the ivy session)." (after! magit (setq magit-completing-read-function #'ivy-completing-read)) (after! yasnippet (push #'+ivy-yas-prompt yas-prompt-functions)) - (map! :map ivy-mode-map - [remap apropos] #'counsel-apropos + (map! [remap apropos] #'counsel-apropos [remap describe-face] #'counsel-describe-face [remap find-file] #'counsel-find-file [remap switch-to-buffer] #'ivy-switch-buffer From 62f7b2a9f4bb2295b30a6e6100e6ddb2bfe465c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 19:53:48 -0500 Subject: [PATCH 060/145] lang/cc: add flycheck-irony back to packages.el (whoops) --- modules/lang/cc/packages.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index 24f69c2e6..8151bc4fd 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -11,6 +11,9 @@ (package! modern-cpp-font-lock) (package! opencl-mode) +(when (featurep! :feature syntax-checker) + (package! flycheck-irony)) + (when (featurep! :completion company) (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")) (package! company-irony) From fa98d79bf4021885512526c8eda9cf46230a33a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 23:34:17 -0500 Subject: [PATCH 061/145] lang/cc: rtags-completions-enabled = nil #305 --- modules/lang/cc/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 7894de1d5..2fed3728f 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -197,6 +197,7 @@ compilation database is present in the project.") :config (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil + rtags-completions-enabled nil ;; If not using ivy or helm to view results, use a pop-up window rather ;; than displaying it in the current window... rtags-results-buffer-other-window t From 869a85a46b08bc88fde9c244fa8df47fe3f0f0c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Dec 2017 23:39:21 -0500 Subject: [PATCH 062/145] lang/cc: new command +cc/reload-compile-commands #305 --- modules/lang/cc/autoload.el | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 046ed54db..d41c34faa 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -1,5 +1,24 @@ ;;; lang/cc/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +cc/reload-compile-commands (&optional force-p) + "Reload the current project's compile_commands.json file." + (interactive "P") + (unless (memq major-mode '(c-mode c++-mode objc-mode)) + (user-error "Not a C/C++/ObjC buffer")) + (unless (doom-project-has! "compile_commands.json") + (user-error "No compile_commands.json file")) + ;; first rtag + (when (and (featurep 'rtags) + rtags-enabled + (executable-find "rc")) + (with-temp-buffer + (message "Reloaded compile commands for rtags daemon") + (rtags-call-rc :silent t "-J" (doom-project-root)))) + ;; then irony + (when (and (featurep 'irony) irony-mode) + (+cc|irony-init-compile-options))) + ;;;###autoload (defun +cc*align-lambda-arglist (orig-fun &rest args) "Improve indentation of continued C++11 lambda function opened as argument." From e833a16e04bd25f093ab37e805e13d83a87ca9f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 00:11:09 -0500 Subject: [PATCH 063/145] lang/cc: +cc/reload-compile-commands => +cc/reload-compile-db #305 --- modules/lang/cc/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index d41c34faa..390816f1e 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -1,8 +1,8 @@ ;;; lang/cc/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +cc/reload-compile-commands (&optional force-p) - "Reload the current project's compile_commands.json file." +(defun +cc/reload-compile-db (&optional force-p) + "Reload the current project's JSON compilation database." (interactive "P") (unless (memq major-mode '(c-mode c++-mode objc-mode)) (user-error "Not a C/C++/ObjC buffer")) From 0da3c563b7fa9500aa14aabd0327da42b9032984 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 00:32:11 -0500 Subject: [PATCH 064/145] lang/cc: update readme #305 --- modules/lang/cc/README.org | 62 +++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/modules/lang/cc/README.org b/modules/lang/cc/README.org index 767519879..72526207d 100644 --- a/modules/lang/cc/README.org +++ b/modules/lang/cc/README.org @@ -5,26 +5,36 @@ This module adds support for the C-family of languages: C, C++, and Objective-C. + Code completion (~company-irony~) + eldoc support (~irony-eldoc~) + Syntax-checking (~flycheck-irony~) -+ Code navigation (~irony~) ++ Code navigation (~rtags~) + File Templates ([[../../feature/file-templates/templates/c-mode][c-mode]], [[../../feature/file-templates/templates/c++-mode][c++-mode]]) + Snippets ([[https://github.com/hlissner/emacs-snippets/tree/master/cc-mode][cc-mode]], [[https://github.com/hlissner/emacs-snippets/tree/master/c-mode][c-mode]], [[https://github.com/hlissner/emacs-snippets/tree/master/c++-mode][c++-mode]]) + Several improvements to C++11 indentation and syntax highlighting. #+begin_quote -C contends with Haskell and Ruby for my favorite language. That said, it's more accurate to say I write C, but with two or three C++ features. +C contends with Haskell and Ruby for my favorite language. That said, it's more +accurate to say I write C, but a C++ feature or three. -The module provides nominal support for Objective-C, which I really only use to inspect generated glue code for iOS mobile apps. Otherwise, I prefer Swift. +The module provides nominal support for Objective-C, which I really only use to +inspect generated glue code for iOS mobile apps. Otherwise, I prefer Swift. #+end_quote * Table of Contents :TOC: - [[#install][Install]] - - [[#macos][MacOS]] - - [[#arch-linux][Arch Linux]] + - [[#irony-server][irony-server]] + - [[#rtags][rtags]] +- [[#configure][Configure]] + - [[#compile-settings][Compile settings]] * Install -This module requires ~irony-server~ for most of its features, which depends on ~cmake~ and ~libclang~. +This module requires: -** MacOS ++ irony-server ++ rtags + +** irony-server +Irony powers the code completion, eldoc and syntax checking systems. + +*** MacOS Due to linking issues, MacOS users must compile irony-server manually: #+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") @@ -49,10 +59,46 @@ popd rm -rf irony-mode #+END_SRC -** Arch Linux +*** Arch Linux #+BEGIN_SRC sh :tangle (if (doom-system-os 'arch) "yes") sudo pacman --needed --noconfirm -S clang cmake #+END_SRC Then run ~M-x irony-install-server~ in Emacs. +** rtags +Code navigation requires an [[https://github.com/Andersbakken/rtags][rtags]] server (~rdm~) installed and running. This +should be available through your OS's package manager. + +This module will auto-start ~rdm~ when you open C/C++ buffers (so long as one +isn't already). If you prefer to run it yourself, outside of Emacs: + +#+BEGIN_SRC sh +rdm & +rc -J $PROJECT_ROOT # loads PROJECT_ROOT's compile_commands.json +#+END_SRC + +* Configure +** Compile settings +By default, a set of default compile settings are defined in +~+cc-compiler-options~ for C, C++ and Objective C. Irony, rtags and flycheck +will fall back to these. + +To make these tools aware of project specific build settings, you need a JSON +[[https://sarcasm.github.io/notes/dev/compilation-database.html#ninja][compilation database]] present (i.e. a ~compile_commands.json~ file). + +There are [[https://sarcasm.github.io/notes/dev/compilation-database.html][many ways to generate one]]. I use [[http://www.cmake.org/][CMake]] and [[https://github.com/rizsotto/Bear][bear]]: + +#+BEGIN_SRC sh +# For CMake projects +cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON . + +# For non-CMake projects +make clean +bear make +#+END_SRC + +#+begin_quote +Use ~M-x +cc/reload-compile-db~ to reload your compile db in an already-open +C/C++/ObjC buffer. +#+end_quote From 854b26af28a2313e55aaad685edf116c9bfc9b5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 00:42:04 -0500 Subject: [PATCH 065/145] lang/cc: fix rtags-cancel-process preventing emacs quit --- modules/lang/cc/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 2fed3728f..75c26cbed 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -214,7 +214,7 @@ compilation database is present in the project.") (message "Starting rtags server") (rtags-start-process-unless-running) ;; Emacs-spawned rdm should be temporary - (add-hook 'kill-emacs-hook #'rtags-cancel-process))) + (add-hook! kill-emacs (ignore-errors (rtags-cancel-process))))) (let ((bins (cl-remove-if-not #'executable-find '("rdm" "rc")))) (if (/= (length bins) 2) From 0a9a992e818b56136ab1ae0efbb2331dbf02c6e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 00:49:08 -0500 Subject: [PATCH 066/145] lang/cc: remove +cc|init-rtags-server-maybe The rtags-start-process-unless-running function does exactly the same thing, making +cc|init-rtags-server-maybe redundant. Relevant to #305 --- modules/lang/cc/config.el | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 75c26cbed..aa5021713 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -204,27 +204,16 @@ compilation database is present in the project.") ;; ...and don't auto-jump to first match before making a selection. rtags-jump-to-first-match nil) - (defun +cc|init-rtags-server-maybe () - "Start the rtags server if it isn't already running." - (unless (or (processp rtags-rdm-process) - (cl-loop for proc in (list-system-processes) - for cmd = (cdr (assq 'args (process-attributes proc))) - if (string-match-p "/rdm\\_>" cmd) - return t)) - (message "Starting rtags server") - (rtags-start-process-unless-running) - ;; Emacs-spawned rdm should be temporary - (add-hook! kill-emacs (ignore-errors (rtags-cancel-process))))) - (let ((bins (cl-remove-if-not #'executable-find '("rdm" "rc")))) (if (/= (length bins) 2) (warn "cc-mode: couldn't find %s, disabling rtags support" bins) - (add-hook! (c-mode c++-mode) #'+cc|init-rtags-server-maybe) + (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) (set! :jump '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point :references #'rtags-find-references-at-point))) (add-hook 'doom-cleanup-hook #'rtags-cancel-process) + (add-hook! kill-emacs (ignore-errors (rtags-cancel-process))) ;; Use rtags-imenu instead of imenu/counsel-imenu (map! :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) From 06e76c8f49693d22d2225aa94e43bd806f90c910 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 01:03:15 -0500 Subject: [PATCH 067/145] lang/org: fix drag'n'drop in org-mode #307 Caused by references to long gone functions. --- modules/lang/org/autoload/org-attach.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index fa057a016..554549575 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -78,7 +78,7 @@ the cursor." (defun +org-attach-download-dnd (uri action) "TODO" (if (eq major-mode 'org-mode) - (+org-attach:url uri) + (+org-attach/uri uri) (let ((dnd-protocol-alist (rassq-delete-all '+org-attach-download-dnd (copy-alist dnd-protocol-alist)))) @@ -113,9 +113,9 @@ the cursor." (t (insert (format "%s [[./%s][%s]] " - (org-attach--icon filename) + (+org-attach--icon filename) (file-relative-name filename buffer-file-name) - (file-name-nondirectory (directory-file-name rel-path))))))) + (file-name-nondirectory (directory-file-name filename))))))) ;;;###autoload (defun +org-attach*relative-to-attach-dir (orig-fn &rest args) From bee92590961bce08d2bb2d5b003c34b6fb3ed00c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 13:24:14 -0500 Subject: [PATCH 068/145] ui/doom-dashboard: add +doom-dashboard-pwd-policy option #309 Gives the user control over how the dashboard's default-directory is set. The default is to set it to the project root of the last open buffer. --- core/autoload/buffers.el | 2 -- modules/ui/doom-dashboard/config.el | 40 ++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index d54028680..2e6ae47ba 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -130,8 +130,6 @@ buffers. If there's nothing left, switch to `doom-fallback-buffer'. See do (dotimes (_i (abs n)) (funcall move-func))))) - (when (eq (current-buffer) (doom-fallback-buffer)) - (cd project-dir)) (current-buffer))) ;;;###autoload diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 3a8b0b7d7..e3eff4591 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -13,10 +13,25 @@ "A list of functions that determine whether to inhibit the dashboard the loading.") +(defvar +doom-dashboard-pwd-policy 'last-project + "The policy to use when setting the `default-directory' in the dashboard. + +Possible values: + + 'last-project the `doom-project-root' of the last open buffer + 'last the `default-directory' of the last open buffer + a FUNCTION a function run with the `default-directory' of the last + open buffer, that returns a directory path + a STRING a fixed path + nil `default-directory' will never change") + +;; +(defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) (defvar +doom-dashboard--height 0) (defvar +doom-dashboard--old-fringe-indicator fringe-indicator-alist) +;; (setq doom-fallback-buffer +doom-dashboard-name) @@ -59,7 +74,9 @@ if in a GUI/non-daemon session." (+doom-dashboard/open (selected-frame))))) (defun +doom-dashboard|kill-buffer-query-fn () - (or (not (+doom-dashboard-p)) + (or (unless (+doom-dashboard-p) + (setq +doom-dashboard--last-cwd default-directory) + t) (ignore (let (+doom-dashboard-inhibit-refresh) (ignore-errors (+doom-dashboard-reload)))))) @@ -97,19 +114,34 @@ whose dimensions may not be fully initialized by the time this is run." (concat (make-string (ceiling (max 0 (- len (length s))) 2) ? ) s)) +(defun +doom-dashboard--get-pwd (dir) + (cond ((null +doom-dashboard-pwd-policy) + default-directory) + (dir dir) + ((null +doom-dashboard--last-cwd) + default-directory) + (+doom-dashboard--last-cwd + (when-let* ((default-directory +doom-dashboard--last-cwd)) + (pcase +doom-dashboard-pwd-policy + (`last-project (doom-project-root)) + (`last default-directory) + ((pred stringp) +doom-dashboard-pwd-policy) + ((pred functionp) (funcall +doom-dashboard-pwd-policy default-directory)) + (_ (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" + +doom-dashboard-pwd-policy))))))) + (defun +doom-dashboard-reload (&optional dir) "Update the DOOM scratch buffer (or create it, if it doesn't exist)." (when (get-buffer-window (doom-fallback-buffer)) (unless (or +doom-dashboard-inhibit-refresh (window-minibuffer-p (frame-selected-window))) - (let ((old-pwd (or dir default-directory)) - (fallback-buffer (doom-fallback-buffer))) + (let ((fallback-buffer (doom-fallback-buffer))) (with-current-buffer fallback-buffer (with-silent-modifications (unless (eq major-mode '+doom-dashboard-mode) (+doom-dashboard-mode)) (erase-buffer) - (setq default-directory old-pwd) + (setq default-directory (+doom-dashboard--get-pwd dir)) (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) (lines 1) content) From 71c0c96b607b4139343aba23cf449338d9d7bd03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 13:36:20 -0500 Subject: [PATCH 069/145] Remove unused project-root in doom--cycle-real-buffers --- core/autoload/buffers.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 2e6ae47ba..af0ab034e 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -112,8 +112,7 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." "Switch to the next buffer N times (previous, if N < 0), skipping over unreal buffers. If there's nothing left, switch to `doom-fallback-buffer'. See `doom-real-buffer-p' for what 'real' means." - (let ((buffers (delq (current-buffer) (doom-real-buffer-list))) - (project-dir (doom-project-root))) + (let ((buffers (delq (current-buffer) (doom-real-buffer-list)))) (cond ((or (not buffers) (zerop (% n (1+ (length buffers))))) (switch-to-buffer (doom-fallback-buffer) nil t)) From b331acb46bd764f5603ba0343a26ffb8fccc9f1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 17:10:21 -0500 Subject: [PATCH 070/145] lang/cc: rename +cc-{include-paths,compiler-options} #305 --- modules/lang/cc/README.org | 4 ++-- modules/lang/cc/autoload.el | 8 ++++---- modules/lang/cc/config.el | 14 ++++++-------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/modules/lang/cc/README.org b/modules/lang/cc/README.org index 72526207d..ecb9d6f88 100644 --- a/modules/lang/cc/README.org +++ b/modules/lang/cc/README.org @@ -81,8 +81,8 @@ rc -J $PROJECT_ROOT # loads PROJECT_ROOT's compile_commands.json * Configure ** Compile settings By default, a set of default compile settings are defined in -~+cc-compiler-options~ for C, C++ and Objective C. Irony, rtags and flycheck -will fall back to these. +~+cc-default-compiler-options~ for C, C++ and Objective C. Irony, rtags and +flycheck will fall back to these. To make these tools aware of project specific build settings, you need a JSON [[https://sarcasm.github.io/notes/dev/compilation-database.html#ninja][compilation database]] present (i.e. a ~compile_commands.json~ file). diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 390816f1e..d40bcd104 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -85,8 +85,8 @@ ;;;###autoload (defun +cc|irony-init-compile-options () "Initialize compiler options for irony-mode. It searches for the nearest -compilation database and initailizes it. If none was found, it uses -`+cc-c++-compiler-options'. +compilation database and initailizes it, otherwise falling back on +`+cc-default-compiler-options' and `+cc-default-include-paths'. See https://github.com/Sarcasm/irony-mode#compilation-database for details on compilation dbs." @@ -94,8 +94,8 @@ compilation dbs." (require 'irony-cdb) (unless (irony-cdb-autosetup-compile-options) (irony-cdb--update-compile-options - (append (delq nil (cdr-safe (assq major-mode +cc-compiler-options))) - (cl-loop for path in +cc-include-paths + (append (delq nil (cdr-safe (assq major-mode +cc-default-compiler-options))) + (cl-loop for path in +cc-default-include-paths nconc (list "-I" path))) (doom-project-root))))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index aa5021713..369b874cc 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -1,13 +1,11 @@ ;;; lang/cc/config.el --- c, c++, and obj-c -*- lexical-binding: t; -*- -(defvar +cc-include-paths (list "include/") - "A list of paths, relative to a project root, to search for headers in C/C++. -Paths can be absolute. +(defvar +cc-default-include-paths (list "include/") + "A list of default paths, relative to a project root, to search for headers in +C/C++. Paths can be absolute. This is ignored if your project has a JSON +compilation database.") -The purpose of this variable is to ensure syntax checkers and code-completion -knows where to look for headers.") - -(defvar +cc-compiler-options +(defvar +cc-default-compiler-options `((c-mode . nil) (c++-mode . ,(list "-std=c++11" ; use C++11 by default @@ -117,7 +115,7 @@ compilation database is present in the project.") (unless (file-directory-p irony-server-install-prefix) (warn "irony-mode: server isn't installed; run M-x irony-install-server")) ;; Initialize compilation database, if present. Otherwise, fall back on - ;; `+cc-compiler-options'. + ;; `+cc-default-compiler-options'. (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) (def-package! irony-eldoc From 6c3d7ad7c787554ef78511ceb27dfddd7c7e053f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 17:11:59 -0500 Subject: [PATCH 071/145] ui/doom-dashboard: expand string +doom-dashboard-pwd-policy #309 --- modules/ui/doom-dashboard/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index e3eff4591..3c3eb5116 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -125,7 +125,7 @@ whose dimensions may not be fully initialized by the time this is run." (pcase +doom-dashboard-pwd-policy (`last-project (doom-project-root)) (`last default-directory) - ((pred stringp) +doom-dashboard-pwd-policy) + ((pred stringp) (expand-file-name +doom-dashboard-pwd-policy)) ((pred functionp) (funcall +doom-dashboard-pwd-policy default-directory)) (_ (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" +doom-dashboard-pwd-policy))))))) From 86f445d6a1b2ee7a96b41f114ad074591707c1cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 17:12:50 -0500 Subject: [PATCH 072/145] ui/doom-dashboard: only set last-cwd in real buffers --- modules/ui/doom-dashboard/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 3c3eb5116..017e51d85 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -75,10 +75,12 @@ if in a GUI/non-daemon session." (defun +doom-dashboard|kill-buffer-query-fn () (or (unless (+doom-dashboard-p) - (setq +doom-dashboard--last-cwd default-directory) + (when buffer-file-name + (setq +doom-dashboard--last-cwd default-directory)) t) - (ignore (let (+doom-dashboard-inhibit-refresh) - (ignore-errors (+doom-dashboard-reload)))))) + (ignore + (let (+doom-dashboard-inhibit-refresh) + (ignore-errors (+doom-dashboard-reload)))))) (defun +doom-dashboard|make-frame (frame) "Reload the dashboard after a brief pause. This is necessary for new frames, From 01042192b81bb69d499c24af1dfd5a9cbf69828a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 18:15:44 -0500 Subject: [PATCH 073/145] Fix file-templates in doom-emacs directory --- modules/feature/file-templates/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index fe4fb4ff6..c8d42dd1c 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -56,10 +56,10 @@ ("\\.el$" "__initfile" emacs-lisp-mode) ("/.dir-locals.el$" nil) ("-test\\.el$" "__" emacs-ert-mode) - ("/.emacs.d/.+\\.el$" "__doom-module" emacs-lisp-mode) - ("/.emacs.d/.+/packages\\.el$" "__doom-packages" emacs-lisp-mode) - ("/.emacs.d/.+/test\\.el$" "__doom-test" emacs-lisp-mode) - ("/.emacs.d/.+/README\\.org$" "__doom-readme" org-mode) + ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+\\.el$" "__doom-module" emacs-lisp-mode) + ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/packages\\.el$" "__doom-packages" emacs-lisp-mode) + ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/test/.+\\.el$" "__doom-test" emacs-lisp-mode) + ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/README\\.org$" "__doom-readme" org-mode) (snippet-mode "__" snippet-mode) ;; Go ("\\.go$" "__.go" go-mode) From 9a71a735380d276967774c20411221f635d22b61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 18:19:33 -0500 Subject: [PATCH 074/145] General, minor refactor --- core/autoload/buffers.el | 2 +- modules/feature/file-templates/config.el | 10 ++++++++-- modules/private/default/config.el | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index af0ab034e..bebaab2fd 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -315,6 +315,6 @@ project." ;;;###autoload (defun doom-set-buffer-real (buffer flag) - "Forcibly mark a buffer's real property, no matter what." + "Forcibly mark BUFFER as FLAG (non-nil = real)." (with-current-buffer buffer (setq doom-real-buffer-p flag))) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index c8d42dd1c..72c4dcc40 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -6,6 +6,11 @@ (expand-file-name "templates/" (file-name-directory load-file-name)) "The path to a directory of yasnippet folders to use for file templates.") + +;; +;; Plugins +;; + (def-package! autoinsert ; built-in :defer 1 :init @@ -18,10 +23,11 @@ (auto-insert-mode 1) (defun +file-templates--expand (key &optional mode project-only) - "Auto insert a snippet of yasnippet into new file." + "Auto insert a yasnippet snippet into the blank file." (when (if project-only (doom-project-p) t) (require 'yasnippet) - (unless yas-minor-mode (yas-minor-mode-on)) + (unless yas-minor-mode + (yas-minor-mode-on)) (when (and yas-minor-mode (yas-expand-snippet (yas-lookup-snippet key mode t)) (and (featurep 'evil) evil-mode) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 13e11ec3c..795f15fba 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -1,6 +1,6 @@ ;;; private/default/config.el -*- lexical-binding: t; -*- -(def-package! emacs-snippets) +(def-package! emacs-snippets :after yasnippet) ;; From 16df33a5b1316f09b338f9e1391792fe6a8b00d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 18:19:56 -0500 Subject: [PATCH 075/145] feature/snippets: simplify var config --- modules/feature/snippets/config.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index a00450d79..b257d1b05 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -21,11 +21,9 @@ #'yas-minor-mode-on) :config - (setq yas-verbosity 0 - yas-indent-line 'auto + (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t - yas-prompt-functions '(yas-completing-prompt yas-ido-prompt yas-no-prompt) - yas-use-menu nil + yas-prompt-functions (delq 'yas-dropdown-prompt yas-prompt-functions) ;; Allow nested snippets yas-triggers-in-field t) From 9fa60965a88d8ef61b98f74f9ed5820b2f6ac8c3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 18:20:14 -0500 Subject: [PATCH 076/145] feature/snippets: remove evil hacks (experimental) They don't seem to be necessary anymore. More testing is required. --- modules/feature/snippets/config.el | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index b257d1b05..89726f926 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -38,27 +38,8 @@ ;; fix an error caused by smartparens interfering with yasnippet bindings (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) - (after! evil - ;; Exit snippets on ESC in normal mode - (add-hook '+evil-esc-hook #'yas-exit-all-snippets) - ;; Once you're in normal mode, you're out - (add-hook 'evil-normal-state-entry-hook #'yas-abort-snippet) - ;; Strip out whitespace before a line selection - (defun +snippets|yas-before-expand () - "Strip out the shitespace before a line selection." - (when (and (evil-visual-state-p) - (eq (evil-visual-type) 'line)) - (setq yas-selected-text - (replace-regexp-in-string - "\\(^\\s-*\\|\n? $\\)" "" - (buffer-substring-no-properties evil-visual-beginning - evil-visual-end))))) - (add-hook 'yas-before-expand-snippet-hook #'+snippets|yas-before-expand) - - (defun +snippets|yas-after-expand () - "Fix previous hook persisting yas-selected-text between expansions." - (setq yas-selected-text nil)) - (add-hook 'yas-after-exit-snippet-hook #'+snippets|yas-after-expand))) + ;; Exit snippets on ESC from normal mode + (add-hook '+evil-esc-hook #'yas-exit-all-snippets)) (def-package! auto-yasnippet From 59846473ca2b485aa25cfba333a9e8757590ce76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 18:20:58 -0500 Subject: [PATCH 077/145] visual-fill-column: account for emacs 26 line numbers --- core/core-ui.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2252b3df5..3ed1cf764 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -317,8 +317,12 @@ local value, whether or not it's permanent-local. Therefore, we cycle (def-package! visual-fill-column :commands visual-fill-column-mode :config - (setq-default visual-fill-column-center-text nil - visual-fill-column-width fill-column)) + (setq-default + visual-fill-column-center-text t + visual-fill-column-width + ;; take Emacs 26 line numbers into account + (+ (if (boundp 'display-line-numbers) 6 0) + fill-column))) ;; From 13111ff5c4340984964b9ab4ee6da8aeb6109752 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 20:48:06 -0500 Subject: [PATCH 078/145] Set epa-{file-encrypt-to,pinentry-mode}; no authinfo for sudo via tramp --- core/core.el | 11 +++++++++++ modules/lang/org/config.el | 3 +-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 278b5bb34..476363332 100644 --- a/core/core.el +++ b/core/core.el @@ -105,6 +105,17 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) +(after! epa + (setq epa-file-encrypt-to (or epa-file-encrypt-to user-mail-address) + ;; With GPG 2.1, this lets Emacs prompt for gpg key passphrases + epa-pinentry-mode 'loopback)) + +(defun doom*no-authinfo-for-tramp (orig-fn &rest args) + "Don't look into .authinfo for local sudo TRAMP buffers." + (let ((auth-sources (if (equal tramp-current-method "sudo") nil auth-sources))) + (apply orig-fn args))) +(advice-add #'tramp-read-passwd :around #'doom*no-authinfo-for-tramp) + ;; move custom defs out of init.el (setq custom-file (concat doom-etc-dir "custom.el")) (load custom-file t t) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 182afcf31..c249d3063 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -28,8 +28,7 @@ :commands org-crypt-use-before-save-magic :config (setq org-tags-exclude-from-inheritance '("crypt") - org-crypt-key user-mail-address - epa-file-encrypt-to user-mail-address)) + org-crypt-key user-mail-address)) (def-package! org-bullets :commands org-bullets-mode) From 538e4c52bd7b0678fe2e9365384069ad150b4cb5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 21:00:03 -0500 Subject: [PATCH 079/145] ui/doom-dashboard: fix edge cases where cwd wasn't set properly --- modules/ui/doom-dashboard/config.el | 39 ++++++++++++++++++----------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 017e51d85..4e8b13136 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -117,20 +117,27 @@ whose dimensions may not be fully initialized by the time this is run." s)) (defun +doom-dashboard--get-pwd (dir) - (cond ((null +doom-dashboard-pwd-policy) - default-directory) - (dir dir) - ((null +doom-dashboard--last-cwd) - default-directory) - (+doom-dashboard--last-cwd - (when-let* ((default-directory +doom-dashboard--last-cwd)) - (pcase +doom-dashboard-pwd-policy - (`last-project (doom-project-root)) - (`last default-directory) - ((pred stringp) (expand-file-name +doom-dashboard-pwd-policy)) - ((pred functionp) (funcall +doom-dashboard-pwd-policy default-directory)) - (_ (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" - +doom-dashboard-pwd-policy))))))) + (let ((lastcwd +doom-dashboard--last-cwd) + (policy +doom-dashboard-pwd-policy)) + (cond ((null policy) + default-directory) + (dir dir) + ((null lastcwd) + default-directory) + ((eq policy 'last-project) + (let ((cwd default-directory) + (default-directory lastcwd)) + (if (doom-project-p) + (doom-project-root) + cwd))) + ((eq policy 'last)) + ((stringp policy) + (expand-file-name policy lastcwd)) + ((functionp policy) + (funcall policy lastcwd)) + (t + (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" + +doom-dashboard-pwd-policy))))) (defun +doom-dashboard-reload (&optional dir) "Update the DOOM scratch buffer (or create it, if it doesn't exist)." @@ -143,7 +150,9 @@ whose dimensions may not be fully initialized by the time this is run." (unless (eq major-mode '+doom-dashboard-mode) (+doom-dashboard-mode)) (erase-buffer) - (setq default-directory (+doom-dashboard--get-pwd dir)) + (setq default-directory + (or (+doom-dashboard--get-pwd dir) + default-directory)) (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) (lines 1) content) From 8b1f8acc0d08985249fdc41c9de621f566293c84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Dec 2017 22:48:05 -0500 Subject: [PATCH 080/145] Rearrange core config, epa & authinfo bits (fix after! error) --- core/core-editor.el | 37 ------------------- core/core.el | 59 +++++++++++++++++++++++++------ modules/private/default/config.el | 15 ++++++++ 3 files changed, 63 insertions(+), 48 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 0b5f72ebb..b89a68f3d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -75,43 +75,6 @@ fundamental-mode) for performance sake." (fundamental-mode)))) (add-hook 'find-file-hook #'doom|check-large-file) -;; Automatic minor modes -(defvar doom-auto-minor-mode-alist '() - "Alist mapping filename patterns to corresponding minor mode functions, like -`auto-mode-alist'. All elements of this alist are checked, meaning you can -enable multiple minor modes for the same regexp.") - -(defun doom|enable-minor-mode-maybe () - "Check file name against `doom-auto-minor-mode-alist'." - (when buffer-file-name - (let ((name buffer-file-name) - (remote-id (file-remote-p buffer-file-name)) - (alist doom-auto-minor-mode-alist)) - ;; Remove backup-suffixes from file name. - (setq name (file-name-sans-versions name)) - ;; Remove remote file name identification. - (when (and (stringp remote-id) - (string-match-p (regexp-quote remote-id) name)) - (setq name (substring name (match-end 0)))) - (while (and alist (caar alist) (cdar alist)) - (if (string-match-p (caar alist) name) - (funcall (cdar alist) 1)) - (setq alist (cdr alist)))))) -(add-hook 'find-file-hook #'doom|enable-minor-mode-maybe) - -(defun doom*set-indirect-buffer-filename (orig-fn base-buffer name &optional clone) - "In indirect buffers, `buffer-file-name' is nil, which can cause problems -with functions that require it (like modeline segments)." - (let ((file-name (buffer-file-name base-buffer)) - (buffer (funcall orig-fn base-buffer name clone))) - (when (and file-name buffer) - (with-current-buffer buffer - (unless buffer-file-name - (setq buffer-file-name file-name - buffer-file-truename (file-truename file-name))))) - buffer)) -(advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) - (push '("/LICENSE$" . text-mode) auto-mode-alist) diff --git a/core/core.el b/core/core.el index 476363332..a72914a07 100644 --- a/core/core.el +++ b/core/core.el @@ -105,17 +105,6 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) -(after! epa - (setq epa-file-encrypt-to (or epa-file-encrypt-to user-mail-address) - ;; With GPG 2.1, this lets Emacs prompt for gpg key passphrases - epa-pinentry-mode 'loopback)) - -(defun doom*no-authinfo-for-tramp (orig-fn &rest args) - "Don't look into .authinfo for local sudo TRAMP buffers." - (let ((auth-sources (if (equal tramp-current-method "sudo") nil auth-sources))) - (apply orig-fn args))) -(advice-add #'tramp-read-passwd :around #'doom*no-authinfo-for-tramp) - ;; move custom defs out of init.el (setq custom-file (concat doom-etc-dir "custom.el")) (load custom-file t t) @@ -201,5 +190,53 @@ ability to invoke the debugger in debug mode." (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize)) + +;; +;; Emacs fixes/hacks +;; + +;; Automatic minor modes +(defvar doom-auto-minor-mode-alist '() + "Alist mapping filename patterns to corresponding minor mode functions, like +`auto-mode-alist'. All elements of this alist are checked, meaning you can +enable multiple minor modes for the same regexp.") + +(defun doom|enable-minor-mode-maybe () + "Check file name against `doom-auto-minor-mode-alist'." + (when buffer-file-name + (let ((name buffer-file-name) + (remote-id (file-remote-p buffer-file-name)) + (alist doom-auto-minor-mode-alist)) + ;; Remove backup-suffixes from file name. + (setq name (file-name-sans-versions name)) + ;; Remove remote file name identification. + (when (and (stringp remote-id) + (string-match-p (regexp-quote remote-id) name)) + (setq name (substring name (match-end 0)))) + (while (and alist (caar alist) (cdar alist)) + (if (string-match-p (caar alist) name) + (funcall (cdar alist) 1)) + (setq alist (cdr alist)))))) +(add-hook 'find-file-hook #'doom|enable-minor-mode-maybe) + +(defun doom*set-indirect-buffer-filename (orig-fn base-buffer name &optional clone) + "In indirect buffers, `buffer-file-name' is nil, which can cause problems +with functions that require it (like modeline segments)." + (let ((file-name (buffer-file-name base-buffer)) + (buffer (funcall orig-fn base-buffer name clone))) + (when (and file-name buffer) + (with-current-buffer buffer + (unless buffer-file-name + (setq buffer-file-name file-name + buffer-file-truename (file-truename file-name))))) + buffer)) +(advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) + +(defun doom*no-authinfo-for-tramp (orig-fn &rest args) + "Don't look into .authinfo for local sudo TRAMP buffers." + (let ((auth-sources (if (equal tramp-current-method "sudo") nil auth-sources))) + (apply orig-fn args))) +(advice-add #'tramp-read-passwd :around #'doom*no-authinfo-for-tramp) + (provide 'core) ;;; core.el ends here diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 795f15fba..dcce9d698 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -1,8 +1,23 @@ ;;; private/default/config.el -*- lexical-binding: t; -*- +;; +;; Plugins +;; + (def-package! emacs-snippets :after yasnippet) +;; +;; Config +;; + +(after! epa + (setq epa-file-encrypt-to (or epa-file-encrypt-to user-mail-address) + ;; With GPG 2.1, this forces gpg-agent to use the Emacs minibuffer to + ;; prompt for the key passphrase. + epa-pinentry-mode 'loopback)) + + ;; ;; Custom Ex-commands for `evil-mode' ;; From 5789fb45110b8eb31a64ff51bad6ef56a320fa5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 01:02:32 -0500 Subject: [PATCH 081/145] Don't rerun doom init hooks on doom-reload-hook --- core/core-packages.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 78d69cd3d..b5d029d90 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -522,11 +522,10 @@ call `doom/reload-load-path' remotely (through emacsclient)." (when (server-running-p) (message "Reloading active Emacs session...") (server-eval-at server-name '(doom//reload-load-path)))) - (t - (doom-initialize-load-path t) - (message "%d packages reloaded" (length doom--package-load-path)) - (run-with-timer 1 nil #'redraw-display) - (run-hooks 'doom-reload-hook)))) + ((let ((noninteractive t)) + (doom-initialize-load-path t) + (message "%d packages reloaded" (length doom--package-load-path)) + (run-hooks 'doom-reload-hook))))) (defun doom//reload-autoloads () "Refreshes the autoloads.el file, specified by `doom-autoload-file'. From a811c7ff123163cd908d947781e1fff43308dedc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 19:15:50 -0500 Subject: [PATCH 082/145] core-packages: minor refactor of load! & def-package! --- core/core-packages.el | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index b5d029d90..1ab82a798 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -325,7 +325,7 @@ MODULES is an malformed plist of modules to load." ;; Ignore package if NAME is in `doom-disabled-packages' (when (and (memq name doom-disabled-packages) (not (memq :disabled plist))) - (setq plist (append (list :disabled t) plist))) + (setq plist `(:disabled t ,@plist))) ;; If byte-compiling, ignore this package if it doesn't meet the condition. ;; This avoids false-positive load errors. (unless (and (bound-and-true-p byte-compile-current-file) @@ -368,31 +368,26 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." "Load a file relative to the current executing file (`load-file-name'). FILESYM is either a symbol or string representing the file to load. PATH is -where to look for the file (a string representing a directory path), by default -it is relative to `load-file-name', `byte-compile-current-file' or +where to look for the file (a string representing a directory path). If omitted, +the lookup is relative to `load-file-name', `byte-compile-current-file' or `buffer-file-name' (in that order). If NOERROR is non-nil, don't throw an error if the file doesn't exist." - (let ((path (or (and path (or (and (symbolp path) (symbol-value path)) - (and (stringp path) path) - (and (listp path) (eval path)))) + (cl-assert (symbolp filesym) t) + (let ((path (or path (and load-file-name (file-name-directory load-file-name)) (and (bound-and-true-p byte-compile-current-file) (file-name-directory byte-compile-current-file)) (and buffer-file-name - (file-name-directory buffer-file-name)))) - (filename (cond ((stringp filesym) filesym) - ((symbolp filesym) (symbol-name filesym)) - (t (error "load! expected a string or symbol, got %s (a %s)" - filesym (type-of filesym)))))) - (unless path - (error "Could not find %s" filename)) + (file-name-directory buffer-file-name)) + (error "Could not detect path to look for '%s' in" filesym))) + (filename (symbol-name filesym))) (let ((file (expand-file-name (concat filename ".el") path))) (if (file-exists-p file) `(load ,(file-name-sans-extension file) ,noerror ,(not doom-debug-mode)) (unless noerror - (error "Could not load! file %s" file)))))) + (error "Could not load file '%s' from '%s'" file path)))))) (defmacro require! (module submodule &optional flags reload-p) "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol). From fcadde3ef9b85c8dd4806afe54e8547e5fc178af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 19:16:06 -0500 Subject: [PATCH 083/145] core: refactor & comment --- core/core.el | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/core/core.el b/core/core.el index a72914a07..525da5787 100644 --- a/core/core.el +++ b/core/core.el @@ -142,25 +142,15 @@ ability to invoke the debugger in debug mode." (car ex) fn (error-message-string ex)))) nil) -(defun doom|finalize () - (unless (or (not after-init-time) noninteractive) - (dolist (hook '(doom-init-hook doom-post-init-hook)) - (run-hook-wrapped hook #'doom-try-run-hook hook))) - - ;; Don't keep gc-cons-threshold too high. It helps to stave off the GC while - ;; Emacs starts up, but afterwards it causes stuttering and random freezes. So - ;; reset it to a reasonable default. - (setq gc-cons-threshold 16777216 - gc-cons-percentage 0.1 - file-name-handler-alist doom--file-name-handler-alist) - t) - ;;; ;; Initialize (eval-and-compile (defvar doom--file-name-handler-alist file-name-handler-alist) (unless (or after-init-time noninteractive) + ;; One of the contributors to long startup times is the garbage collector, + ;; so we up its memory threshold, temporarily. It is reset later in + ;; `doom|finalize'. (setq gc-cons-threshold 402653184 gc-cons-percentage 0.6 file-name-handler-alist nil)) @@ -187,6 +177,19 @@ ability to invoke the debugger in debug mode." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key + (defun doom|finalize () + "Run `doom-init-hook', `doom-post-init-hook' and reset `gc-cons-threshold', +`gc-cons-percentage' and `file-name-handler-alist'." + (unless (or (not after-init-time) noninteractive) + (dolist (hook '(doom-init-hook doom-post-init-hook)) + (run-hook-wrapped hook #'doom-try-run-hook hook))) + + ;; If you forget to reset this, you'll get stuttering and random freezes! + (setq gc-cons-threshold 16777216 + gc-cons-percentage 0.1 + file-name-handler-alist doom--file-name-handler-alist) + t) + (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize)) From 58b26052151e4a59e709ad472d5aafd1a4dd392e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 19:58:27 -0500 Subject: [PATCH 084/145] ui/doom-dashboard: fix 'last pwd policy --- modules/ui/doom-dashboard/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 4e8b13136..d153909ff 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -130,7 +130,8 @@ whose dimensions may not be fully initialized by the time this is run." (if (doom-project-p) (doom-project-root) cwd))) - ((eq policy 'last)) + ((eq policy 'last) + lastcwd) ((stringp policy) (expand-file-name policy lastcwd)) ((functionp policy) From 7ea3895b994bf4b0f45a55483dc4815ad53b2b6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 19:59:32 -0500 Subject: [PATCH 085/145] ui/doom-dashboard: fix pwd not always being set #309 --- modules/ui/doom-dashboard/config.el | 61 +++++++++++++++-------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index d153909ff..44bba352a 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -116,12 +116,11 @@ whose dimensions may not be fully initialized by the time this is run." (concat (make-string (ceiling (max 0 (- len (length s))) 2) ? ) s)) -(defun +doom-dashboard--get-pwd (dir) +(defun +doom-dashboard--get-pwd () (let ((lastcwd +doom-dashboard--last-cwd) (policy +doom-dashboard-pwd-policy)) (cond ((null policy) default-directory) - (dir dir) ((null lastcwd) default-directory) ((eq policy 'last-project) @@ -140,35 +139,37 @@ whose dimensions may not be fully initialized by the time this is run." (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" +doom-dashboard-pwd-policy))))) -(defun +doom-dashboard-reload (&optional dir) +(defun +doom-dashboard-reload (&optional force) "Update the DOOM scratch buffer (or create it, if it doesn't exist)." - (when (get-buffer-window (doom-fallback-buffer)) - (unless (or +doom-dashboard-inhibit-refresh - (window-minibuffer-p (frame-selected-window))) - (let ((fallback-buffer (doom-fallback-buffer))) - (with-current-buffer fallback-buffer - (with-silent-modifications - (unless (eq major-mode '+doom-dashboard-mode) - (+doom-dashboard-mode)) - (erase-buffer) - (setq default-directory - (or (+doom-dashboard--get-pwd dir) - default-directory)) - (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) - (lines 1) - content) - (with-temp-buffer - (dolist (widget-name +doom-dashboard-widgets) - (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) - (insert "\n")) - (setq content (buffer-string) - lines (count-lines (point-min) (point-max)))) - (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) - (/ lines 2))) - ?\n) - content)) - (unless (button-at (point)) - (goto-char (next-button (point-min)))))))) + (let ((fallback-buffer (doom-fallback-buffer))) + (when (or force + (and (get-buffer-window fallback-buffer) + (not (window-minibuffer-p (frame-selected-window))))) + (with-current-buffer fallback-buffer + (setq default-directory + (or (+doom-dashboard--get-pwd) + default-directory))) + (unless +doom-dashboard-inhibit-refresh + (with-silent-modifications + (unless (eq major-mode '+doom-dashboard-mode) + (+doom-dashboard-mode)) + (erase-buffer) + + (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) + (lines 1) + content) + (with-temp-buffer + (dolist (widget-name +doom-dashboard-widgets) + (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) + (insert "\n")) + (setq content (buffer-string) + lines (count-lines (point-min) (point-max)))) + (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) + (/ lines 2))) + ?\n) + content)) + (unless (button-at (point)) + (goto-char (next-button (point-min))))))) ;; Update all dashboard windows (dolist (win (get-buffer-window-list (doom-fallback-buffer) nil t)) (set-window-fringes win 0 0) From f8cfe5878d706c6344053c5f8a925b7e7de8bd1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 19:59:54 -0500 Subject: [PATCH 086/145] ui/doom-dashboard: add unit tests --- init.test.el | 3 ++ .../ui/doom-dashboard/test/doom-dashboard.el | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 modules/ui/doom-dashboard/test/doom-dashboard.el diff --git a/init.test.el b/init.test.el index 038114c87..8d529cd2f 100644 --- a/init.test.el +++ b/init.test.el @@ -9,6 +9,9 @@ :completion company + :ui + doom-dashboard + :tools password-store diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el new file mode 100644 index 000000000..3e4ba8f7c --- /dev/null +++ b/modules/ui/doom-dashboard/test/doom-dashboard.el @@ -0,0 +1,47 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/doom-dashboard/test/doom-dashboard.el + +(require! :ui doom-dashboard) +(+doom-dashboard|init) + +(defun -dashboard-test-cwd (spec file) + (let ((+doom-dashboard-pwd-policy (car spec)) + +doom-dashboard--last-cwd + projectile-enable-caching) + (with-temp-buffer + (setq-local buffer-file-name file) + (setq-local default-directory (file-name-directory file))) + (should +doom-dashboard--last-cwd) + (+doom-dashboard-reload t) + (should (equal (buffer-local-value 'default-directory (doom-fallback-buffer)) + (cdr spec))))) + +;; +(def-test! pwd-policy + (let ((default-directory doom-emacs-dir) + (+doom-dashboard--last-cwd doom-core-dir) + projectile-enable-caching) + (dolist (spec (list (cons 'last-project doom-emacs-dir) + (cons 'last doom-core-dir) + (cons (lambda (x) "x") "x") + (cons "~" (expand-file-name "~")) + (cons nil default-directory))) + (let ((+doom-dashboard-pwd-policy (car spec))) + (should (equal (+doom-dashboard--get-pwd) (cdr spec))))))) + +(def-test! kill-buffer-query + (let (+doom-dashboard--last-cwd) + (with-temp-buffer + (setq buffer-file-name (expand-file-name "core.el" doom-core-dir) + default-directory doom-core-dir) + (kill-buffer (current-buffer))) + (should (equal +doom-dashboard--last-cwd doom-core-dir)))) + +(def-test! dashboard-reload-pwd-policy + (dolist (spec (list (cons 'last-project doom-emacs-dir) + (cons 'last doom-core-dir) + (cons "~" (expand-file-name "~")) + (cons (lambda (x) "/tmp") (expand-file-name "/tmp")))) + (-dashboard-test-cwd spec (expand-file-name "core.el" doom-core-dir)))) + + From d8105427e27c121d6059164794bf52cc58ec8f24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 20:04:46 -0500 Subject: [PATCH 087/145] ui/doom-dashboard: fix restriction to dashboard buffer --- modules/ui/doom-dashboard/config.el | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 44bba352a..dda12d426 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -148,28 +148,27 @@ whose dimensions may not be fully initialized by the time this is run." (with-current-buffer fallback-buffer (setq default-directory (or (+doom-dashboard--get-pwd) - default-directory))) - (unless +doom-dashboard-inhibit-refresh - (with-silent-modifications - (unless (eq major-mode '+doom-dashboard-mode) - (+doom-dashboard-mode)) - (erase-buffer) - - (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) - (lines 1) - content) - (with-temp-buffer - (dolist (widget-name +doom-dashboard-widgets) - (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) - (insert "\n")) - (setq content (buffer-string) - lines (count-lines (point-min) (point-max)))) - (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) - (/ lines 2))) - ?\n) - content)) - (unless (button-at (point)) - (goto-char (next-button (point-min))))))) + default-directory)) + (unless +doom-dashboard-inhibit-refresh + (with-silent-modifications + (unless (eq major-mode '+doom-dashboard-mode) + (+doom-dashboard-mode)) + (erase-buffer) + (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) + (lines 1) + content) + (with-temp-buffer + (dolist (widget-name +doom-dashboard-widgets) + (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) + (insert "\n")) + (setq content (buffer-string) + lines (count-lines (point-min) (point-max)))) + (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) + (/ lines 2))) + ?\n) + content)) + (unless (button-at (point)) + (goto-char (next-button (point-min)))))))) ;; Update all dashboard windows (dolist (win (get-buffer-window-list (doom-fallback-buffer) nil t)) (set-window-fringes win 0 0) From ca56d08dd93d2f1a8067a4e5cfd25665107dd7e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 21:42:33 -0500 Subject: [PATCH 088/145] Fix stale mode-line after switching buffers --- core/autoload/buffers.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index bebaab2fd..9753836c4 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -129,6 +129,7 @@ buffers. If there's nothing left, switch to `doom-fallback-buffer'. See do (dotimes (_i (abs n)) (funcall move-func))))) + (force-mode-line-update) (current-buffer))) ;;;###autoload From 60e8f6297e5d359e608b31f19c9d084b8ca974ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 21:43:48 -0500 Subject: [PATCH 089/145] doom-kill-buffer: extract protect-visible-buffers logic Protecting buffers that were visible in other windows (burying them instead) is not the responsibility of doom-kill-buffer. This is a job for kill-buffer-query-functions, hence doom|protect-visible-buffers. --- core/autoload/buffers.el | 13 +++++-------- core/core-ui.el | 6 ++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 9753836c4..e1c5147bb 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -179,11 +179,9 @@ DONT-SAVE is non-nil. See `doom-real-buffer-p' for what 'real' means." (setq buffer (or buffer (current-buffer))) (when (and (bufferp buffer) (buffer-live-p buffer)) - (let ((buffer-win (get-buffer-window buffer)) - (only-buffer-window-p (= 1 (length (get-buffer-window-list buffer nil t))))) + (let ((buffer-win (get-buffer-window buffer))) ;; deal with unsaved buffers - (when (and only-buffer-window-p - (buffer-file-name buffer) + (when (and (buffer-file-name buffer) (buffer-modified-p buffer)) (with-current-buffer buffer (if (and (not dont-save) @@ -201,10 +199,9 @@ See `doom-real-buffer-p' for what 'real' means." (doom--cycle-real-buffers -1) (when buffer-win (unrecord-window-buffer buffer-win buffer)) - (when only-buffer-window-p - (kill-buffer buffer))) - (not (eq (current-buffer) buffer))) - (kill-buffer buffer))))) + (kill-buffer buffer))) + (kill-buffer buffer))) + (not (eq (current-buffer) buffer)))) ;;;###autoload (defun doom-force-kill-buffer (&optional buffer dont-save) diff --git a/core/core-ui.el b/core/core-ui.el index 3ed1cf764..90342af68 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -228,6 +228,12 @@ local value, whether or not it's permanent-local. Therefore, we cycle (add-hook! '(doom-post-init-hook minibuffer-setup-hook) #'doom|no-fringes-in-minibuffer) +(defun doom|protect-visible-buffers () + "Don't kill the current buffer if it is visible in another window (bury it +instead)." + (not (and after-init-time (get-buffer-window-list nil t)))) +(add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) + ;; ;; Plugins From 5bd361cbc42816fe6227fe79eb7df3a57cb2ba42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Dec 2017 22:08:19 -0500 Subject: [PATCH 090/145] Stop 'Nowhere left to go!' spam; lighten up Emacs! --- core/autoload/buffers.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index e1c5147bb..80e268417 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -250,10 +250,10 @@ regex PATTERN. Returns the number of killed buffers." (doom-kill-buffer buf t)))) ;;;###autoload -(defun doom/kill-this-buffer () +(defun doom/kill-this-buffer (&optional interactive-p) "Use `doom-kill-buffer' on the current buffer." - (interactive) - (when (and (not (doom-kill-buffer)) (called-interactively-p 'interactive)) + (interactive (list 'interactive)) + (when (and (not (doom-kill-buffer)) interactive-p) (message "Nowhere left to go!"))) ;;;###autoload From 5c54f58ff808e5e174915ddbe139bd2a3faf4ba2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 01:23:01 -0500 Subject: [PATCH 091/145] protect-visible-buffers: get-buffer-window-list => get-buffer-window The "current" window is forgotten by the time doom|protect-visible-buffers runs, so use get-buffer-window (native C function) to detect if another window housing this buffer exists. --- core/core-ui.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 90342af68..87f84fed9 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -231,7 +231,7 @@ local value, whether or not it's permanent-local. Therefore, we cycle (defun doom|protect-visible-buffers () "Don't kill the current buffer if it is visible in another window (bury it instead)." - (not (and after-init-time (get-buffer-window-list nil t)))) + (not (and after-init-time (get-buffer-window nil t)))) (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) From a56b2afa4670d2c38c33b54d63ed3b2302874398 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 01:46:20 -0500 Subject: [PATCH 092/145] Refactor all-the-icons disabler advice --- core/core-ui.el | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 87f84fed9..6abf5280c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -247,14 +247,11 @@ instead)." (defun doom*disable-all-the-icons-in-tty (orig-fn &rest args) (when (display-graphic-p) (apply orig-fn args))) - ;; all-the-icons doesn't work in the terminal, so we "disable" it. - (advice-add #'all-the-icons-octicon :around #'doom*disable-all-the-icons-in-tty) - (advice-add #'all-the-icons-material :around #'doom*disable-all-the-icons-in-tty) - (advice-add #'all-the-icons-faicon :around #'doom*disable-all-the-icons-in-tty) - (advice-add #'all-the-icons-fileicon :around #'doom*disable-all-the-icons-in-tty) - (advice-add #'all-the-icons-wicon :around #'doom*disable-all-the-icons-in-tty) - (advice-add #'all-the-icons-alltheicon :around #'doom*disable-all-the-icons-in-tty)) + (dolist (fn '(all-the-icons-octicon all-the-icons-material + all-the-icons-faicon all-the-icons-fileicon + all-the-icons-wicon all-the-icons-alltheicon)) + (advice-add fn :around #'doom*disable-all-the-icons-in-tty))) (def-package! fringe-helper :commands (fringe-helper-define fringe-helper-convert) From c9fe2de2364b57f456209cce7f320b50540b442c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 01:48:55 -0500 Subject: [PATCH 093/145] Ensure persp-kill-buffer-query-function is last in hook --- modules/feature/workspaces/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 6bcb58ffe..bd71d9a45 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -68,7 +68,10 @@ renamed.") (remove-hook 'delayed-warnings-hook #'display-delayed-warnings) (defun +workspaces|init (&optional frame) (unless persp-mode - (persp-mode +1)) + (persp-mode +1) + ;; Ensure `persp-kill-buffer-query-function' is last in kill-buffer-query-functions + (remove-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function) + (add-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function t)) (let ((frame (or frame (selected-frame)))) (unless noninteractive ;; The default perspective persp-mode makes (defined by From 43ad36e61462166b66aa7c1019de11cc85fe9c47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 01:49:29 -0500 Subject: [PATCH 094/145] ui/doom-dashboard: major refactor #309 This should resolve any issues with the dashboard refusing to set its pwd correctly (or at all) when being switched to. --- modules/ui/doom-dashboard/config.el | 116 +++++++++++++++------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index dda12d426..22b557db8 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -3,12 +3,12 @@ (defvar +doom-dashboard-name " *doom*" "The name to use for the dashboard buffer.") -(defvar +doom-dashboard-inhibit-refresh nil - "If non-nil, the doom buffer won't be refreshed.") - (defvar +doom-dashboard-widgets '(banner shortmenu loaded) "List of widgets to display in a blank scratch buffer.") +(defvar +doom-dashboard-inhibit-refresh nil + "If non-nil, the doom buffer won't be refreshed.") + (defvar +doom-dashboard-inhibit-functions () "A list of functions that determine whether to inhibit the dashboard the loading.") @@ -31,6 +31,9 @@ Possible values: (defvar +doom-dashboard--height 0) (defvar +doom-dashboard--old-fringe-indicator fringe-indicator-alist) +(defvar all-the-icons-scale-factor) +(defvar all-the-icons-default-adjust) + ;; (setq doom-fallback-buffer +doom-dashboard-name) @@ -68,15 +71,17 @@ Possible values: if in a GUI/non-daemon session." (add-hook 'window-configuration-change-hook #'+doom-dashboard-reload) (add-hook 'focus-in-hook #'+doom-dashboard-reload) - (add-hook 'kill-buffer-query-functions #'+doom-dashboard|kill-buffer-query-fn) + (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (when (and (display-graphic-p) (not (daemonp))) (let ((default-directory doom-emacs-dir)) (+doom-dashboard/open (selected-frame))))) -(defun +doom-dashboard|kill-buffer-query-fn () +(defun +doom-dashboard|reload-on-kill () + "TODO" (or (unless (+doom-dashboard-p) - (when buffer-file-name - (setq +doom-dashboard--last-cwd default-directory)) + (when (doom-real-buffer-p) + (setq +doom-dashboard--last-cwd default-directory) + (+doom-dashboard-update-pwd)) t) (ignore (let (+doom-dashboard-inhibit-refresh) @@ -106,13 +111,57 @@ whose dimensions may not be fully initialized by the time this is run." (+doom-dashboard-reload))) (setq +doom-dashboard-inhibit-refresh nil))) +; (defun +doom-dashboard-p (&optional buffer) "Returns t if BUFFER is the dashboard buffer." - (let ((buffer (or buffer (current-buffer)))) - (and (buffer-live-p buffer) - (eq buffer (doom-fallback-buffer))))) + (eq (or buffer (current-buffer)) + (doom-fallback-buffer))) -(defun +doom-dashboard-center (len s) +(defun +doom-dashboard-update-pwd () + "TODO" + (with-current-buffer (doom-fallback-buffer) + (cd (or (+doom-dashboard--get-pwd) + default-directory)))) + +(defun +doom-dashboard-reload (&optional force) + "Update the DOOM scratch buffer (or create it, if it doesn't exist)." + (let ((fallback-buffer (doom-fallback-buffer))) + (when (or (and after-init-time + (not +doom-dashboard-inhibit-refresh) + (get-buffer-window fallback-buffer) + (not (window-minibuffer-p (frame-selected-window)))) + force) + (with-current-buffer fallback-buffer + (+doom-dashboard-update-pwd) + (with-silent-modifications + (unless (eq major-mode '+doom-dashboard-mode) + (+doom-dashboard-mode)) + (erase-buffer) + (let ((+doom-dashboard--height + (window-height (get-buffer-window fallback-buffer))) + (lines 1) + content) + (with-temp-buffer + (dolist (widget-name +doom-dashboard-widgets) + (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) + (insert "\n")) + (setq content (buffer-string) + lines (count-lines (point-min) (point-max)))) + (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) + (/ lines 2))) + ?\n) + content)) + (unless (button-at (point)) + (goto-char (next-button (point-min))))))) + ;; Update all dashboard windows + (dolist (win (get-buffer-window-list fallback-buffer nil t)) + (set-window-fringes win 0 0) + (set-window-margins + win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2))))) + t) + +;; helpers +(defun +doom-dashboard--center (len s) (concat (make-string (ceiling (max 0 (- len (length s))) 2) ? ) s)) @@ -139,47 +188,10 @@ whose dimensions may not be fully initialized by the time this is run." (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" +doom-dashboard-pwd-policy))))) -(defun +doom-dashboard-reload (&optional force) - "Update the DOOM scratch buffer (or create it, if it doesn't exist)." - (let ((fallback-buffer (doom-fallback-buffer))) - (when (or force - (and (get-buffer-window fallback-buffer) - (not (window-minibuffer-p (frame-selected-window))))) - (with-current-buffer fallback-buffer - (setq default-directory - (or (+doom-dashboard--get-pwd) - default-directory)) - (unless +doom-dashboard-inhibit-refresh - (with-silent-modifications - (unless (eq major-mode '+doom-dashboard-mode) - (+doom-dashboard-mode)) - (erase-buffer) - (let ((+doom-dashboard--height (window-height (get-buffer-window fallback-buffer))) - (lines 1) - content) - (with-temp-buffer - (dolist (widget-name +doom-dashboard-widgets) - (funcall (intern (format "doom-dashboard-widget--%s" widget-name))) - (insert "\n")) - (setq content (buffer-string) - lines (count-lines (point-min) (point-max)))) - (insert (make-string (max 0 (- (/ +doom-dashboard--height 2) - (/ lines 2))) - ?\n) - content)) - (unless (button-at (point)) - (goto-char (next-button (point-min)))))))) - ;; Update all dashboard windows - (dolist (win (get-buffer-window-list (doom-fallback-buffer) nil t)) - (set-window-fringes win 0 0) - (set-window-margins - win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2))))) - t) - ;; widgets (defun doom-dashboard-widget--banner () (mapc (lambda (line) - (insert (propertize (+doom-dashboard-center +doom-dashboard--width line) + (insert (propertize (+doom-dashboard--center +doom-dashboard--width line) 'face 'font-lock-comment-face) " ") (insert "\n")) '("================= =============== =============== ======== ========" @@ -206,7 +218,7 @@ whose dimensions may not be fully initialized by the time this is run." (insert "\n" (propertize - (+doom-dashboard-center + (+doom-dashboard--center +doom-dashboard--width (format "Loaded %d packages in %d modules in %.02fs" (length doom--package-load-path) @@ -215,8 +227,6 @@ whose dimensions may not be fully initialized by the time this is run." 'face 'font-lock-comment-face) "\n")) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) (defun doom-dashboard-widget--shortmenu () (let ((all-the-icons-scale-factor 1.45) (all-the-icons-default-adjust -0.02)) @@ -230,7 +240,7 @@ whose dimensions may not be fully initialized by the time this is run." (propertize (concat " " label) 'face 'font-lock-keyword-face)) 'action `(lambda (_) ,fn) 'follow-link t) - (+doom-dashboard-center (- +doom-dashboard--width 2) (buffer-string))) + (+doom-dashboard--center (- +doom-dashboard--width 2) (buffer-string))) "\n\n")))) `(("Homepage" "mark-github" (browse-url "https://github.com/hlissner/doom-emacs")) From bf681f37b78472e8bc63ab801a28e99d84aac31e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 04:11:54 -0500 Subject: [PATCH 095/145] Correct typo in docstring --- modules/ui/doom-dashboard/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 22b557db8..2f19d5f5b 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -10,7 +10,7 @@ "If non-nil, the doom buffer won't be refreshed.") (defvar +doom-dashboard-inhibit-functions () - "A list of functions that determine whether to inhibit the dashboard the + "A list of functions that determine whether to inhibit the dashboard from loading.") (defvar +doom-dashboard-pwd-policy 'last-project From 54001de36e36301a49ba31c361fd5edd0337f07a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 04:15:56 -0500 Subject: [PATCH 096/145] ui/doom-dashboard: fix string/function pwd-policy when last-cwd is blank --- modules/ui/doom-dashboard/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 2f19d5f5b..92533ce29 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -170,6 +170,10 @@ whose dimensions may not be fully initialized by the time this is run." (policy +doom-dashboard-pwd-policy)) (cond ((null policy) default-directory) + ((stringp policy) + (expand-file-name policy lastcwd)) + ((functionp policy) + (funcall policy lastcwd)) ((null lastcwd) default-directory) ((eq policy 'last-project) @@ -180,13 +184,9 @@ whose dimensions may not be fully initialized by the time this is run." cwd))) ((eq policy 'last) lastcwd) - ((stringp policy) - (expand-file-name policy lastcwd)) - ((functionp policy) - (funcall policy lastcwd)) (t (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" - +doom-dashboard-pwd-policy))))) + policy))))) ;; widgets (defun doom-dashboard-widget--banner () From 7f2dd52b2e501d5be495f8d32acc30595872d433 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 04:16:14 -0500 Subject: [PATCH 097/145] ui/doom-dashboard: add docstring for +doom-dashboard|reload-on-kill --- modules/ui/doom-dashboard/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 92533ce29..debcc73fc 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -77,7 +77,11 @@ if in a GUI/non-daemon session." (+doom-dashboard/open (selected-frame))))) (defun +doom-dashboard|reload-on-kill () - "TODO" + "If this isn't a dashboard buffer, move along, but record its +`default-directory' if the buffer is real. See `doom-real-buffer-p' for an +explanation for what 'real' means. + +If this is the dashboard buffer, reload the dashboard." (or (unless (+doom-dashboard-p) (when (doom-real-buffer-p) (setq +doom-dashboard--last-cwd default-directory) From 02c1a783307754733bdca55ffad11f33d976aaf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 04:17:19 -0500 Subject: [PATCH 098/145] Add :skip support for def-test! --- core/autoload/test.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/test.el b/core/autoload/test.el index 60669a57e..a71f4bed5 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -75,6 +75,8 @@ If neither is available, run all tests in all enabled modules." "Define a namespaced ERT test." (declare (indent defun) (doc-string 2)) (unless (plist-get body :disabled) + (when (plist-get body :skip) + (push '(ert-skip nil) body)) `(ert-deftest ,(cl-loop with path = (file-relative-name (file-name-sans-extension load-file-name) doom-emacs-dir) From 96ed8170d743de7f0dd9efb4a037a1e656fede64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 04:17:31 -0500 Subject: [PATCH 099/145] Rewrite ui/doom-dashboard tests --- .../ui/doom-dashboard/test/doom-dashboard.el | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el index 3e4ba8f7c..b08188837 100644 --- a/modules/ui/doom-dashboard/test/doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/doom-dashboard.el @@ -4,21 +4,31 @@ (require! :ui doom-dashboard) (+doom-dashboard|init) -(defun -dashboard-test-cwd (spec file) - (let ((+doom-dashboard-pwd-policy (car spec)) +(defun -dashboard-test-pwd (spec file) + (let ((kill-buffer-query-functions '(+doom-dashboard|reload-on-kill)) + (+doom-dashboard-pwd-policy (car spec)) + (fallback-buffer (doom-fallback-buffer)) +doom-dashboard--last-cwd projectile-enable-caching) (with-temp-buffer - (setq-local buffer-file-name file) - (setq-local default-directory (file-name-directory file))) + (setq buffer-file-name file + default-directory (file-name-directory file) + doom-real-buffer-p t)) (should +doom-dashboard--last-cwd) - (+doom-dashboard-reload t) - (should (equal (buffer-local-value 'default-directory (doom-fallback-buffer)) + (+doom-dashboard-update-pwd) + (should (equal (buffer-local-value 'default-directory fallback-buffer) (cdr spec))))) ;; -(def-test! pwd-policy - (let ((default-directory doom-emacs-dir) +(def-test! dashboard-p + (let ((fallback-buffer (doom-fallback-buffer))) + (should (equal (buffer-name fallback-buffer) +doom-dashboard-name)) + (should (+doom-dashboard-p fallback-buffer)) + (with-current-buffer fallback-buffer + (should (+doom-dashboard-p))))) + +(def-test! get-pwd + (let ((default-directory doom-core-dir) (+doom-dashboard--last-cwd doom-core-dir) projectile-enable-caching) (dolist (spec (list (cons 'last-project doom-emacs-dir) @@ -29,19 +39,13 @@ (let ((+doom-dashboard-pwd-policy (car spec))) (should (equal (+doom-dashboard--get-pwd) (cdr spec))))))) -(def-test! kill-buffer-query - (let (+doom-dashboard--last-cwd) - (with-temp-buffer - (setq buffer-file-name (expand-file-name "core.el" doom-core-dir) - default-directory doom-core-dir) - (kill-buffer (current-buffer))) - (should (equal +doom-dashboard--last-cwd doom-core-dir)))) - -(def-test! dashboard-reload-pwd-policy +(def-test! pwd-policy (dolist (spec (list (cons 'last-project doom-emacs-dir) (cons 'last doom-core-dir) - (cons "~" (expand-file-name "~")) - (cons (lambda (x) "/tmp") (expand-file-name "/tmp")))) - (-dashboard-test-cwd spec (expand-file-name "core.el" doom-core-dir)))) - + (cons "~" (expand-file-name "~/")) + (cons (lambda (x) "/tmp") "/tmp/"))) + (-dashboard-test-pwd spec (expand-file-name "core.el" doom-core-dir)))) +;; +(def-test! inhibit-refresh :skip t) +(def-test! inhibit-functions :skip t) From f440bc37a343c7d51366adbc26a1a781a362c6d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 13:37:26 -0500 Subject: [PATCH 100/145] lang/emacs-lisp: fix +eval/buffer fn not capturing entire buffer #313 --- modules/lang/emacs-lisp/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 50549485c..949a401fc 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -16,7 +16,7 @@ "Evaluate a region and print it to the echo area (if one line long), otherwise to a pop up buffer." (require 'pp) - (let ((result (eval (read (buffer-substring-no-properties beg end)))) + (let ((result (eval (read (concat "(progn " (buffer-substring-no-properties beg end) "\n)")))) (buf (get-buffer-create "*doom eval*")) (inhibit-read-only t) lines) From 574a783f7fef2ae1962a1cf2102350033b1d7cbe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 15:07:41 -0500 Subject: [PATCH 101/145] doctor: refactor & check $SHELL --- bin/doom-doctor | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 7247bfd52..15ffe646e 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -15,6 +15,11 @@ (require 'pp) +(defsubst string-trim-right (string &optional regexp) + (if (string-match (concat "\\(?:" (or regexp "[ \t\n\r]+") "\\)\\'") string) + (replace-match "" t t string) + string)) + ;; (defvar doom-init-p nil) (defvar doom-errors 0) @@ -58,6 +63,9 @@ "\n"))) (buffer-string))) +(defun sh (cmd) + (string-trim-right (shell-command-to-string cmd))) + (defun color (code msg &rest args) (format "\e[%dm%s\e[%dm" code (apply #'format msg args) 0)) @@ -78,15 +86,21 @@ ;; --- start a'doctorin' -------------------------------------- -(msg! "%s\nRunning Emacs v%s, commit %s" +(msg! "%s\nRunning Emacs v%s, commit %s\n" (color 1 "DOOM Doctor") (color 1 emacs-version) (if (executable-find "git") - (shell-command-to-string "git rev-parse HEAD") + (sh "git rev-parse HEAD") "n/a")) + +(msg! "shell: %s%s" + (getenv "SHELL") + (if (equal (getenv "SHELL") (sh "echo $SHELL")) + "" + (color 31 " (mismatch)"))) (when (boundp 'system-configuration-features) (msg! "Compiled with:\n%s" (indented 2 (autofill system-configuration-features)))) -(msg! "uname -a:\n%s" (indented 2 (autofill (shell-command-to-string "uname -a")))) +(msg! "uname -a:\n%s\n" (indented 2 (autofill (sh "uname -a")))) (let (doom-core-packages doom-debug-mode) (condition-case ex @@ -98,11 +112,10 @@ (doom|finalize) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version) (when (executable-find "git") - (msg! "Revision %s" - (or (ignore-errors - (let ((default-directory user-emacs-directory)) - (shell-command-to-string "git rev-parse HEAD"))) - "\n")))) + (msg! "Revision %s\n" + (ignore-errors + (let ((default-directory user-emacs-directory)) + (sh "git rev-parse HEAD")))))) ('error (warn! "Attempt to load DOOM: failed\n %s\n" (or (cdr-safe ex) (car ex)))))) @@ -155,16 +168,16 @@ (section! "test-gnutls") (cond ((executable-find "gnutls-cli")) ((executable-find "openssl") - (let* ((output (shell-command-to-string "openssl ciphers -v")) + (let* ((output (sh "openssl ciphers -v")) (protocols (let (protos) (mapcar (lambda (row) (add-to-list 'protos (cadr (split-string row " " t)))) - (split-string (shell-command-to-string "openssl ciphers -v") "\n")) + (split-string (sh "openssl ciphers -v") "\n")) (delq nil protos)))) (check! (not (or (member "TLSv1.1" protocols) (member "TLSv1.2" protocols))) - (let ((version (cadr (split-string (shell-command-to-string "openssl version") " " t)))) + (let ((version (cadr (split-string (sh "openssl version") " " t)))) (warn! "Warning: couldn't find gnutls-cli, and OpenSSL is out-of-date (v%s)" version) (explain! "This may not affect your Emacs experience, but there are security " @@ -244,7 +257,7 @@ (let ((tar-bin (or (executable-find "gtar") (executable-find "tar")))) (if tar-bin - (check! (not (string-match-p "(GNU tar)" (shell-command-to-string (format "%s --version" tar-bin)))) + (check! (not (string-match-p "(GNU tar)" (sh (format "%s --version" tar-bin)))) (warn! "Warning: BSD tar detected") (explain! "QUELPA (through package-build) uses the system tar to build plugins, but it " From 0c06514c6fc6a68297e94cc7656f2bb6078c8efe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 22:29:57 -0500 Subject: [PATCH 102/145] doom-narrow-buffer renamed to doom/narrow-buffer and moved --- core/autoload/buffers.el | 27 +++++---------------------- core/autoload/editor.el | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 80e268417..b79509120 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -14,34 +14,17 @@ "The name of the buffer to fall back to if no other buffers exist (will create it if it doesn't exist).") + +;; +;; Functions +;; + ;;;###autoload (defun doom-fallback-buffer () "Returns the fallback buffer, creating it if necessary. By default this is the scratch buffer." (get-buffer-create doom-fallback-buffer)) -;;;###autoload -(defun doom-narrow-buffer (beg end &optional clone-p) - "Restrict editing in this buffer to the current region, indirectly. With CLONE-P, -clone the buffer and hard-narrow the selection. If mark isn't active, then widen -the buffer (if narrowed). - -Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" - (interactive "r") - (cond ((region-active-p) - (deactivate-mark) - (when clone-p - (let ((old-buf (current-buffer))) - (switch-to-buffer (clone-indirect-buffer nil nil)) - (setq doom-buffer--narrowed-origin old-buf))) - (narrow-to-region beg end)) - (doom-buffer--narrowed-origin - (kill-this-buffer) - (switch-to-buffer doom-buffer--narrowed-origin) - (setq doom-buffer--narrowed-origin nil)) - (t - (widen)))) - ;; Buffer Life and Death ;;;;;;;;;;;;;;; ;;;###autoload diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 3188c27c9..d2fc05c13 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -218,8 +218,29 @@ consistent throughout a selected region, depending on `indent-tab-mode'." (tabify beg end) (untabify beg end))) +;;;###autoload +(defun doom/narrow-buffer (beg end &optional clone-p) + "Restrict editing in this buffer to the current region, indirectly. With CLONE-P, +clone the buffer and hard-narrow the selection. If mark isn't active, then widen +the buffer (if narrowed). + +Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" + (interactive "r") + (cond ((region-active-p) + (deactivate-mark) + (when clone-p + (let ((old-buf (current-buffer))) + (switch-to-buffer (clone-indirect-buffer nil nil)) + (setq doom-buffer--narrowed-origin old-buf))) + (narrow-to-region beg end)) + (doom-buffer--narrowed-origin + (kill-this-buffer) + (switch-to-buffer doom-buffer--narrowed-origin) + (setq doom-buffer--narrowed-origin nil)) + (t + (widen)))) + ;;;###autoload (defun doom|enable-delete-trailing-whitespace () "Attaches `delete-trailing-whitespace' to a buffer-local `before-save-hook'." (add-hook 'before-save-hook #'delete-trailing-whitespace nil t)) - From 37a07c79b7c25915b74d22f26f15347aa027566d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Dec 2017 22:30:34 -0500 Subject: [PATCH 103/145] popups: handle :autokill in a kill-buffer-query-fn --- core/autoload/popups.el | 10 +--------- core/core-popups.el | 10 ++++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/autoload/popups.el b/core/autoload/popups.el index a182d50c7..f4d2b6cd9 100644 --- a/core/autoload/popups.el +++ b/core/autoload/popups.el @@ -413,12 +413,4 @@ properties." (when (doom-popup-p window) (setq doom-popup-windows (delq window doom-popup-windows)) (when doom-popup-remember-history - (setq doom-popup-history (list (doom--popup-data window)))) - (let ((autokill-p (and (not doom-popup-inhibit-autokill) - (doom-popup-property :autokill window)))) - (with-selected-window window - (doom-popup-mode -1) - (when autokill-p - (when-let* ((process (get-buffer-process (current-buffer)))) - (set-process-query-on-exit-flag process nil)) - (kill-buffer (current-buffer))))))) + (setq doom-popup-history (list (doom--popup-data window)))))) diff --git a/core/core-popups.el b/core/core-popups.el index 210e27fea..6cabc5152 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -149,6 +149,16 @@ recognized by DOOM's popup system. They are: (cons '(doom-display-buffer-condition doom-display-buffer-action) display-buffer-alist))) + (defun doom|autokill-popups () + (or (not (doom-popup-p)) + (prog1 (when (and (not doom-popup-inhibit-autokill) + (plist-get doom-popup-rules :autokill)) + (doom-popup-mode -1) + (when-let* ((process (get-buffer-process (current-buffer)))) + (set-process-query-on-exit-flag process nil)) + t)))) + (add-hook 'kill-buffer-query-functions #'doom|autokill-popups) + ;; no modeline in popups (add-hook 'doom-popup-mode-hook #'doom|hide-modeline-in-popup) ;; ensure every rule without an :align, :same or :frame property has an From 6279241ec394efa193dadd29e3afa29ecc50c611 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 00:53:51 -0500 Subject: [PATCH 104/145] More reliable doom|protect-visible-buffers --- core/core-ui.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 6abf5280c..ada667f29 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -231,7 +231,8 @@ local value, whether or not it's permanent-local. Therefore, we cycle (defun doom|protect-visible-buffers () "Don't kill the current buffer if it is visible in another window (bury it instead)." - (not (and after-init-time (get-buffer-window nil t)))) + (not (delq (selected-window) + (get-buffer-window-list nil nil t)))) (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) From f61d7c9e7f095c3d0cffe2d91d86bf23a193eb93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 00:55:11 -0500 Subject: [PATCH 105/145] doom-force-kill-buffer => doom/kill-this-buffer-in-all-windows --- core/autoload/buffers.el | 28 ++++++++++++++------------ modules/feature/evil/autoload/files.el | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index b79509120..e8b7b397e 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -186,19 +186,6 @@ See `doom-real-buffer-p' for what 'real' means." (kill-buffer buffer))) (not (eq (current-buffer) buffer)))) -;;;###autoload -(defun doom-force-kill-buffer (&optional buffer dont-save) - "Kill BUFFER globally and ensure all windows previously showing BUFFER have -switched to a real buffer." - (interactive) - (let* ((buffer (or buffer (current-buffer))) - (windows (get-buffer-window-list buffer nil t))) - (doom-kill-buffer buffer dont-save) - (dolist (win windows) - (with-selected-window win - (unless (doom-real-buffer-p) - (doom/previous-buffer)))))) - ;;;###autoload (defun doom-kill-buffer-and-windows (buffer) "Kill the buffer and delete all the windows it's displayed in." @@ -239,6 +226,21 @@ regex PATTERN. Returns the number of killed buffers." (when (and (not (doom-kill-buffer)) interactive-p) (message "Nowhere left to go!"))) +;;;###autoload +(defun doom/kill-this-buffer-in-all-windows (buffer &optional dont-save) + "Kill BUFFER globally and ensure all windows previously showing this buffer +have switched to a real buffer. + +If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." + (interactive + (list (current-buffer) current-prefix-arg)) + (cl-assert (bufferp buffer) t) + (let ((windows (get-buffer-window-list buffer nil t))) + (doom-kill-buffer buffer dont-save) + (cl-loop for win in windows + if (doom-real-buffer-p (window-buffer win)) + do (with-selected-window win (doom/previous-buffer))))) + ;;;###autoload (defun doom/kill-all-buffers (&optional project-p) "Kill all buffers and closes their windows. diff --git a/modules/feature/evil/autoload/files.el b/modules/feature/evil/autoload/files.el index c247f6f46..c7d293281 100644 --- a/modules/feature/evil/autoload/files.el +++ b/modules/feature/evil/autoload/files.el @@ -35,7 +35,7 @@ kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." (error "Failed to delete %s" short-path) ;; Ensures that windows displaying this buffer will be switched ;; to real buffers (`doom-real-buffer-p') - (doom-force-kill-buffer buf t) + (doom/kill-this-buffer-in-all-windows buf t) (+evil--forget-file fname) (message "Successfully deleted %s" short-path)))))))) From 7eb1198172478c4ec8f91047284453668d05e14b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 00:56:54 -0500 Subject: [PATCH 106/145] private/default: refactor into multiple files + add evil checks --- modules/private/default/+bindings.el | 733 +++++++++++++++++ modules/private/default/+evil-commands.el | 91 +++ modules/private/default/config.el | 946 ++-------------------- 3 files changed, 883 insertions(+), 887 deletions(-) create mode 100644 modules/private/default/+bindings.el create mode 100644 modules/private/default/+evil-commands.el diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el new file mode 100644 index 000000000..a525a5a1c --- /dev/null +++ b/modules/private/default/+bindings.el @@ -0,0 +1,733 @@ +;;; private/default/+bindings.el -*- lexical-binding: t; -*- + +;; This files defines a Spacemacs-esque keybinding scheme + +(map! [remap evil-jump-to-tag] #'projectile-find-tag + [remap find-tag] #'projectile-find-tag + + ;; Ensure there are no conflicts + :nmvo doom-leader-key nil + :nmvo doom-localleader-key nil + + ;; --- Global keybindings --------------------------- + ;; Make M-x available everywhere + :gnvime "M-x" #'execute-extended-command + :gnvime "A-x" #'execute-extended-command + + ;; A little sandbox to run code in + :gnvime "M-;" #'eval-expression + :gnvime "M-:" #'doom/open-scratch-buffer + + ;; Text-scaling + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + + ;; Simple window navigation/manipulation + "C-`" #'doom/popup-toggle + "C-~" #'doom/popup-raise + "M-t" #'+workspace/new + "M-T" #'+workspace/display + "M-w" #'delete-window + "M-W" #'+workspace/close-workspace-or-frame + "M-n" #'evil-buffer-new + "M-N" #'make-frame + "M-1" (λ! (+workspace/switch-to 0)) + "M-2" (λ! (+workspace/switch-to 1)) + "M-3" (λ! (+workspace/switch-to 2)) + "M-4" (λ! (+workspace/switch-to 3)) + "M-5" (λ! (+workspace/switch-to 4)) + "M-6" (λ! (+workspace/switch-to 5)) + "M-7" (λ! (+workspace/switch-to 6)) + "M-8" (λ! (+workspace/switch-to 7)) + "M-9" (λ! (+workspace/switch-to 8)) + "M-0" #'+workspace/switch-to-last + + ;; Other sensible, textmate-esque global bindings + :ne "M-r" #'+eval/buffer + :ne "M-R" #'+eval/region-and-replace + :ne "M-b" #'+eval/build + :ne "M-a" #'mark-whole-buffer + :ne "M-c" #'evil-yank + :ne "M-q" (if (daemonp) #'delete-frame #'save-buffers-kill-emacs) + :ne "M-f" #'swiper + :ne "C-M-f" #'doom/toggle-fullscreen + :n "M-s" #'save-buffer + :m "A-j" #'+default:multi-next-line + :m "A-k" #'+default:multi-previous-line + :nv "C-SPC" #'+evil:fold-toggle + :gnvimer "M-v" #'clipboard-yank + ;; Easier window navigation + :en "C-h" #'evil-window-left + :en "C-j" #'evil-window-down + :en "C-k" #'evil-window-up + :en "C-l" #'evil-window-right + + "C-x p" #'doom/other-popup + + + ;; --- ------------------------------------- + (:leader + :desc "Ex command" :nv ";" #'evil-ex + :desc "M-x" :nv ":" #'execute-extended-command + :desc "Pop up scratch buffer" :nv "x" #'doom/open-scratch-buffer + :desc "Org Capture" :nv "X" #'+org-capture/open + + ;; Most commonly used + :desc "Find file in project" :n "SPC" #'projectile-find-file + :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer + :desc "Switch buffer" :n "<" #'switch-to-buffer + :desc "Browse files" :n "." #'find-file + :desc "Toggle last popup" :n "~" #'doom/popup-toggle + :desc "Eval expression" :n "`" #'eval-expression + :desc "Blink cursor line" :n "DEL" #'+doom/blink-cursor + :desc "Jump to bookmark" :n "RET" #'bookmark-jump + + ;; C-u is used by evil + :desc "Universal argument" :n "u" #'universal-argument + :desc "window" :n "w" evil-window-map + + (:desc "previous..." :prefix "[" + :desc "Text size" :nv "[" #'text-scale-decrease + :desc "Buffer" :nv "b" #'doom/previous-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk + :desc "Todo" :nv "t" #'hl-todo-previous + :desc "Error" :nv "e" #'previous-error + :desc "Workspace" :nv "w" #'+workspace/switch-left + :desc "Smart jump" :nv "h" #'smart-backward + :desc "Spelling error" :nv "s" #'evil-prev-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-previous-word-generic) + + (:desc "next..." :prefix "]" + :desc "Text size" :nv "]" #'text-scale-increase + :desc "Buffer" :nv "b" #'doom/next-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk + :desc "Todo" :nv "t" #'hl-todo-next + :desc "Error" :nv "e" #'next-error + :desc "Workspace" :nv "w" #'+workspace/switch-right + :desc "Smart jump" :nv "l" #'smart-forward + :desc "Spelling error" :nv "s" #'evil-next-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) + + (:desc "search" :prefix "/" + :desc "Swiper" :nv "/" #'swiper + :desc "Imenu" :nv "i" #'imenu + :desc "Imenu across buffers" :nv "I" #'imenu-anywhere + :desc "Online providers" :nv "o" #'+jump/online-select) + + (:desc "workspace" :prefix "TAB" + :desc "Display tab bar" :n "TAB" #'+workspace/display + :desc "New workspace" :n "n" #'+workspace/new + :desc "Load workspace from file" :n "l" #'+workspace/load + :desc "Load last session" :n "L" (λ! (+workspace/load-session)) + :desc "Save workspace to file" :n "s" #'+workspace/save + :desc "Autosave current session" :n "S" #'+workspace/save-session + :desc "Switch workspace" :n "." #'+workspace/switch-to + :desc "Kill all buffers" :n "x" #'doom/kill-all-buffers + :desc "Delete session" :n "X" #'+workspace/kill-session + :desc "Delete this workspace" :n "d" #'+workspace/delete + :desc "Load session" :n "L" #'+workspace/load-session + :desc "Next workspace" :n "]" #'+workspace/switch-right + :desc "Previous workspace" :n "[" #'+workspace/switch-left + :desc "Switch to 1st workspace" :n "1" (λ! (+workspace/switch-to 0)) + :desc "Switch to 2nd workspace" :n "2" (λ! (+workspace/switch-to 1)) + :desc "Switch to 3rd workspace" :n "3" (λ! (+workspace/switch-to 2)) + :desc "Switch to 4th workspace" :n "4" (λ! (+workspace/switch-to 3)) + :desc "Switch to 5th workspace" :n "5" (λ! (+workspace/switch-to 4)) + :desc "Switch to 6th workspace" :n "6" (λ! (+workspace/switch-to 5)) + :desc "Switch to 7th workspace" :n "7" (λ! (+workspace/switch-to 6)) + :desc "Switch to 8th workspace" :n "8" (λ! (+workspace/switch-to 7)) + :desc "Switch to 9th workspace" :n "9" (λ! (+workspace/switch-to 8)) + :desc "Switch to last workspace" :n "0" #'+workspace/switch-to-last) + + (:desc "buffer" :prefix "b" + :desc "New empty buffer" :n "n" #'evil-buffer-new + :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer + :desc "Switch buffer" :n "B" #'switch-to-buffer + :desc "Kill buffer" :n "k" #'doom/kill-this-buffer + :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers + :desc "Save buffer" :n "s" #'save-buffer + :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer + :desc "Bury buffer" :n "z" #'bury-buffer + :desc "Next buffer" :n "]" #'doom/next-buffer + :desc "Previous buffer" :n "[" #'doom/previous-buffer + :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) + + (:desc "code" :prefix "c" + :desc "List errors" :n "x" #'flycheck-list-errors + :desc "Evaluate buffer/region" :n "e" #'+eval/buffer + :v "e" #'+eval/region + :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region + :desc "Build tasks" :nv "b" #'+eval/build + :desc "Jump to definition" :n "d" #'+jump/definition + :desc "Jump to references" :n "D" #'+jump/references + :desc "Open REPL" :n "r" #'+eval/open-repl + :v "r" #'+eval:repl) + + (:desc "file" :prefix "f" + :desc "Find file" :n "." #'find-file + :desc "Sudo find file" :n ">" #'doom/sudo-find-file + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Find file from here" :n "?" #'counsel-file-jump + :desc "Find other file" :n "a" #'projectile-find-other-file + :desc "Open project editorconfig" :n "c" #'editorconfig-find-current-editorconfig + :desc "Find file in dotfiles" :n "d" #'+default/find-in-dotfiles + :desc "Browse dotfiles" :n "D" #'+default/browse-dotfiles + :desc "Find file in emacs.d" :n "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" :n "E" #'+default/browse-emacsd + :desc "Recent files" :n "r" #'recentf-open-files + :desc "Recent project files" :n "R" #'projectile-recentf + :desc "Yank filename" :n "y" #'+default/yank-buffer-filename) + + (:desc "git" :prefix "g" + :desc "Git status" :n "S" #'magit-status + :desc "Git blame" :n "b" #'magit-blame + :desc "Git time machine" :n "t" #'git-timemachine-toggle + :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk + :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk + :desc "Git revert buffer" :n "R" #'vc-revert + :desc "List gists" :n "g" #'+gist:list + :desc "Next hunk" :nv "]" #'git-gutter:next-hunk + :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) + + (:desc "help" :prefix "h" + :n "h" help-map + :desc "Apropos" :n "a" #'apropos + :desc "Reload theme" :n "R" #'doom//reload-theme + :desc "Find library" :n "l" #'find-library + :desc "Toggle Emacs log" :n "m" #'doom/popup-toggle-messages + :desc "Command log" :n "L" #'global-command-log-mode + :desc "Describe function" :n "f" #'describe-function + :desc "Describe key" :n "k" #'describe-key + :desc "Describe char" :n "c" #'describe-char + :desc "Describe mode" :n "M" #'describe-mode + :desc "Describe variable" :n "v" #'describe-variable + :desc "Describe face" :n "F" #'describe-face + :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe DOOM module" :n "d" #'doom/describe-module + :desc "Find definition" :n "." #'+jump/definition + :desc "Find references" :n "/" #'+jump/references + :desc "Find documentation" :n "h" #'+jump/documentation + :desc "What face" :n "'" #'doom/what-face + :desc "What minor modes" :n ";" #'doom/what-minor-mode + :desc "Info" :n "i" #'info + :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) + + (:desc "insert" :prefix "i" + :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From snippet" :nv "s" #'yas-insert-snippet) + + (:desc "notes" :prefix "n" + :desc "Find file in notes" :n "n" #'+default/find-in-notes + :desc "Browse notes" :n "N" #'+default/browse-notes + :desc "Org capture" :n "x" #'+org-capture/open + :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode + :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) + + (:desc "open" :prefix "o" + :desc "Default browser" :n "b" #'browse-url-of-file + :desc "Debugger" :n "d" #'+debug/open + :desc "REPL" :n "r" #'+eval/open-repl + :v "r" #'+eval:repl + :desc "Neotree" :n "n" #'+neotree/toggle + :desc "Terminal" :n "t" #'+term/open-popup + :desc "Terminal in project" :n "T" #'+term/open-popup-in-project + + ;; applications + :desc "APP: elfeed" :n "E" #'=rss + :desc "APP: email" :n "M" #'=email + :desc "APP: twitter" :n "T" #'=twitter + :desc "APP: regex" :n "X" #'=regex + + ;; macos + (:when IS-MAC + :desc "Reveal in Finder" :n "o" #'+macos/reveal-in-finder + :desc "Reveal project in Finder" :n "O" #'+macos/reveal-project-in-finder + :desc "Send to Transmit" :n "u" #'+macos/send-to-transmit + :desc "Send project to Transmit" :n "U" #'+macos/send-project-to-transmit + :desc "Send to Launchbar" :n "l" #'+macos/send-to-launchbar + :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar)) + + (:desc "project" :prefix "p" + :desc "Browse project" :n "." #'+default/browse-project + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Run cmd in project root" :nv "!" #'projectile-run-shell-command-in-root + :desc "Switch project" :n "p" #'projectile-switch-project + :desc "Recent project files" :n "r" #'projectile-recentf + :desc "List project tasks" :n "t" #'+ivy/tasks + :desc "Pop term in project" :n "o" #'+term/open-popup-in-project + :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) + + (:desc "quit" :prefix "q" + :desc "Quit" :n "q" #'evil-save-and-quit + :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) + + (:desc "remote" :prefix "r" + :desc "Upload local" :n "u" #'+upload/local + :desc "Upload local (force)" :n "U" (λ! (+upload/local t)) + :desc "Download remote" :n "d" #'+upload/remote-download + :desc "Diff local & remote" :n "D" #'+upload/diff + :desc "Browse remote files" :n "." #'+upload/browse + :desc "Detect remote changes" :n ">" #'+upload/check-remote) + + (:desc "snippets" :prefix "s" + :desc "New snippet" :n "n" #'yas-new-snippet + :desc "Insert snippet" :nv "i" #'yas-insert-snippet + :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file + :desc "Find snippet" :n "S" #'+default/find-in-snippets) + + (:desc "toggle" :prefix "t" + :desc "Flyspell" :n "s" #'flyspell-mode + :desc "Flycheck" :n "f" #'flycheck-mode + :desc "Line numbers" :n "l" #'doom/toggle-line-numbers + :desc "Fullscreen" :n "f" #'doom/toggle-fullscreen + :desc "Indent guides" :n "i" #'highlight-indentation-mode + :desc "Indent guides (column)" :n "I" #'highlight-indentation-current-column-mode + :desc "Impatient mode" :n "h" #'+impatient-mode/toggle + :desc "Big mode" :n "b" #'doom-big-font-mode + :desc "Evil goggles" :n "g" #'+evil-goggles/toggle)) + + + ;; --- Personal vim-esque bindings ------------------ + :n "zx" #'doom/kill-this-buffer + :n "ZX" #'bury-buffer + :n "]b" #'doom/next-buffer + :n "[b" #'doom/previous-buffer + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left + :m "gt" #'+workspace/switch-right + :m "gT" #'+workspace/switch-left + :m "gd" #'+jump/definition + :m "gD" #'+jump/references + :m "gh" #'+jump/documentation + :n "gp" #'+evil/reselect-paste + :n "gr" #'+eval:region + :n "gR" #'+eval/buffer + :v "gR" #'+eval:replace-region + :v "@" #'+evil:macro-on-all-lines + :n "g@" #'+evil:macro-on-all-lines + ;; repeat in visual mode (FIXME buggy) + :v "." #'evil-repeat + ;; don't leave visual mode after shifting + :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + ;; paste from recent yank register (which isn't overwritten) + :v "C-p" "\"0p" + + (:map evil-window-map ; prefix "C-w" + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'ace-window + ;; Swapping windows + "H" #'+evil/window-move-left + "J" #'+evil/window-move-down + "K" #'+evil/window-move-up + "L" #'+evil/window-move-right + "C-S-w" #'ace-swap-window + ;; Window undo/redo + "u" #'winner-undo + "C-u" #'winner-undo + "C-r" #'winner-redo + "o" #'doom/window-enlargen + ;; Delete window + "c" #'+workspace/close-window-or-workspace + "C-C" #'ace-delete-window) + + + ;; --- Plugin bindings ------------------------------ + ;; auto-yasnippet + :i [C-tab] #'aya-expand + :nv [C-tab] #'aya-create + + ;; company-mode (vim-like omnicompletion) + :i "C-SPC" #'+company/complete + (:prefix "C-x" + :i "C-l" #'+company/whole-lines + :i "C-k" #'+company/dict-or-keywords + :i "C-f" #'company-files + :i "C-]" #'company-etags + :i "s" #'company-ispell + :i "C-s" #'company-yasnippet + :i "C-o" #'company-capf + :i "C-n" #'company-dabbrev-code + :i "C-p" #'+company/dabbrev-code-previous) + (:after company + (:map company-active-map + ;; Don't interfere with `evil-delete-backward-word' in insert mode + "C-w" nil + "C-o" #'company-search-kill-others + "C-n" #'company-select-next + "C-p" #'company-select-previous + "C-h" #'company-quickhelp-manual-begin + "C-S-h" #'company-show-doc-buffer + "C-S-s" #'company-search-candidates + "C-s" #'company-filter-candidates + "C-SPC" #'company-complete-common + "C-h" #'company-quickhelp-manual-begin + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous + [escape] (λ! (company-abort) (evil-normal-state 1))) + ;; Automatically applies to `company-filter-map' + (:map company-search-map + "C-n" #'company-search-repeat-forward + "C-p" #'company-search-repeat-backward + "C-s" (λ! (company-search-abort) (company-filter-candidates)) + [escape] #'company-search-abort)) + + ;; counsel + (:after counsel + (:map counsel-ag-map + [backtab] #'+ivy/wgrep-occur ; search/replace on results + "C-SPC" #'ivy-call-and-recenter ; preview + "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) + + ;; evil-commentary + :n "gc" #'evil-commentary + + ;; evil-exchange + :n "gx" #'evil-exchange + + ;; evil-matchit + :nv [tab] #'+evil/matchit-or-toggle-fold + + ;; evil-magit + (:after evil-magit + :map (magit-status-mode-map magit-revision-mode-map) + :n "C-j" nil + :n "C-k" nil) + + ;; evil-mc + (:prefix "gz" + :nv "m" #'evil-mc-make-all-cursors + :nv "u" #'evil-mc-undo-all-cursors + :nv "z" #'+evil/mc-make-cursor-here + :nv "t" #'+evil/mc-toggle-cursors + :nv "n" #'evil-mc-make-and-goto-next-cursor + :nv "p" #'evil-mc-make-and-goto-prev-cursor + :nv "N" #'evil-mc-make-and-goto-last-cursor + :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "d" #'evil-mc-make-and-goto-next-match + :nv "D" #'evil-mc-make-and-goto-prev-match) + (:after evil-mc + :map evil-mc-key-map + :nv "C-n" #'evil-mc-make-and-goto-next-cursor + :nv "C-N" #'evil-mc-make-and-goto-last-cursor + :nv "C-p" #'evil-mc-make-and-goto-prev-cursor + :nv "C-P" #'evil-mc-make-and-goto-first-cursor) + + ;; evil-multiedit + :v "R" #'evil-multiedit-match-all + :n "M-d" #'evil-multiedit-match-symbol-and-next + :n "M-D" #'evil-multiedit-match-symbol-and-prev + :v "M-d" #'evil-multiedit-match-and-next + :v "M-D" #'evil-multiedit-match-and-prev + :nv "C-M-d" #'evil-multiedit-restore + (:after evil-multiedit + (:map evil-multiedit-state-map + "M-d" #'evil-multiedit-match-and-next + "M-D" #'evil-multiedit-match-and-prev + "RET" #'evil-multiedit-toggle-or-restrict-region) + (:map (evil-multiedit-state-map evil-multiedit-insert-state-map) + "C-n" #'evil-multiedit-next + "C-p" #'evil-multiedit-prev)) + + ;; evil-snipe + (:after evil-snipe + (:after evil-easymotion + ;; Binding to switch to evil-easymotion/avy after a snipe + :map evil-snipe-parent-transient-map + "C-;" (λ! (require 'evil-easymotion) + (call-interactively + (evilem-create #'evil-snipe-repeat + :bind ((evil-snipe-scope 'whole-buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))))))) + + ;; evil-surround + :v "S" #'evil-surround-region + :o "s" #'evil-surround-edit + :o "S" #'evil-Surround-edit + + ;; expand-region + :v "v" #'er/expand-region + :v "V" #'er/contract-region + + ;; flycheck + :m "]e" #'next-error + :m "[e" #'previous-error + (:after flycheck + :map flycheck-error-list-mode-map + :n "C-n" #'flycheck-error-list-next-error + :n "C-p" #'flycheck-error-list-previous-error + :n "j" #'flycheck-error-list-next-error + :n "k" #'flycheck-error-list-previous-error + :n "RET" #'flycheck-error-list-goto-error) + + ;; flyspell + :m "]S" #'flyspell-correct-word-generic + :m "[S" #'flyspell-correct-previous-word-generic + + ;; git-gutter + :m "]d" #'git-gutter:next-hunk + :m "[d" #'git-gutter:previous-hunk + + ;; git-timemachine + (:after git-timemachine + (:map git-timemachine-mode-map + :n "C-p" #'git-timemachine-show-previous-revision + :n "C-n" #'git-timemachine-show-next-revision + :n "[[" #'git-timemachine-show-previous-revision + :n "]]" #'git-timemachine-show-next-revision + :n "q" #'git-timemachine-quit + :n "gb" #'git-timemachine-blame)) + + ;; gist + (:after gist + :map gist-list-menu-mode-map + :n "RET" #'+gist/open-current + :n "b" #'gist-browse-current-url + :n "c" #'gist-add-buffer + :n "d" #'gist-kill-current + :n "f" #'gist-fork + :n "q" #'quit-window + :n "r" #'gist-list-reload + :n "s" #'gist-star + :n "S" #'gist-unstar + :n "y" #'gist-print-current-url) + + ;; helm + (:after helm + (:map helm-map + "ESC" nil + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + "C-u" #'helm-delete-minibuffer-contents + "C-w" #'backward-kill-word + "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! + "C-b" #'backward-word + [left] #'backward-char + [right] #'forward-char + [escape] #'helm-keyboard-quit + [tab] #'helm-execute-persistent-action) + + (:after helm-files + (:map helm-generic-files-map + :e "ESC" #'helm-keyboard-quit) + (:map helm-find-files-map + "C-w" #'helm-find-files-up-one-level + "TAB" #'helm-execute-persistent-action)) + + (:after helm-ag + (:map helm-ag-map + "" #'helm-ag-edit))) + + ;; hl-todo + :m "]t" #'hl-todo-next + :m "[t" #'hl-todo-previous + + ;; ivy + (:after ivy + :map ivy-minibuffer-map + [escape] #'keyboard-escape-quit + "C-SPC" #'ivy-call-and-recenter + "M-v" #'yank + "M-z" #'undo + "C-r" #'evil-paste-from-register + "C-k" #'ivy-previous-line + "C-j" #'ivy-next-line + "C-l" #'ivy-alt-done + "C-w" #'ivy-backward-kill-word + "C-u" #'ivy-kill-line + "C-b" #'backward-word + "C-f" #'forward-word) + + ;; neotree + (:after neotree + :map neotree-mode-map + :n "g" nil + :n [tab] #'neotree-quick-look + :n "RET" #'neotree-enter + :n [backspace] #'evil-window-prev + :n "c" #'neotree-create-node + :n "r" #'neotree-rename-node + :n "d" #'neotree-delete-node + :n "j" #'neotree-next-line + :n "k" #'neotree-previous-line + :n "n" #'neotree-next-line + :n "p" #'neotree-previous-line + :n "h" #'+neotree/collapse-or-up + :n "l" #'+neotree/expand-or-open + :n "J" #'neotree-select-next-sibling-node + :n "K" #'neotree-select-previous-sibling-node + :n "H" #'neotree-select-up-node + :n "L" #'neotree-select-down-node + :n "G" #'evil-goto-line + :n "gg" #'evil-goto-first-line + :n "v" #'neotree-enter-vertical-split + :n "s" #'neotree-enter-horizontal-split + :n "q" #'neotree-hide + :n "R" #'neotree-refresh) + + ;; realgud + (:after realgud + :map realgud:shortkey-mode-map + :n "j" #'evil-next-line + :n "k" #'evil-previous-line + :n "h" #'evil-backward-char + :n "l" #'evil-forward-char + :m "n" #'realgud:cmd-next + :m "b" #'realgud:cmd-break + :m "B" #'realgud:cmd-clear + :n "c" #'realgud:cmd-continue) + + ;; rotate-text + :n "!" #'rotate-text + + ;; smart-forward + :nv "K" #'smart-up + :m "g]" #'smart-forward + :m "g[" #'smart-backward + + ;; undo-tree -- undo/redo for visual regions + :v "C-u" #'undo-tree-undo + :v "C-r" #'undo-tree-redo + + ;; yasnippet + (:after yasnippet + (:map yas-keymap + "C-e" #'+snippets/goto-end-of-field + "C-a" #'+snippets/goto-start-of-field + "" #'+snippets/goto-end-of-field + "" #'+snippets/goto-start-of-field + "" #'+snippets/delete-to-start-of-field + [escape] #'evil-normal-state + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) + (:map yas-minor-mode-map + :i "" yas-maybe-expand + :v "" #'+snippets/expand-on-region)) + + + ;; --- Major mode bindings -------------------------- + (:after markdown-mode + (:map markdown-mode-map + ;; fix conflicts with private bindings + "" nil + "" nil + "" nil)) + + + ;; --- Custom evil text-objects --------------------- + :textobj "a" #'evil-inner-arg #'evil-outer-arg + :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block + :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent + :textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up + :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down + + + ;; --- Built-in plugins ----------------------------- + (:after comint + ;; TAB auto-completion in term buffers + :map comint-mode-map [tab] #'company-complete) + + (:after debug + ;; For elisp debugging + :map debugger-mode-map + :n "RET" #'debug-help-follow + :n "e" #'debugger-eval-expression + :n "n" #'debugger-step-through + :n "c" #'debugger-continue) + + (:map help-mode-map + :n "[[" #'help-go-back + :n "]]" #'help-go-forward + :n "o" #'ace-link-help + :n "q" #'quit-window + :n "Q" #'+ivy-quit-and-resume) + + (:after vc-annotate + :map vc-annotate-mode-map + :n "q" #'kill-this-buffer + :n "d" #'vc-annotate-show-diff-revision-at-line + :n "D" #'vc-annotate-show-changeset-diff-revision-at-line + :n "SPC" #'vc-annotate-show-log-revision-at-line + :n "]]" #'vc-annotate-next-revision + :n "[[" #'vc-annotate-prev-revision + :n "TAB" #'vc-annotate-toggle-annotation-visibility + :n "RET" #'vc-annotate-find-revision-at-line)) + + +;; +;; Keybinding fixes +;; + +;; This section is dedicated to "fixing" certain keys so that they behave +;; properly, more like vim, or how I like it. + +(map! (:map input-decode-map + [S-iso-lefttab] [backtab] + (:unless window-system "TAB" [tab])) ; Fix TAB in terminal + + ;; I want C-a and C-e to be a little smarter. C-a will jump to + ;; indentation. Pressing it again will send you to the true bol. Same goes + ;; for C-e, except it will ignore comments and trailing whitespace before + ;; jumping to eol. + :i "C-a" #'doom/backward-to-bol-or-indent + :i "C-e" #'doom/forward-to-last-non-comment-or-eol + :i "C-u" #'doom/backward-kill-to-bol-and-indent + + ;; textmate-esque newline insertion + :i [M-return] #'evil-open-below + :i [S-M-return] #'evil-open-above + ;; textmate-esque deletion + [M-backspace] #'doom/backward-kill-to-bol-and-indent + :i [backspace] #'delete-backward-char + :i [M-backspace] #'doom/backward-kill-to-bol-and-indent + ;; Emacsien motions for insert mode + :i "C-b" #'backward-word + :i "C-f" #'forward-word + + ;; Highjacks space/backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented blocks intelligently + ;; c) do none of this when inside a string + :i "SPC" #'doom/inflate-space-maybe + :i [remap delete-backward-char] #'doom/deflate-space-maybe + :i [remap newline] #'doom/newline-and-indent + + (:after org + (:map org-mode-map + :i [remap doom/inflate-space-maybe] #'org-self-insert-command + :i "C-e" #'org-end-of-line + :i "C-a" #'org-beginning-of-line)) + + ;; Restore common editing keys (and ESC) in minibuffer + (:map (minibuffer-local-map + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map + evil-ex-completion-map + evil-ex-search-keymap + read-expression-map) + [escape] #'abort-recursive-edit + "C-r" #'evil-paste-from-register + "C-a" #'move-beginning-of-line + "C-w" #'doom/minibuffer-kill-word + "C-u" #'doom/minibuffer-kill-line + "C-b" #'backward-word + "C-f" #'forward-word + "M-z" #'doom/minibuffer-undo) + + (:map messages-buffer-mode-map + "M-;" #'eval-expression + "A-;" #'eval-expression) + + (:map tabulated-list-mode-map + [remap evil-record-macro] #'doom/popup-close-maybe) + + (:after view + (:map view-mode-map "" #'View-quit-all))) diff --git a/modules/private/default/+evil-commands.el b/modules/private/default/+evil-commands.el new file mode 100644 index 000000000..306ea8834 --- /dev/null +++ b/modules/private/default/+evil-commands.el @@ -0,0 +1,91 @@ +;;; private/default/+evil-commands.el -*- lexical-binding: t; -*- + +(defalias 'ex! 'evil-ex-define-cmd) + + ;;; Commands defined elsewhere +;;(ex! "al[ign]" #'+evil:align) +;;(ex! "g[lobal]" #'+evil:global) + + ;;; Custom commands +;; Editing +(ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me +(ex! "al[ign]" #'+evil:align) +(ex! "enhtml" #'+web:encode-html-entities) +(ex! "dehtml" #'+web:decode-html-entities) +(ex! "mc" #'+evil:mc) +(ex! "iedit" #'evil-multiedit-ex-match) +(ex! "na[rrow]" #'+evil:narrow-buffer) +(ex! "retab" #'+evil:retab) +;; External resources +;; TODO (ex! "db" #'doom:db) +;; TODO (ex! "dbu[se]" #'doom:db-select) +;; TODO (ex! "go[ogle]" #'doom:google-search) +(ex! "lo[okup]" #'+jump:online) +(ex! "http" #'httpd-start) ; start http server +(ex! "repl" #'+eval:repl) ; invoke or send to repl +;; TODO (ex! "rx" 'doom:regex) ; open re-builder +(ex! "sh[ell]" #'+eshell:run) +(ex! "t[mux]" #'+tmux:run) ; send to tmux +(ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux +(ex! "x" #'doom/open-project-scratch-buffer) +;; GIT +(ex! "gist" #'+gist:send) ; send current buffer/region to gist +(ex! "gistl" #'+gist:list) ; list gists by user +(ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab +(ex! "gissues" #'+vcs/git-browse-issues) ; show github issues +(ex! "git" #'magit-status) ; open magit status window +(ex! "gstage" #'magit-stage) +(ex! "gunstage" #'magit-unstage) +(ex! "gblame" #'magit-blame) +(ex! "grevert" #'git-gutter:revert-hunk) +;; Dealing with buffers +(ex! "clean[up]" #'doom/cleanup-session) +(ex! "k[ill]" #'doom/kill-this-buffer) +(ex! "k[ill]all" #'+default:kill-all-buffers) +(ex! "k[ill]m" #'+default:kill-matching-buffers) +(ex! "k[ill]o" #'doom/kill-other-buffers) +(ex! "l[ast]" #'doom/popup-restore) +(ex! "m[sg]" #'view-echo-area-messages) +(ex! "pop[up]" #'doom/popup-this-buffer) +;; Project navigation +(ex! "a" #'projectile-find-other-file) +(ex! "cd" #'+default:cd) +(cond ((featurep! :completion ivy) + (ex! "ag" #'+ivy:ag) + (ex! "agc[wd]" #'+ivy:ag-cwd) + (ex! "rg" #'+ivy:rg) + (ex! "rgc[wd]" #'+ivy:rg-cwd) + (ex! "sw[iper]" #'+ivy:swiper) + (ex! "todo" #'+ivy:todo)) + ((featurep! :completion helm) + (ex! "ag" #'+helm:ag) + (ex! "agc[wd]" #'+helm:ag-cwd) + (ex! "rg" #'+helm:rg) + (ex! "rgc[wd]" #'+helm:rg-cwd) + (ex! "sw[oop]" #'+helm:swoop) + (ex! "todo" #'+helm:todo))) +;; Project tools +(ex! "build" #'+eval/build) +(ex! "debug" #'+debug/run) +(ex! "er[rors]" #'flycheck-list-errors) +;; File operations +(ex! "cp" #'+evil:copy-this-file) +(ex! "mv" #'+evil:move-this-file) +(ex! "rm" #'+evil:delete-this-file) +;; Sessions/tabs +(ex! "sclear" #'+workspace/kill-session) +(ex! "sl[oad]" #'+workspace:load-session) +(ex! "ss[ave]" #'+workspace:save-session) +(ex! "tabc[lose]" #'+workspace:delete) +(ex! "tabclear" #'doom/kill-all-buffers) +(ex! "tabl[ast]" #'+workspace/switch-to-last) +(ex! "tabload" #'+workspace:load) +(ex! "tabn[ew]" #'+workspace:new) +(ex! "tabn[ext]" #'+workspace:switch-next) +(ex! "tabp[rev]" #'+workspace:switch-previous) +(ex! "tabr[ename]" #'+workspace:rename) +(ex! "tabs" #'+workspace/display) +(ex! "tabsave" #'+workspace:save) +;; Org-mode +(ex! "cap" #'+org-capture/dwim) + diff --git a/modules/private/default/config.el b/modules/private/default/config.el index dcce9d698..4379a6955 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -1,5 +1,8 @@ ;;; private/default/config.el -*- lexical-binding: t; -*- +(load! +bindings) + + ;; ;; Plugins ;; @@ -18,891 +21,60 @@ epa-pinentry-mode 'loopback)) -;; -;; Custom Ex-commands for `evil-mode' -;; - (when (featurep 'evil) - (defalias 'ex! 'evil-ex-define-cmd) - - ;;; Commands defined elsewhere - ;;(ex! "al[ign]" #'+evil:align) - ;;(ex! "g[lobal]" #'+evil:global) - - ;;; Custom commands - ;; Editing - (ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me - (ex! "al[ign]" #'+evil:align) - (ex! "enhtml" #'+web:encode-html-entities) - (ex! "dehtml" #'+web:decode-html-entities) - (ex! "mc" #'+evil:mc) - (ex! "iedit" #'evil-multiedit-ex-match) - (ex! "na[rrow]" #'+evil:narrow-buffer) - (ex! "retab" #'+evil:retab) - ;; External resources - ;; TODO (ex! "db" #'doom:db) - ;; TODO (ex! "dbu[se]" #'doom:db-select) - ;; TODO (ex! "go[ogle]" #'doom:google-search) - (ex! "lo[okup]" #'+jump:online) - (ex! "http" #'httpd-start) ; start http server - (ex! "repl" #'+eval:repl) ; invoke or send to repl - ;; TODO (ex! "rx" 'doom:regex) ; open re-builder - (ex! "sh[ell]" #'+eshell:run) - (ex! "t[mux]" #'+tmux:run) ; send to tmux - (ex! "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux - (ex! "x" #'doom/open-project-scratch-buffer) - ;; GIT - (ex! "gist" #'+gist:send) ; send current buffer/region to gist - (ex! "gistl" #'+gist:list) ; list gists by user - (ex! "gbrowse" #'+vcs/git-browse) ; show file in github/gitlab - (ex! "gissues" #'+vcs/git-browse-issues) ; show github issues - (ex! "git" #'magit-status) ; open magit status window - (ex! "gstage" #'magit-stage) - (ex! "gunstage" #'magit-unstage) - (ex! "gblame" #'magit-blame) - (ex! "grevert" #'git-gutter:revert-hunk) - ;; Dealing with buffers - (ex! "clean[up]" #'doom/cleanup-buffers) - (ex! "k[ill]" #'doom/kill-this-buffer) - (ex! "k[ill]all" #'+default:kill-all-buffers) - (ex! "k[ill]m" #'+default:kill-matching-buffers) - (ex! "k[ill]o" #'doom/kill-other-buffers) - (ex! "l[ast]" #'doom/popup-restore) - (ex! "m[sg]" #'view-echo-area-messages) - (ex! "pop[up]" #'doom/popup-this-buffer) - ;; Project navigation - (ex! "a" #'projectile-find-other-file) - (ex! "cd" #'+default:cd) - (cond ((featurep! :completion ivy) - (ex! "ag" #'+ivy:ag) - (ex! "agc[wd]" #'+ivy:ag-cwd) - (ex! "rg" #'+ivy:rg) - (ex! "rgc[wd]" #'+ivy:rg-cwd) - (ex! "sw[iper]" #'+ivy:swiper) - (ex! "todo" #'+ivy:todo)) - ((featurep! :completion helm) - (ex! "ag" #'+helm:ag) - (ex! "agc[wd]" #'+helm:ag-cwd) - (ex! "rg" #'+helm:rg) - (ex! "rgc[wd]" #'+helm:rg-cwd) - (ex! "sw[oop]" #'+helm:swoop) - (ex! "todo" #'+helm:todo))) - ;; Project tools - (ex! "build" #'+eval/build) - (ex! "debug" #'+debug/run) - (ex! "er[rors]" #'flycheck-list-errors) - ;; File operations - (ex! "cp" #'+evil:copy-this-file) - (ex! "mv" #'+evil:move-this-file) - (ex! "rm" #'+evil:delete-this-file) - ;; Sessions/tabs - (ex! "sclear" #'+workspace/kill-session) - (ex! "sl[oad]" #'+workspace:load-session) - (ex! "ss[ave]" #'+workspace:save-session) - (ex! "tabc[lose]" #'+workspace:delete) - (ex! "tabclear" #'doom/kill-all-buffers) - (ex! "tabl[ast]" #'+workspace/switch-to-last) - (ex! "tabload" #'+workspace:load) - (ex! "tabn[ew]" #'+workspace:new) - (ex! "tabn[ext]" #'+workspace:switch-next) - (ex! "tabp[rev]" #'+workspace:switch-previous) - (ex! "tabr[ename]" #'+workspace:rename) - (ex! "tabs" #'+workspace/display) - (ex! "tabsave" #'+workspace:save) - ;; Org-mode - (ex! "cap" #'+org-capture/dwim)) - - -;; -;; Keybindings -;; - -(map! [remap evil-jump-to-tag] #'projectile-find-tag - [remap find-tag] #'projectile-find-tag - - ;; Ensure there are no conflicts - :nmvo doom-leader-key nil - :nmvo doom-localleader-key nil - - ;; --- Global keybindings --------------------------- - ;; Make M-x available everywhere - :gnvime "M-x" #'execute-extended-command - :gnvime "A-x" #'execute-extended-command - - ;; A little sandbox to run code in - :gnvime "M-;" #'eval-expression - :gnvime "M-:" #'doom/open-scratch-buffer - - ;; Text-scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease - - ;; Simple window navigation/manipulation - "C-`" #'doom/popup-toggle - "C-~" #'doom/popup-raise - "M-t" #'+workspace/new - "M-T" #'+workspace/display - "M-w" #'delete-window - "M-W" #'+workspace/close-workspace-or-frame - "M-n" #'evil-buffer-new - "M-N" #'make-frame - "M-1" (λ! (+workspace/switch-to 0)) - "M-2" (λ! (+workspace/switch-to 1)) - "M-3" (λ! (+workspace/switch-to 2)) - "M-4" (λ! (+workspace/switch-to 3)) - "M-5" (λ! (+workspace/switch-to 4)) - "M-6" (λ! (+workspace/switch-to 5)) - "M-7" (λ! (+workspace/switch-to 6)) - "M-8" (λ! (+workspace/switch-to 7)) - "M-9" (λ! (+workspace/switch-to 8)) - "M-0" #'+workspace/switch-to-last - - ;; Other sensible, textmate-esque global bindings - :ne "M-r" #'+eval/buffer - :ne "M-R" #'+eval/region-and-replace - :ne "M-b" #'+eval/build - :ne "M-a" #'mark-whole-buffer - :ne "M-c" #'evil-yank - :ne "M-q" (if (daemonp) #'delete-frame #'save-buffers-kill-emacs) - :ne "M-f" #'swiper - :ne "C-M-f" #'doom/toggle-fullscreen - :n "M-s" #'save-buffer - :m "A-j" #'+default:multi-next-line - :m "A-k" #'+default:multi-previous-line - :nv "C-SPC" #'+evil:fold-toggle - :gnvimer "M-v" #'clipboard-yank - ;; Easier window navigation - :en "C-h" #'evil-window-left - :en "C-j" #'evil-window-down - :en "C-k" #'evil-window-up - :en "C-l" #'evil-window-right - - "C-x p" #'doom/other-popup - - - ;; --- ------------------------------------- - (:leader - :desc "Ex command" :nv ";" #'evil-ex - :desc "M-x" :nv ":" #'execute-extended-command - :desc "Pop up scratch buffer" :nv "x" #'doom/open-scratch-buffer - :desc "Org Capture" :nv "X" #'+org-capture/open - - ;; Most commonly used - :desc "Find file in project" :n "SPC" #'projectile-find-file - :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer - :desc "Switch buffer" :n "<" #'switch-to-buffer - :desc "Browse files" :n "." #'find-file - :desc "Toggle last popup" :n "~" #'doom/popup-toggle - :desc "Eval expression" :n "`" #'eval-expression - :desc "Blink cursor line" :n "DEL" #'+doom/blink-cursor - :desc "Jump to bookmark" :n "RET" #'bookmark-jump - - ;; C-u is used by evil - :desc "Universal argument" :n "u" #'universal-argument - :desc "window" :n "w" evil-window-map - - (:desc "previous..." :prefix "[" - :desc "Text size" :nv "[" #'text-scale-decrease - :desc "Buffer" :nv "b" #'doom/previous-buffer - :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk - :desc "Todo" :nv "t" #'hl-todo-previous - :desc "Error" :nv "e" #'previous-error - :desc "Workspace" :nv "w" #'+workspace/switch-left - :desc "Smart jump" :nv "h" #'smart-backward - :desc "Spelling error" :nv "s" #'evil-prev-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-previous-word-generic) - - (:desc "next..." :prefix "]" - :desc "Text size" :nv "]" #'text-scale-increase - :desc "Buffer" :nv "b" #'doom/next-buffer - :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk - :desc "Todo" :nv "t" #'hl-todo-next - :desc "Error" :nv "e" #'next-error - :desc "Workspace" :nv "w" #'+workspace/switch-right - :desc "Smart jump" :nv "l" #'smart-forward - :desc "Spelling error" :nv "s" #'evil-next-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) - - (:desc "search" :prefix "/" - :desc "Swiper" :nv "/" #'swiper - :desc "Imenu" :nv "i" #'imenu - :desc "Imenu across buffers" :nv "I" #'imenu-anywhere - :desc "Online providers" :nv "o" #'+jump/online-select) - - (:desc "workspace" :prefix "TAB" - :desc "Display tab bar" :n "TAB" #'+workspace/display - :desc "New workspace" :n "n" #'+workspace/new - :desc "Load workspace from file" :n "l" #'+workspace/load - :desc "Load last session" :n "L" (λ! (+workspace/load-session)) - :desc "Save workspace to file" :n "s" #'+workspace/save - :desc "Autosave current session" :n "S" #'+workspace/save-session - :desc "Switch workspace" :n "." #'+workspace/switch-to - :desc "Kill all buffers" :n "x" #'doom/kill-all-buffers - :desc "Delete session" :n "X" #'+workspace/kill-session - :desc "Delete this workspace" :n "d" #'+workspace/delete - :desc "Load session" :n "L" #'+workspace/load-session - :desc "Next workspace" :n "]" #'+workspace/switch-right - :desc "Previous workspace" :n "[" #'+workspace/switch-left - :desc "Switch to 1st workspace" :n "1" (λ! (+workspace/switch-to 0)) - :desc "Switch to 2nd workspace" :n "2" (λ! (+workspace/switch-to 1)) - :desc "Switch to 3rd workspace" :n "3" (λ! (+workspace/switch-to 2)) - :desc "Switch to 4th workspace" :n "4" (λ! (+workspace/switch-to 3)) - :desc "Switch to 5th workspace" :n "5" (λ! (+workspace/switch-to 4)) - :desc "Switch to 6th workspace" :n "6" (λ! (+workspace/switch-to 5)) - :desc "Switch to 7th workspace" :n "7" (λ! (+workspace/switch-to 6)) - :desc "Switch to 8th workspace" :n "8" (λ! (+workspace/switch-to 7)) - :desc "Switch to 9th workspace" :n "9" (λ! (+workspace/switch-to 8)) - :desc "Switch to last workspace" :n "0" #'+workspace/switch-to-last) - - (:desc "buffer" :prefix "b" - :desc "New empty buffer" :n "n" #'evil-buffer-new - :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer - :desc "Switch buffer" :n "B" #'switch-to-buffer - :desc "Kill buffer" :n "k" #'doom/kill-this-buffer - :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers - :desc "Save buffer" :n "s" #'save-buffer - :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer - :desc "Bury buffer" :n "z" #'bury-buffer - :desc "Next buffer" :n "]" #'doom/next-buffer - :desc "Previous buffer" :n "[" #'doom/previous-buffer - :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) - - (:desc "code" :prefix "c" - :desc "List errors" :n "x" #'flycheck-list-errors - :desc "Evaluate buffer/region" :n "e" #'+eval/buffer - :v "e" #'+eval/region - :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region - :desc "Build tasks" :nv "b" #'+eval/build - :desc "Jump to definition" :n "d" #'+jump/definition - :desc "Jump to references" :n "D" #'+jump/references - :desc "Open REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl) - - (:desc "file" :prefix "f" - :desc "Find file" :n "." #'find-file - :desc "Sudo find file" :n ">" #'doom/sudo-find-file - :desc "Find file in project" :n "/" #'projectile-find-file - :desc "Find file from here" :n "?" #'counsel-file-jump - :desc "Find other file" :n "a" #'projectile-find-other-file - :desc "Open project editorconfig" :n "c" #'editorconfig-find-current-editorconfig - :desc "Find file in dotfiles" :n "d" #'+default/find-in-dotfiles - :desc "Browse dotfiles" :n "D" #'+default/browse-dotfiles - :desc "Find file in emacs.d" :n "e" #'+default/find-in-emacsd - :desc "Browse emacs.d" :n "E" #'+default/browse-emacsd - :desc "Recent files" :n "r" #'recentf-open-files - :desc "Recent project files" :n "R" #'projectile-recentf - :desc "Yank filename" :n "y" #'+default/yank-buffer-filename) - - (:desc "git" :prefix "g" - :desc "Git status" :n "S" #'magit-status - :desc "Git blame" :n "b" #'magit-blame - :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk - :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk - :desc "Git revert buffer" :n "R" #'vc-revert - :desc "List gists" :n "g" #'+gist:list - :desc "Next hunk" :nv "]" #'git-gutter:next-hunk - :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) - - (:desc "help" :prefix "h" - :n "h" help-map - :desc "Apropos" :n "a" #'apropos - :desc "Reload theme" :n "R" #'doom//reload-theme - :desc "Find library" :n "l" #'find-library - :desc "Toggle Emacs log" :n "m" #'doom/popup-toggle-messages - :desc "Command log" :n "L" #'global-command-log-mode - :desc "Describe function" :n "f" #'describe-function - :desc "Describe key" :n "k" #'describe-key - :desc "Describe char" :n "c" #'describe-char - :desc "Describe mode" :n "M" #'describe-mode - :desc "Describe variable" :n "v" #'describe-variable - :desc "Describe face" :n "F" #'describe-face - :desc "Describe DOOM setting" :n "s" #'doom/describe-setting - :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Find definition" :n "." #'+jump/definition - :desc "Find references" :n "/" #'+jump/references - :desc "Find documentation" :n "h" #'+jump/documentation - :desc "What face" :n "'" #'doom/what-face - :desc "What minor modes" :n ";" #'doom/what-minor-mode - :desc "Info" :n "i" #'info - :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) - - (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'counsel-yank-pop - :desc "From snippet" :nv "s" #'yas-insert-snippet) - - (:desc "notes" :prefix "n" - :desc "Find file in notes" :n "n" #'+default/find-in-notes - :desc "Browse notes" :n "N" #'+default/browse-notes - :desc "Org capture" :n "x" #'+org-capture/open - :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode - :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) - - (:desc "open" :prefix "o" - :desc "Default browser" :n "b" #'browse-url-of-file - :desc "Debugger" :n "d" #'+debug/open - :desc "REPL" :n "r" #'+eval/open-repl - :v "r" #'+eval:repl - :desc "Neotree" :n "n" #'+neotree/toggle - :desc "Terminal" :n "t" #'+term/open-popup - :desc "Terminal in project" :n "T" #'+term/open-popup-in-project - - ;; applications - :desc "APP: elfeed" :n "E" #'=rss - :desc "APP: email" :n "M" #'=email - :desc "APP: twitter" :n "T" #'=twitter - :desc "APP: regex" :n "X" #'=regex - - ;; macos - (:when IS-MAC - :desc "Reveal in Finder" :n "o" #'+macos/reveal-in-finder - :desc "Reveal project in Finder" :n "O" #'+macos/reveal-project-in-finder - :desc "Send to Transmit" :n "u" #'+macos/send-to-transmit - :desc "Send project to Transmit" :n "U" #'+macos/send-project-to-transmit - :desc "Send to Launchbar" :n "l" #'+macos/send-to-launchbar - :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar)) - - (:desc "project" :prefix "p" - :desc "Browse project" :n "." #'+default/browse-project - :desc "Find file in project" :n "/" #'projectile-find-file - :desc "Run cmd in project root" :nv "!" #'projectile-run-shell-command-in-root - :desc "Switch project" :n "p" #'projectile-switch-project - :desc "Recent project files" :n "r" #'projectile-recentf - :desc "List project tasks" :n "t" #'+ivy/tasks - :desc "Pop term in project" :n "o" #'+term/open-popup-in-project - :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) - - (:desc "quit" :prefix "q" - :desc "Quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) - - (:desc "remote" :prefix "r" - :desc "Upload local" :n "u" #'+upload/local - :desc "Upload local (force)" :n "U" (λ! (+upload/local t)) - :desc "Download remote" :n "d" #'+upload/remote-download - :desc "Diff local & remote" :n "D" #'+upload/diff - :desc "Browse remote files" :n "." #'+upload/browse - :desc "Detect remote changes" :n ">" #'+upload/check-remote) - - (:desc "snippets" :prefix "s" - :desc "New snippet" :n "n" #'yas-new-snippet - :desc "Insert snippet" :nv "i" #'yas-insert-snippet - :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file - :desc "Find snippet" :n "S" #'+default/find-in-snippets) - - (:desc "toggle" :prefix "t" - :desc "Flyspell" :n "s" #'flyspell-mode - :desc "Flycheck" :n "f" #'flycheck-mode - :desc "Line numbers" :n "l" #'doom/toggle-line-numbers - :desc "Fullscreen" :n "f" #'doom/toggle-fullscreen - :desc "Indent guides" :n "i" #'highlight-indentation-mode - :desc "Indent guides (column)" :n "I" #'highlight-indentation-current-column-mode - :desc "Impatient mode" :n "h" #'+impatient-mode/toggle - :desc "Big mode" :n "b" #'doom-big-font-mode - :desc "Evil goggles" :n "g" #'+evil-goggles/toggle)) - - - ;; --- Personal vim-esque bindings ------------------ - :n "zx" #'doom/kill-this-buffer - :n "ZX" #'bury-buffer - :n "]b" #'doom/next-buffer - :n "[b" #'doom/previous-buffer - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left - :m "gt" #'+workspace/switch-right - :m "gT" #'+workspace/switch-left - :m "gd" #'+jump/definition - :m "gD" #'+jump/references - :m "gh" #'+jump/documentation - :n "gp" #'+evil/reselect-paste - :n "gr" #'+eval:region - :n "gR" #'+eval/buffer - :v "gR" #'+eval:replace-region - :v "@" #'+evil:macro-on-all-lines - :n "g@" #'+evil:macro-on-all-lines - ;; repeat in visual mode (FIXME buggy) - :v "." #'evil-repeat - ;; don't leave visual mode after shifting - :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv - ;; paste from recent yank register (which isn't overwritten) - :v "C-p" "\"0p" - - (:map evil-window-map ; prefix "C-w" - ;; Navigation - "C-h" #'evil-window-left - "C-j" #'evil-window-down - "C-k" #'evil-window-up - "C-l" #'evil-window-right - "C-w" #'ace-window - ;; Swapping windows - "H" #'+evil/window-move-left - "J" #'+evil/window-move-down - "K" #'+evil/window-move-up - "L" #'+evil/window-move-right - "C-S-w" #'ace-swap-window - ;; Window undo/redo - "u" #'winner-undo - "C-u" #'winner-undo - "C-r" #'winner-redo - "o" #'doom/window-enlargen - ;; Delete window - "c" #'+workspace/close-window-or-workspace - "C-C" #'ace-delete-window) - - - ;; --- Plugin bindings ------------------------------ - ;; auto-yasnippet - :i [C-tab] #'aya-expand - :nv [C-tab] #'aya-create - - ;; company-mode (vim-like omnicompletion) - :i "C-SPC" #'+company/complete - (:prefix "C-x" - :i "C-l" #'+company/whole-lines - :i "C-k" #'+company/dict-or-keywords - :i "C-f" #'company-files - :i "C-]" #'company-etags - :i "s" #'company-ispell - :i "C-s" #'company-yasnippet - :i "C-o" #'company-capf - :i "C-n" #'company-dabbrev-code - :i "C-p" #'+company/dabbrev-code-previous) - (:after company - (:map company-active-map - ;; Don't interfere with `evil-delete-backward-word' in insert mode - "C-w" nil - "C-o" #'company-search-kill-others - "C-n" #'company-select-next - "C-p" #'company-select-previous - "C-h" #'company-quickhelp-manual-begin - "C-S-h" #'company-show-doc-buffer - "C-S-s" #'company-search-candidates - "C-s" #'company-filter-candidates - "C-SPC" #'company-complete-common - "C-h" #'company-quickhelp-manual-begin - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous - [escape] (λ! (company-abort) (evil-normal-state 1))) - ;; Automatically applies to `company-filter-map' - (:map company-search-map - "C-n" #'company-search-repeat-forward - "C-p" #'company-search-repeat-backward - "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort)) - - ;; counsel - (:after counsel - (:map counsel-ag-map - [backtab] #'+ivy/wgrep-occur ; search/replace on results - "C-SPC" #'ivy-call-and-recenter ; preview - "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) - - ;; evil-commentary - :n "gc" #'evil-commentary - - ;; evil-exchange - :n "gx" #'evil-exchange - - ;; evil-matchit - :nv [tab] #'+evil/matchit-or-toggle-fold - - ;; evil-magit - (:after evil-magit - :map (magit-status-mode-map magit-revision-mode-map) - :n "C-j" nil - :n "C-k" nil) - - ;; evil-mc - (:prefix "gz" - :nv "m" #'evil-mc-make-all-cursors - :nv "u" #'evil-mc-undo-all-cursors - :nv "z" #'+evil/mc-make-cursor-here - :nv "t" #'+evil/mc-toggle-cursors - :nv "n" #'evil-mc-make-and-goto-next-cursor - :nv "p" #'evil-mc-make-and-goto-prev-cursor - :nv "N" #'evil-mc-make-and-goto-last-cursor - :nv "P" #'evil-mc-make-and-goto-first-cursor - :nv "d" #'evil-mc-make-and-goto-next-match - :nv "D" #'evil-mc-make-and-goto-prev-match) - (:after evil-mc - :map evil-mc-key-map - :nv "C-n" #'evil-mc-make-and-goto-next-cursor - :nv "C-N" #'evil-mc-make-and-goto-last-cursor - :nv "C-p" #'evil-mc-make-and-goto-prev-cursor - :nv "C-P" #'evil-mc-make-and-goto-first-cursor) - - ;; evil-multiedit - :v "R" #'evil-multiedit-match-all - :n "M-d" #'evil-multiedit-match-symbol-and-next - :n "M-D" #'evil-multiedit-match-symbol-and-prev - :v "M-d" #'evil-multiedit-match-and-next - :v "M-D" #'evil-multiedit-match-and-prev - :nv "C-M-d" #'evil-multiedit-restore - (:after evil-multiedit - (:map evil-multiedit-state-map - "M-d" #'evil-multiedit-match-and-next - "M-D" #'evil-multiedit-match-and-prev - "RET" #'evil-multiedit-toggle-or-restrict-region) - (:map (evil-multiedit-state-map evil-multiedit-insert-state-map) - "C-n" #'evil-multiedit-next - "C-p" #'evil-multiedit-prev)) - - ;; evil-snipe - (:after evil-snipe - (:after evil-easymotion - ;; Binding to switch to evil-easymotion/avy after a snipe - :map evil-snipe-parent-transient-map - "C-;" (λ! (require 'evil-easymotion) - (call-interactively - (evilem-create #'evil-snipe-repeat - :bind ((evil-snipe-scope 'whole-buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))))))) - - ;; evil-surround - :v "S" #'evil-surround-region - :o "s" #'evil-surround-edit - :o "S" #'evil-Surround-edit - - ;; expand-region - :v "v" #'er/expand-region - :v "V" #'er/contract-region - - ;; flycheck - :m "]e" #'next-error - :m "[e" #'previous-error - (:after flycheck - :map flycheck-error-list-mode-map - :n "C-n" #'flycheck-error-list-next-error - :n "C-p" #'flycheck-error-list-previous-error - :n "j" #'flycheck-error-list-next-error - :n "k" #'flycheck-error-list-previous-error - :n "RET" #'flycheck-error-list-goto-error) - - ;; flyspell - :m "]S" #'flyspell-correct-word-generic - :m "[S" #'flyspell-correct-previous-word-generic - - ;; git-gutter - :m "]d" #'git-gutter:next-hunk - :m "[d" #'git-gutter:previous-hunk - - ;; git-timemachine - (:after git-timemachine - (:map git-timemachine-mode-map - :n "C-p" #'git-timemachine-show-previous-revision - :n "C-n" #'git-timemachine-show-next-revision - :n "[[" #'git-timemachine-show-previous-revision - :n "]]" #'git-timemachine-show-next-revision - :n "q" #'git-timemachine-quit - :n "gb" #'git-timemachine-blame)) - - ;; gist - (:after gist - :map gist-list-menu-mode-map - :n "RET" #'+gist/open-current - :n "b" #'gist-browse-current-url - :n "c" #'gist-add-buffer - :n "d" #'gist-kill-current - :n "f" #'gist-fork - :n "q" #'quit-window - :n "r" #'gist-list-reload - :n "s" #'gist-star - :n "S" #'gist-unstar - :n "y" #'gist-print-current-url) - - ;; helm - (:after helm - (:map helm-map - "ESC" nil - "C-S-n" #'helm-next-source - "C-S-p" #'helm-previous-source - "C-u" #'helm-delete-minibuffer-contents - "C-w" #'backward-kill-word - "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! - "C-b" #'backward-word - [left] #'backward-char - [right] #'forward-char - [escape] #'helm-keyboard-quit - [tab] #'helm-execute-persistent-action) - - (:after helm-files - (:map helm-generic-files-map - :e "ESC" #'helm-keyboard-quit) - (:map helm-find-files-map - "C-w" #'helm-find-files-up-one-level - "TAB" #'helm-execute-persistent-action)) - - (:after helm-ag - (:map helm-ag-map - "" #'helm-ag-edit))) - - ;; hl-todo - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous - - ;; ivy - (:after ivy - :map ivy-minibuffer-map - [escape] #'keyboard-escape-quit - "C-SPC" #'ivy-call-and-recenter - "M-v" #'yank - "M-z" #'undo - "C-r" #'evil-paste-from-register - "C-k" #'ivy-previous-line - "C-j" #'ivy-next-line - "C-l" #'ivy-alt-done - "C-w" #'ivy-backward-kill-word - "C-u" #'ivy-kill-line - "C-b" #'backward-word - "C-f" #'forward-word) - - ;; neotree - (:after neotree - :map neotree-mode-map - :n "g" nil - :n [tab] #'neotree-quick-look - :n "RET" #'neotree-enter - :n [backspace] #'evil-window-prev - :n "c" #'neotree-create-node - :n "r" #'neotree-rename-node - :n "d" #'neotree-delete-node - :n "j" #'neotree-next-line - :n "k" #'neotree-previous-line - :n "n" #'neotree-next-line - :n "p" #'neotree-previous-line - :n "h" #'+neotree/collapse-or-up - :n "l" #'+neotree/expand-or-open - :n "J" #'neotree-select-next-sibling-node - :n "K" #'neotree-select-previous-sibling-node - :n "H" #'neotree-select-up-node - :n "L" #'neotree-select-down-node - :n "G" #'evil-goto-line - :n "gg" #'evil-goto-first-line - :n "v" #'neotree-enter-vertical-split - :n "s" #'neotree-enter-horizontal-split - :n "q" #'neotree-hide - :n "R" #'neotree-refresh) - - ;; realgud - (:after realgud - :map realgud:shortkey-mode-map - :n "j" #'evil-next-line - :n "k" #'evil-previous-line - :n "h" #'evil-backward-char - :n "l" #'evil-forward-char - :m "n" #'realgud:cmd-next - :m "b" #'realgud:cmd-break - :m "B" #'realgud:cmd-clear - :n "c" #'realgud:cmd-continue) - - ;; rotate-text - :n "!" #'rotate-text - - ;; smart-forward - :nv "K" #'smart-up - :m "g]" #'smart-forward - :m "g[" #'smart-backward - - ;; undo-tree -- undo/redo for visual regions - :v "C-u" #'undo-tree-undo - :v "C-r" #'undo-tree-redo - - ;; yasnippet - (:after yasnippet - (:map yas-keymap - "C-e" #'+snippets/goto-end-of-field - "C-a" #'+snippets/goto-start-of-field - "" #'+snippets/goto-end-of-field - "" #'+snippets/goto-start-of-field - "" #'+snippets/delete-to-start-of-field - [escape] #'evil-normal-state - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) - (:map yas-minor-mode-map - :i "" yas-maybe-expand - :v "" #'+snippets/expand-on-region)) - - - ;; --- Major mode bindings -------------------------- - (:after markdown-mode - (:map markdown-mode-map - ;; fix conflicts with private bindings - "" nil - "" nil - "" nil)) - - - ;; --- Custom evil text-objects --------------------- - :textobj "a" #'evil-inner-arg #'evil-outer-arg - :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block - :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent - :textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up - :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down - - - ;; --- Built-in plugins ----------------------------- - (:after comint - ;; TAB auto-completion in term buffers - :map comint-mode-map [tab] #'company-complete) - - (:after debug - ;; For elisp debugging - :map debugger-mode-map - :n "RET" #'debug-help-follow - :n "e" #'debugger-eval-expression - :n "n" #'debugger-step-through - :n "c" #'debugger-continue) - - (:map help-mode-map - :n "[[" #'help-go-back - :n "]]" #'help-go-forward - :n "o" #'ace-link-help - :n "q" #'quit-window - :n "Q" #'+ivy-quit-and-resume) - - (:after vc-annotate - :map vc-annotate-mode-map - :n "q" #'kill-this-buffer - :n "d" #'vc-annotate-show-diff-revision-at-line - :n "D" #'vc-annotate-show-changeset-diff-revision-at-line - :n "SPC" #'vc-annotate-show-log-revision-at-line - :n "]]" #'vc-annotate-next-revision - :n "[[" #'vc-annotate-prev-revision - :n "TAB" #'vc-annotate-toggle-annotation-visibility - :n "RET" #'vc-annotate-find-revision-at-line)) - - -;; -;; Custom functionality -;; - -;; Fix ;/, as repeat-keys in evil-mode, without overriding ;/, bindings -(defmacro do-repeat! (command next-func prev-func) - "Repeat motions with ;/," - (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) - `(progn - (defun ,fn-sym (&rest _) - (define-key evil-motion-state-map (kbd ";") ',next-func) - (define-key evil-motion-state-map (kbd ",") ',prev-func)) - (advice-add #',command :before #',fn-sym)))) - -;; n/N -(do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) -(do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) - -;; f/F/t/T/s/S -(after! evil-snipe - (setq evil-snipe-repeat-keys nil - evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; - - (do-repeat! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) - (do-repeat! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) - -;; */# -(after! evil-visualstar - (do-repeat! evil-visualstar/begin-search-forward - evil-ex-search-next evil-ex-search-previous) - (do-repeat! evil-visualstar/begin-search-backward - evil-ex-search-previous evil-ex-search-next)) - -(after! evil-easymotion - (let ((prefix (concat doom-leader-key " /"))) - ;; NOTE `evilem-default-keybinds' unsets all other keys on the prefix (in - ;; motion state) - (evilem-default-keybindings prefix) - (evilem-define (kbd (concat prefix " n")) #'evil-ex-search-next) - (evilem-define (kbd (concat prefix " N")) #'evil-ex-search-previous) - (evilem-define (kbd (concat prefix " s")) #'evil-snipe-repeat - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - (evilem-define (kbd (concat prefix " S")) #'evil-snipe-repeat-reverse - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))))) - - -;; -;; Keybinding fixes -;; - -;; This section is dedicated to "fixing" certain keys so that they behave -;; properly, more like vim, or how I like it. - -(map! (:map input-decode-map - [S-iso-lefttab] [backtab] - (:unless window-system "TAB" [tab])) ; Fix TAB in terminal - - ;; I want C-a and C-e to be a little smarter. C-a will jump to - ;; indentation. Pressing it again will send you to the true bol. Same goes - ;; for C-e, except it will ignore comments and trailing whitespace before - ;; jumping to eol. - :i "C-a" #'doom/backward-to-bol-or-indent - :i "C-e" #'doom/forward-to-last-non-comment-or-eol - :i "C-u" #'doom/backward-kill-to-bol-and-indent - - ;; textmate-esque newline insertion - :i [M-return] #'evil-open-below - :i [S-M-return] #'evil-open-above - ;; textmate-esque deletion - [M-backspace] #'doom/backward-kill-to-bol-and-indent - :i [backspace] #'delete-backward-char - :i [M-backspace] #'doom/backward-kill-to-bol-and-indent - ;; Emacsien motions for insert mode - :i "C-b" #'backward-word - :i "C-f" #'forward-word - - ;; Highjacks space/backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented blocks intelligently - ;; c) do none of this when inside a string - :i "SPC" #'doom/inflate-space-maybe - :i [remap delete-backward-char] #'doom/deflate-space-maybe - :i [remap newline] #'doom/newline-and-indent - - (:after org - (:map org-mode-map - :i [remap doom/inflate-space-maybe] #'org-self-insert-command - :i "C-e" #'org-end-of-line - :i "C-a" #'org-beginning-of-line)) - - ;; Restore common editing keys (and ESC) in minibuffer - (:map (minibuffer-local-map - minibuffer-local-ns-map - minibuffer-local-completion-map - minibuffer-local-must-match-map - minibuffer-local-isearch-map - evil-ex-completion-map - evil-ex-search-keymap - read-expression-map) - [escape] #'abort-recursive-edit - "C-r" #'evil-paste-from-register - "C-a" #'move-beginning-of-line - "C-w" #'doom/minibuffer-kill-word - "C-u" #'doom/minibuffer-kill-line - "C-b" #'backward-word - "C-f" #'forward-word - "M-z" #'doom/minibuffer-undo) - - (:map messages-buffer-mode-map - "M-;" #'eval-expression - "A-;" #'eval-expression) - - (:map tabulated-list-mode-map - [remap evil-record-macro] #'doom/popup-close-maybe) - - (:after view - (:map view-mode-map "" #'View-quit-all))) + (load! +evil-commands) + + ;; Makes ; and , the universal repeat-keys in evil-mode + (defmacro do-repeat! (command next-func prev-func) + "Repeat motions with ;/," + (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) + `(progn + (defun ,fn-sym (&rest _) + (define-key evil-motion-state-map (kbd ";") ',next-func) + (define-key evil-motion-state-map (kbd ",") ',prev-func)) + (advice-add #',command :before #',fn-sym)))) + + ;; n/N + (do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) + + ;; f/F/t/T/s/S + (after! evil-snipe + (setq evil-snipe-repeat-keys nil + evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; + + (do-repeat! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) + + ;; */# + (after! evil-visualstar + (do-repeat! evil-visualstar/begin-search-forward + evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-visualstar/begin-search-backward + evil-ex-search-previous evil-ex-search-next)) + + (after! evil-easymotion + (let ((prefix (concat doom-leader-key " /"))) + ;; NOTE `evilem-default-keybinds' unsets all other keys on the prefix (in + ;; motion state) + (evilem-default-keybindings prefix) + (evilem-define (kbd (concat prefix " n")) #'evil-ex-search-next) + (evilem-define (kbd (concat prefix " N")) #'evil-ex-search-previous) + (evilem-define (kbd (concat prefix " s")) #'evil-snipe-repeat + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + (evilem-define (kbd (concat prefix " S")) #'evil-snipe-repeat-reverse + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight)))))) From 61df57b86a7754bc1058d1a2fd29cb0a0dd52446 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 00:58:58 -0500 Subject: [PATCH 107/145] Refactor core/autoload/buffers.el --- core/autoload/buffers.el | 120 ++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index e8b7b397e..33cc2064a 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -6,6 +6,7 @@ (defvar doom-real-buffer-functions '() "A list of functions that are run to determine if a buffer is real.") +;;;###autoload (defvar-local doom-real-buffer-p nil "If non-nil, this buffer should be considered real no matter what.") @@ -25,8 +26,6 @@ it if it doesn't exist).") scratch buffer." (get-buffer-create doom-fallback-buffer)) - -;; Buffer Life and Death ;;;;;;;;;;;;;;; ;;;###autoload (defalias 'doom-buffer-list #'buffer-list) @@ -49,6 +48,28 @@ If no project is active, return all buffers." if (doom-real-buffer-p buf) collect buf)) +;;;###autoload +(defun doom-real-buffer-p (&optional buffer-or-name) + "Returns t if BUFFER-OR-NAME is a 'real' buffer. The complete criteria for a +real buffer is: + + 1. The buffer-local value of `doom-real-buffer-p' (variable) is non-nil OR + 2. Any function in `doom-real-buffer-functions' must return non-nil when + passed this buffer OR + 3. The current buffer: + a) has a `buffer-file-name' defined AND + b) is not in a popup window (see `doom-popup-p') AND + c) is not a special buffer (its name isn't something like *Help*) + +If BUFFER-OR-NAME is omitted or nil, the current buffer is tested." + (when-let* ((buf (ignore-errors (window-normalize-buffer buffer-or-name)))) + (or (buffer-local-value 'doom-real-buffer-p buf) + (run-hook-with-args-until-success 'doom-real-buffer-functions buf) + (not (or (doom-popup-p buf) + (minibufferp buf) + (string-match-p "^\\s-*\\*" (buffer-name buf)) + (not (buffer-file-name buf))))))) + ;;;###autoload (defun doom-buffers-in-mode (modes &optional buffer-list derived-p) "Return a list of buffers whose `major-mode' is `eq' to MODE(S). @@ -116,54 +137,26 @@ buffers. If there's nothing left, switch to `doom-fallback-buffer'. See (current-buffer))) ;;;###autoload -(defun doom-real-buffer-p (&optional buffer-or-name) - "Returns t if BUFFER-OR-NAME is a 'real' buffer. The complete criteria for a -real buffer is: - - 1. The buffer-local value of `doom-real-buffer-p' (variable) is non-nil OR - 2. Any function in `doom-real-buffer-functions' must return non-nil when - passed this buffer OR - 3. The current buffer: - a) has a `buffer-file-name' defined AND - b) is not in a popup window (see `doom-popup-p') AND - c) is not a special buffer (its name isn't something like *Help*) - -If BUFFER-OR-NAME is omitted or nil, the current buffer is tested." - (when-let* ((buf (ignore-errors (window-normalize-buffer buffer-or-name)))) - (or (buffer-local-value 'doom-real-buffer-p buf) - (run-hook-with-args-until-success 'doom-real-buffer-functions buf) - (not (or (doom-popup-p buf) - (minibufferp buf) - (string-match-p "^\\s-*\\*" (buffer-name buf)) - (not (buffer-file-name buf))))))) - -;;;###autoload -(defun doom/next-buffer () - "Switch to the next real buffer, skipping non-real buffers. See -`doom-real-buffer-p' for what 'real' means." - (interactive) - (doom--cycle-real-buffers +1)) - -;;;###autoload -(defun doom/previous-buffer () - "Switch to the previous real buffer, skipping non-real buffers. See -`doom-real-buffer-p' for what 'real' means." - (interactive) - (doom--cycle-real-buffers -1)) +(defun doom-set-buffer-real (buffer flag) + "Forcibly mark BUFFER as FLAG (non-nil = real)." + (with-current-buffer buffer + (setq doom-real-buffer-p flag))) ;;;###autoload (defun doom-kill-buffer (&optional buffer dont-save) - "Kill BUFFER (falls back to current buffer if omitted) then switch to a real -buffer. If the buffer is present in another window, only bury it. + "Kill BUFFER (defaults to current buffer), but make sure we land on a real +buffer. Bury the buffer if the buffer is present in another window. Will prompt to save unsaved buffers when attempting to kill them, unless DONT-SAVE is non-nil. See `doom-real-buffer-p' for what 'real' means." - (setq buffer (or buffer (current-buffer))) - (when (and (bufferp buffer) (buffer-live-p buffer)) + (unless buffer + (setq buffer (current-buffer))) + (when (and (bufferp buffer) + (buffer-live-p buffer)) (let ((buffer-win (get-buffer-window buffer))) - ;; deal with unsaved buffers + ;; deal with modified buffers (when (and (buffer-file-name buffer) (buffer-modified-p buffer)) (with-current-buffer buffer @@ -171,19 +164,17 @@ See `doom-real-buffer-p' for what 'real' means." (yes-or-no-p "Buffer is unsaved, save it?")) (save-buffer) (set-buffer-modified-p nil)))) - (if buffer-win - ;; deal with dedicated windows - (if (window-dedicated-p buffer-win) - (unless (window--delete buffer-win t t) - (split-window buffer-win) - (window--delete buffer-win t t)) - ;; cycle to a real buffer - (with-selected-window buffer-win - (doom--cycle-real-buffers -1) - (when buffer-win - (unrecord-window-buffer buffer-win buffer)) - (kill-buffer buffer))) - (kill-buffer buffer))) + ;; kill the buffer (or close dedicated window) + (cond ((not buffer-win) + (kill-buffer buffer)) + ((window-dedicated-p buffer-win) + (unless (window--delete buffer-win t t) + (split-window buffer-win) + (window--delete buffer-win t t))) + (t ; cycle to a real buffer + (with-selected-window buffer-win + (doom--cycle-real-buffers -1) + (kill-buffer buffer))))) (not (eq (current-buffer) buffer)))) ;;;###autoload @@ -219,6 +210,11 @@ regex PATTERN. Returns the number of killed buffers." (dolist (buf buffers (length buffers)) (doom-kill-buffer buf t)))) + +;; +;; Interactive commands +;; + ;;;###autoload (defun doom/kill-this-buffer (&optional interactive-p) "Use `doom-kill-buffer' on the current buffer." @@ -297,7 +293,15 @@ project." (message "Cleaned up %s buffers" n)))) ;;;###autoload -(defun doom-set-buffer-real (buffer flag) - "Forcibly mark BUFFER as FLAG (non-nil = real)." - (with-current-buffer buffer - (setq doom-real-buffer-p flag))) +(defun doom/next-buffer () + "Switch to the next real buffer, skipping non-real buffers. See +`doom-real-buffer-p' for what 'real' means." + (interactive) + (doom--cycle-real-buffers +1)) + +;;;###autoload +(defun doom/previous-buffer () + "Switch to the previous real buffer, skipping non-real buffers. See +`doom-real-buffer-p' for what 'real' means." + (interactive) + (doom--cycle-real-buffers -1)) From 707b69540ddf15e845b7e69af76d5c06041e0ab3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 00:59:44 -0500 Subject: [PATCH 108/145] doom/cleanup-buffers => doom/cleanup-session --- core/autoload/buffers.el | 44 ++++++++++--------- core/test/autoload-buffers.el | 2 +- .../feature/workspaces/autoload/workspaces.el | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 33cc2064a..67016cb2d 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -185,23 +185,6 @@ See `doom-real-buffer-p' for what 'real' means." (delete-window window))) (kill-buffer buffer)) -;;;###autoload -(defun doom-kill-process-buffers () - "Kill all processes that have no visible associated buffers. Return number of -processes killed." - (interactive) - (let ((n 0)) - (dolist (p (process-list)) - (let ((process-buffer (process-buffer p))) - (when (and (process-live-p p) - (not (string= (process-name p) "server")) - (or (not process-buffer) - (and (bufferp process-buffer) - (not (buffer-live-p process-buffer))))) - (delete-process p) - (cl-incf n)))) - n)) - ;;;###autoload (defun doom-kill-matching-buffers (pattern &optional buffer-list) "Kill all buffers (in current workspace OR in BUFFER-LIST) that match the @@ -281,17 +264,36 @@ project." (message "Killed %s buffers" n)))) ;;;###autoload -(defun doom/cleanup-buffers (&optional all-p) - "Clean up buried and inactive process buffers in the current workspace." +(defun doom/cleanup-session (&optional all-p) + "Clean up buried buries and orphaned processes in the current workspace. If +ALL-P (universal argument), clean them up globally." (interactive "P") (run-hooks 'doom-cleanup-hook) (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) - (n 0)) + (n 0) + kill-buffer-query-functions) (mapc #'kill-buffer buffers) - (setq n (+ n (length buffers) (doom-kill-process-buffers))) + (setq n (+ n (length buffers) (doom/cleanup-processes))) (when (called-interactively-p 'interactive) (message "Cleaned up %s buffers" n)))) +;;;###autoload +(defun doom/cleanup-processes () + "Kill all processes that have no visible associated buffers. Return number of +processes killed." + (interactive) + (let ((n 0)) + (dolist (p (process-list)) + (let ((process-buffer (process-buffer p))) + (when (and (process-live-p p) + (not (string= (process-name p) "server")) + (or (not process-buffer) + (and (bufferp process-buffer) + (not (buffer-live-p process-buffer))))) + (delete-process p) + (cl-incf n)))) + n)) + ;;;###autoload (defun doom/next-buffer () "Switch to the next real buffer, skipping non-real buffers. See diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index abf5c4245..deefe679f 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -131,4 +131,4 @@ ;; TODO doom/kill-all-buffers ;; TODO doom/kill-other-buffers ;; TODO doom/kill-matching-buffers -;; TODO doom/cleanup-buffers +;; TODO doom/cleanup-session diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8566cd860..7aff9382c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -310,7 +310,7 @@ workspace to delete." (doom/kill-all-buffers) (let ((fallback-buf (doom-fallback-buffer))) (switch-to-buffer fallback-buf) - (doom/cleanup-buffers))) + (doom/cleanup-session))) ;;;###autoload (defun +workspace/kill-session-and-quit () From b6eec664bbbde795bfabb5621e5a2c766fc2b6b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:18:41 -0500 Subject: [PATCH 109/145] Fix new workspace when switching projects #314 --- modules/completion/ivy/config.el | 1 - modules/feature/workspaces/config.el | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index bca99444e..fa707c5ea 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -51,7 +51,6 @@ immediately runs it on the current candidate (ending the ivy session)." [remap recentf-open-files] #'counsel-recentf [remap imenu] #'counsel-imenu [remap bookmark-jump] #'counsel-bookmark - [remap projectile-switch-project] #'counsel-projectile-switch-project [remap projectile-find-file] #'counsel-projectile-find-file [remap imenu-anywhere] #'ivy-imenu-anywhere [remap execute-extended-command] #'counsel-M-x diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index bd71d9a45..f03fb236f 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -47,10 +47,22 @@ renamed.") ;; per-frame and per-project workspaces (setq persp-init-new-frame-behaviour-override nil - persp-interactive-init-frame-behaviour-override #'+workspace-on-new-frame - projectile-switch-project-action #'projectile-find-file) + persp-interactive-init-frame-behaviour-override #'+workspace-on-new-frame) (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace-maybe) - (advice-add #'projectile-switch-project-by-name :around #'+workspaces*switch-project-by-name) + + (defun +workspaces|per-project (&optional root) + "Open a new workspace when switching to another project. + +Ensures the scratch (or dashboard) buffers are CDed into the project's root." + (when persp-mode + (let ((cwd default-directory)) + (+workspace-switch (projectile-project-name) t) + (switch-to-buffer (doom-fallback-buffer)) + (setq default-directory cwd) + (+workspace-message + (format "Switched to '%s' in new workspace" (+workspace-current-name)) + 'success)))) + (setq projectile-switch-project-action #'+workspaces|per-project) ;; only auto-save when real buffers are present (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) From 9632b8c09d4e29de47a862b4ac3cc68c9f36b445 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:19:56 -0500 Subject: [PATCH 110/145] Flip default kill flag in quit-window #309 --- core/autoload/popups.el | 2 +- core/core-popups.el | 2 +- core/core-ui.el | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/autoload/popups.el b/core/autoload/popups.el index f4d2b6cd9..c903a964b 100644 --- a/core/autoload/popups.el +++ b/core/autoload/popups.el @@ -239,7 +239,7 @@ without leaving any trace behind (muahaha)." (if (featurep 'evil) #'evil-force-normal-state #'keyboard-quit)) - (delete-window))) + (quit-restore-window nil 'kill))) ;;;###autoload (defun doom/popup-this-buffer () diff --git a/core/core-popups.el b/core/core-popups.el index 6cabc5152..3219fe7f6 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -180,7 +180,7 @@ recognized by DOOM's popup system. They are: (define-key map [escape] #'doom/popup-close-maybe) (define-key map (kbd "ESC") #'doom/popup-close-maybe) (define-key map [remap quit-window] #'doom/popup-close-maybe) - (define-key map [remap doom/kill-this-buffer] #'delete-window) + (define-key map [remap doom/kill-this-buffer] #'doom/popup-close-maybe) (define-key map [remap split-window-right] #'ignore) (define-key map [remap split-window-below] #'ignore) (define-key map [remap split-window-horizontally] #'ignore) diff --git a/core/core-ui.el b/core/core-ui.el index ada667f29..708e71c4e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -235,6 +235,12 @@ instead)." (get-buffer-window-list nil nil t)))) (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) +;; temporary windows often have q bound to `quit-window', which only buries the +;; contained buffer. I rarely don't want that buffer killed, so... +(defun doom*quit-window (orig-fn &optional kill window) + (funcall orig-fn (not kill) window)) +(advice-add #'quit-window :around #'doom*quit-window) + ;; ;; Plugins From 5813b6e69a66105fd62d9b9d483b9c0106eda51f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:20:05 -0500 Subject: [PATCH 111/145] Autokill help buffers --- core/core-popups.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-popups.el b/core/core-popups.el index 3219fe7f6..d97b1908e 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -122,7 +122,7 @@ recognized by DOOM's popup system. They are: ("*Backtrace*" :size 20 :noselect t) ("*Warnings*" :size 12 :noselect t :autofit t) ("*Messages*" :size 12 :noselect t) - ("*Help*" :size 0.3) + ("*Help*" :size 0.3 :autokill t) ("^\\*.*Shell Command.*\\*$" :regexp t :size 20 :noselect t :autokill t) (apropos-mode :size 0.3 :autokill t :autoclose t) (Buffer-menu-mode :size 20 :autokill t) From 88946a893a743db3ca2b9ad263cd692219139a91 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:25:24 -0500 Subject: [PATCH 112/145] Minor edits + comment out unused popup vars (for later) --- core/autoload/editor.el | 2 +- core/core-popups.el | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index d2fc05c13..b98d53e75 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -2,7 +2,7 @@ ;;;###autoload (defun doom/sudo-find-file (file) - "Open a file as root." + "Open FILE as root." (interactive (list (read-file-name "Open as root: "))) (find-file (if (file-writable-p file) diff --git a/core/core-popups.el b/core/core-popups.el index d97b1908e..afc75c85c 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -87,13 +87,13 @@ recognized by DOOM's popup system. They are: ;; ;; -(defvar doom-popup-parameters - '(:esc :modeline :transient :fit :align :size) - "TODO") +;; (defvar doom-popup-parameters +;; '(:esc :modeline :transient :fit :align :size) +;; "TODO") -(defvar doom-popup-whitelist - '(("^ ?\\*" :size 15 :noselect t :autokill t :autoclose t)) - "TODO") +;; (defvar doom-popup-whitelist +;; '(("^ ?\\*" :size 15 :noselect t :autokill t :autoclose t)) +;; "TODO") (defvar doom-popup-blacklist '("^\\*magit") From ef9fc05839232e5ce54a90c2286890863d962352 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:26:46 -0500 Subject: [PATCH 113/145] Add core-ui tests --- core/test/core-ui.el | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 core/test/core-ui.el diff --git a/core/test/core-ui.el b/core/test/core-ui.el new file mode 100644 index 000000000..ed4389720 --- /dev/null +++ b/core/test/core-ui.el @@ -0,0 +1,46 @@ +;; -*- no-byte-compile: t; -*- +;;; ../core/test/core-ui.el + +(defmacro -with-temp-windows! (&rest body) + (declare (indent defun)) + `(save-window-excursion + (delete-other-windows) + (cl-flet ((split-window (symbol-function #'split-window-horizontally))) + (let ((a (get-buffer-create "a")) + (b (get-buffer-create "b")) + (split-width-threshold 0) + (window-min-width 0)) + ,@body)))) + +;; +(def-test! set-mode-name + (let ((doom-major-mode-names '((text-mode . "abc") + (lisp-mode . (lambda () "xyz")) + (js-mode . t)))) + (with-temp-buffer + (text-mode) + (should (equal mode-name "abc")) + (lisp-mode) + (should (equal mode-name "xyz")) + (should-error (js-mode))))) + +(def-test! protect-visible-buffers + (-with-temp-windows! + (let ((kill-buffer-query-functions '(doom|protect-visible-buffers))) + (switch-to-buffer a) (split-window) + (switch-to-buffer b) (split-window) + (switch-to-buffer a) + (should-not (kill-buffer)) + (select-window (get-buffer-window b)) + (should (kill-buffer))))) + +(def-test! *quit-window + (-with-temp-windows! + (let (kill-buffer-query-functions) + (switch-to-buffer a) (split-window) + (switch-to-buffer b) + (save-window-excursion + (quit-window t) + (should (buffer-live-p b))) + (quit-window) + (should-not (buffer-live-p b))))) From a370b5b1254083d29f8a7e9918c6407a0683eaaf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 01:30:41 -0500 Subject: [PATCH 114/145] Add kill-buffer-query-fns at post-init (fix race condition) --- core/core-popups.el | 12 ++++++------ core/core-ui.el | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-popups.el b/core/core-popups.el index afc75c85c..5ca2fd044 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -144,11 +144,6 @@ recognized by DOOM's popup system. They are: (defun doom-display-buffer-action (buffer alist) (shackle-display-buffer buffer alist (shackle-match buffer))) - (add-hook! doom-post-init - (setq display-buffer-alist - (cons '(doom-display-buffer-condition doom-display-buffer-action) - display-buffer-alist))) - (defun doom|autokill-popups () (or (not (doom-popup-p)) (prog1 (when (and (not doom-popup-inhibit-autokill) @@ -157,7 +152,12 @@ recognized by DOOM's popup system. They are: (when-let* ((process (get-buffer-process (current-buffer)))) (set-process-query-on-exit-flag process nil)) t)))) - (add-hook 'kill-buffer-query-functions #'doom|autokill-popups) + + (add-hook! doom-post-init + (setq display-buffer-alist + (cons '(doom-display-buffer-condition doom-display-buffer-action) + display-buffer-alist)) + (add-hook 'kill-buffer-query-functions #'doom|autokill-popups)) ;; no modeline in popups (add-hook 'doom-popup-mode-hook #'doom|hide-modeline-in-popup) diff --git a/core/core-ui.el b/core/core-ui.el index 708e71c4e..e4728f3c4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -233,7 +233,8 @@ local value, whether or not it's permanent-local. Therefore, we cycle instead)." (not (delq (selected-window) (get-buffer-window-list nil nil t)))) -(add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) +(add-hook! doom-post-init + (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers)) ;; temporary windows often have q bound to `quit-window', which only buries the ;; contained buffer. I rarely don't want that buffer killed, so... From f8f488540525247ddada2292b520ce3279d9cb34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 02:51:58 -0500 Subject: [PATCH 115/145] Don't install org-plus-contrib in Emacs 26+ Emacs 26+ has Org 9.1.4 built in. --- modules/lang/org/packages.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index b04980c74..37f729a8f 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -1,11 +1,12 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/org/packages.el -;; NOTE This is an insecure source, but unavoidable if we want org 9.0+ (which -;; this module requires). orgmode.org offers no secure access to this repo. If -;; this bothers you, comment out this `package!' block and download -;; org-plus-contrib from orgmode.org. -(package! org-plus-contrib :recipe (:fetcher github :repo "emacsmirror/org" :files (:defaults "contrib/lisp/*.el"))) +(when (version< emacs-version "26.1") + ;; We want org 9.1.x, but the org packaged with Emacs 25.x and under is 8.x. + ;; The only secure (and reasonably trustworthy) source for this is via + ;; emacsmirror. Emacs 26+ comes with Org 9.1.4. + (package! org-plus-contrib + :recipe (:fetcher github :repo "emacsmirror/org" :files (:defaults "contrib/lisp/*.el")))) (package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) (package! toc-org) From af8f1048f0321c5ad6b65ff5d66e0064f2df9063 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Dec 2017 14:24:51 -0500 Subject: [PATCH 116/145] Update changelog --- CHANGELOG.org | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.org b/CHANGELOG.org index 1b319e219..cd25ff97b 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -13,8 +13,8 @@ * Unreleased (develop) + *Module changes:* - + Removed =private/hlissner= and added =private/default=, which is serve as a - more generic "starter" module for new users. My private module is now at + + Add =private/default= to replace =private/hlissner=, which is a more generic + "starter" module for new users. My private module is now at [[https://github.com/hlissner/doom-emacs-private][hlissner/doom-emacs-private]]. + =general= + Fix "peculiar error" messages when running =bin/doom-doctor=, caused by @@ -32,19 +32,57 @@ where ~gc-cons-threshold~ would get set to 304mb in the user's active session, causing freezes and stuttering. + Improve error handling when byte compiling Doom. It now cleans up after - itself is something goes wrong. + itself if something goes wrong, with improved error handling overall. + Fix =stringp= error thrown by ~doom-fetch~ in noninteractive sessions. + + =core= Improve GPG integration by setting ~epa-file-encrypt-to~ to + ~user-mail-address~, and ~epa-pinentry-mode~ to ~'loopback~ (so that Emacs + will prompt you for the passphrase in the minibuffer). + + =core-packages= Fix ~doom-module-pairs~ returning pairs in arbitrary order, + causing load order errors. This is because the ~hash-table-values~ function + in Emacs 25 and under uses ~maphash~, which reverses the hash-table, while + newer versions use ~cl-loop~, which doesn't. + =core-ui= Fix cryptic missing-font errors (also, they are warnings now). + + =core-ui= Account for Emacs 26 line numbers when calculating + ~visual-fill-column-width~. + =core-projects= Add ~doom-project-find-file~ and ~doom-project-browse~ for interactively fuzzy-finding and opening files in a directory/project. + =feature= + + =file-templates= Add a file template for fish shell scripts (thanks to + [[https://github.com/amosbird][amosbird]]). + =version-control= When evil-mode is available, start git commit message buffers in insert mode (see [[https://github.com/hlissner/doom-emacs/issues/300][#300]]). + =ui= - + =doom-dashboard= Fix whitespace-mode turning the Doom dashboard into a - Christmas tree (by highlighting trailing whitespace). + + =doom-dashboard= + + Fix ~whitespace-mode~ and ~show-trailing-whitespace~ turning the dashboard + into a Christmas tree. + + Add the ~+doom-dashboard-pwd-policy~ option, giving you control over how + ~default-directory~ is set in the dashboard. By default this is set to + ~'last-project~, meaning the dashboard's cwd will match the project of the + last buffer you killed. ++ =completion= + + =ivy= Fix TAB only half-triggering auto-completion (see [[https://github.com/hlissner/doom-emacs/issues/303][#303]]). + =lang= - + =org= Change repo source for org-plus-contrib to emacsmirror. + + =cc= + + Add =rtags= support for better code navigation. This replaces gxtag and + etag support. Also includes automatic management of the rdm daemon. + + Improved support for JSON compilation databases. Irony-mode (and by + extension its flycheck and company plugins will now pick them up with more + consistency). This ensures all these tools run with the same compile + options as your project. + + New ~+cc/reload-compile-db~ commands forcibly refreshes the compilation db + of your current project, updating irony and running rtags daemon, if any. + + The ~+cc-include-paths~ and ~+cc-compiler-options~ options have been + renamed to ~+cc-default-include-paths~ and ~+cc-default-compiler-options~ + for clarity. + + =org= + + Change repo source for org-plus-contrib to emacsmirror. + + Fix ~+org-dir~ being resolved too soon, robbing the user of the + opportunity to change it in their private module. + + Fix ~invalid file location~ error when capturing to a TODO template. + + Prevent =org-plus-contrib= from being installed on Emacs 26+, as 9.1.4 is + included with it. + + Fix invalid function errors when drag'n'dropping files into org buffers + (see [[https://github.com/hlissner/doom-emacs/issues/307][#307]]). + =java= Fix Doom install meghanada server while byte compiling your Emacs configuration. From c9d5d41aad7251fb612bc8ddc6ea3206030b943d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 00:44:57 -0500 Subject: [PATCH 117/145] lang/org: add baseline readme --- modules/lang/org/README.org | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/modules/lang/org/README.org b/modules/lang/org/README.org index e69de29bb..ecda00c6c 100644 --- a/modules/lang/org/README.org +++ b/modules/lang/org/README.org @@ -0,0 +1,59 @@ +#+TITLE: :lang org + +This module provides support for org-mode. + ++ A custom attachment system that keeps files in a centralized location. ++ Drag-and-drop support for images (with inline preview) and media files (drops + a file icon and a short link). ++ Executable code blocks with support for a variety of languages and tools, + including REST requests, SQL, google translate, plantuml, and matlab. ++ An org-capture workflow that works from outside Emacs (through the + =bin/org-capture= shell script). ++ Exported documents are saved to a centralized location. ++ A configuration for using org-mode for slide-show presentations, or exporting + org files to reveal.js slideshows. ++ (TODO) A static site generator based in org-mode and Emacs. + +#+begin_quote +org-mode is a beast, and Doom's most difficult module to maintain. And its most +important. This module is /highly/ opinionated and experimental; my foray into +learning org is a neverending quest. +#+end_quote + +* Table of Contents :TOC: +- [[#install][Install]] + - [[#macos][MacOS]] + - [[#arch-linux][Arch Linux]] +- [[#configuration][Configuration]] +- [[#usage][Usage]] +- [[#appendix][Appendix]] + +* Install +Org has no hard dependencies, but there are some things you'll need to make use of Org's more esoteric features. + ++ For inline LaTeX previews, you need ~latex~ and ~dvipng~. ++ To run babel code blocks, you need whatever dependencies those languages + need. It is recommended you enable the associated module in =lang/= and ensure + its dependencies are met. ++ The =+crm= module uses a sqlite database to manage your contacts, invoices, + and projects; this needs sqlite installed. + +** MacOS +#+BEGIN_SRC sh +brew cask install mactex +brew install sqlite +#+END_SRC + +** Arch Linux +#+BEGIN_SRC sh +sudo pacman --needed --noconfirm -S texlive-core texlive-bin texlive-science sqlite +#+END_SRC + +* Configuration +(Coming soon) + +* Usage +(Coming soon) + +* Appendix +(Coming soon) From 6d7a6a80b2cca5adfd9e08cbfd247be173b2aa11 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 11:09:36 -0500 Subject: [PATCH 118/145] Fix projectile not tracking directories #308 --- core/core-projects.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-projects.el b/core/core-projects.el index 6409f5b6b..e2ff0f113 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -16,6 +16,8 @@ state are passed in.") (add-hook 'doom-init-hook #'projectile-mode) :config + (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) + ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) From d9175748b76a9d2ba758bc106ce3b8c9fa3c23fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 11:13:55 -0500 Subject: [PATCH 119/145] Remove (interactive) from doom-project-{find-file,browse} These aren't meant to be interactive. --- core/core-projects.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index e2ff0f113..9a70df207 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -80,7 +80,6 @@ they are absolute." (defun doom-project-find-file (dir) "Fuzzy-find a file in DIR." - (interactive) (let ((default-directory dir) ;; Necessary to isolate this search from the current project projectile-project-name @@ -94,7 +93,6 @@ they are absolute." (defun doom-project-browse (dir) "TODO" - (interactive) (let ((default-directory dir)) (call-interactively ;; completion modules may remap this command From 3e41c11138def0b5dc69bb9da8f5cc9504762043 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 11:21:53 -0500 Subject: [PATCH 120/145] Refactor core-projects; fix autoload-project-mode & doom-project-hook + doom-project can now be a symbol or list of project modes. + doom-project-hook hooks are promised to receive the mode symbol and state, but until now only received the former. + Add docstrings to doom-project-{find-file,browse}. + doom|autoload-project-mode is now on find-file-hook instead of after-change-major-mode (which fires it way too many times). --- core/core-projects.el | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 9a70df207..42c0a222a 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,10 +1,7 @@ ;;; core-projects.el -*- lexical-binding: t; -*- -(defvar doom-project-hook nil - "Hook run when a project is enabled. The name of the project's mode and its -state are passed in.") - (def-package! projectile + :hook (doom-init . projectile-mode) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) @@ -14,9 +11,9 @@ state are passed in.") projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o")) - (add-hook 'doom-init-hook #'projectile-mode) :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) + (add-hook 'find-file-hook #'doom|autoload-project-mode) ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) @@ -79,7 +76,7 @@ they are absolute." (doom--resolve-path-forms files (doom-project-root))) (defun doom-project-find-file (dir) - "Fuzzy-find a file in DIR." + "Fuzzy-find a file under DIR." (let ((default-directory dir) ;; Necessary to isolate this search from the current project projectile-project-name @@ -92,7 +89,7 @@ they are absolute." #'projectile-find-file)))) (defun doom-project-browse (dir) - "TODO" + "Traverse a file structure starting linearly from DIR." (let ((default-directory dir)) (call-interactively ;; completion modules may remap this command @@ -105,15 +102,21 @@ they are absolute." ;; (defvar-local doom-project nil - "A list of project mode to enable. Used for .dir-locals.el.") + "Either the symbol or a list of project modes you want to enable. Available +for .dir-locals.el.") + +(defvar doom-project-hook nil + "Hook run when a project is enabled. The name of the project's mode and its +state are passed in.") (defun doom|autoload-project-mode () - "Auto-enable projects listed in `doom-project', which is meant to be set from -.dir-locals.el files." - (cl-loop for mode in doom-project - unless (symbol-value mode) - do (funcall mode))) -(add-hook 'after-change-major-mode-hook #'doom|autoload-project-mode) + "Auto-enable the project(s) listed in `doom-project'." + (when doom-project + (if (symbolp doom-project) + (funcall doom-project) + (cl-loop for mode in doom-project + unless (symbol-value mode) + do (funcall mode))))) (defmacro def-project-mode! (name &rest plist) "Define a project minor-mode named NAME (a symbol) and declare where and how @@ -124,8 +127,7 @@ own settings, keymaps, hooks, snippets, etc. This creates NAME-hook and NAME-map as well. -A project can be enabled through .dir-locals.el too, if `doom-project' is set to -the name (symbol) of the project mode(s) to enable. +A project can be enabled through .dir-locals.el too, by setting `doom-project'. PLIST may contain any of these properties, which are all checked to see if NAME should be activated. If they are *all* true, NAME is activated. @@ -174,7 +176,7 @@ Relevant: `doom-project-hook'." :keymap (make-sparse-keymap) (if (not ,name) ,exit-form - (run-hook-with-args 'doom-project-hook ',name) + (run-hook-with-args 'doom-project-hook ',name ,name) ,(when load-form `(unless ,init-var ,load-form From 5c74814860a0c850d831b09083cf1d9f60a8390b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 11:44:51 -0500 Subject: [PATCH 121/145] Add core-projects tests --- core/test/core-projects.el | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 core/test/core-projects.el diff --git a/core/test/core-projects.el b/core/test/core-projects.el new file mode 100644 index 000000000..fab6c89b8 --- /dev/null +++ b/core/test/core-projects.el @@ -0,0 +1,35 @@ +;; -*- no-byte-compile: t; -*- +;;; ../core/test/core-projects.el + +(projectile-mode +1) + +(def-test! project-p + (let ((default-directory doom-emacs-dir)) + (should (doom-project-p))) + (let ((default-directory (expand-file-name "~"))) + (should-not (doom-project-p)))) + +(def-test! project-root + ;; Should resolve to project root + (let ((default-directory doom-core-dir)) + (should (equal (doom-project-root) doom-emacs-dir))) + ;; Should resolve to `default-directory' if not a project + (let ((default-directory (expand-file-name "~"))) + (should (equal (doom-project-root) default-directory)))) + +(def-test! project-expand + (let ((default-directory doom-core-dir)) + (should (equal (doom-project-expand "init.el") + (expand-file-name "init.el" (doom-project-root)))))) + +(def-test! project-has! + (let ((default-directory doom-core-dir)) + ;; Resolve from project root + (should (doom-project-has! "init.el")) + ;; Chained file checks + (should (doom-project-has! (and "init.el" "LICENSE"))) + (should (doom-project-has! (or "init.el" "does-not-exist"))) + (should (doom-project-has! (and "init.el" (or "LICENSE" "does-not-exist")))) + ;; Should resolve relative paths from `default-directory' + (should (doom-project-has! (and "./core.el" "../init.el"))))) + From 8ad2666f8f9696fbc948810fb4084980c0dbcb44 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 11:45:02 -0500 Subject: [PATCH 122/145] Refactor and fix unit tests, plus isolate them better --- core/autoload/test.el | 32 +++++++++-- core/test/autoload-buffers.el | 35 ++++++------ core/test/autoload-debug.el | 20 +++---- core/test/autoload-package.el | 55 ++++++++----------- core/test/core-lib.el | 15 +++-- core/test/core-projects.el | 12 +++- core/test/core-ui.el | 19 +++---- modules/completion/company/test/company.el | 13 +++-- modules/feature/evil/test/autoload-files.el | 8 +-- modules/feature/evil/test/evil.el | 1 + .../workspaces/test/autoload-workspaces.el | 23 +++++--- modules/lang/org/test/autoload-org.el | 18 +++--- modules/lang/org/test/org.el | 2 + .../password-store/test/autoload-pass.el | 10 ++-- 14 files changed, 146 insertions(+), 117 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index a71f4bed5..20c092798 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -74,17 +74,30 @@ If neither is available, run all tests in all enabled modules." (defmacro def-test! (name &rest body) "Define a namespaced ERT test." (declare (indent defun) (doc-string 2)) - (unless (plist-get body :disabled) - (when (plist-get body :skip) - (push '(ert-skip nil) body)) + (let (plist) + (while (keywordp (car body)) + (push (pop body) plist)) + (setq plist (reverse plist)) + (when (plist-get plist :skip) + (setq body `((ert-skip nil) ,@body))) + (when-let* ((modes (doom-enlist (plist-get plist :minor-mode)))) + (dolist (mode modes) + (setq body `((with-minor-mode! ,mode ,@body))))) + (when-let* ((before (plist-get plist :before))) + (setq body `(,@before ,@body))) + (when-let* ((after (plist-get plist :after))) + (setq body `(,@body @after))) `(ert-deftest ,(cl-loop with path = (file-relative-name (file-name-sans-extension load-file-name) doom-emacs-dir) for (rep . with) in '(("/test/" . "/") ("/" . ":")) do (setq path (replace-regexp-in-string rep with path t t)) - finally return (intern (format "%s::%s" path name))) () - () - ,@body))) + finally return (intern (format "%s::%s" path name))) + () + (with-temp-buffer + (save-mark-and-excursion + (save-window-excursion + ,@body)))))) (defmacro should-buffer! (initial expected &rest body) "Test that a buffer with INITIAL text, run BODY, then test it against EXPECTED. @@ -144,3 +157,10 @@ marker. e.g. {2} can be retrieved with (point! 2)." ((symbolp index) (symbol-name index)) ((stringp index) index)) marker-list))) + +(defmacro with-minor-mode! (mode &rest body) + "TODO" + (declare (indent defun)) + `(progn (,mode +1) + ,@body + (,mode -1))) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index deefe679f..b39c75b3c 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -1,24 +1,23 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/autoload-buffers.el -(defmacro -with-temp-buffers! (buffer-args &rest body) +(defmacro with-temp-buffers!! (buffer-args &rest body) (declare (indent defun)) (let (buffers) (dolist (bsym buffer-args) (push `(,bsym (get-buffer-create ,(symbol-name bsym))) buffers)) - `(save-window-excursion - (cl-flet ((buffer-list - (lambda () - (cl-remove-if-not #'buffer-live-p (list ,@(reverse (mapcar #'car buffers))))))) - (let* (persp-mode - ,@buffers) - ,@body - (mapc #'kill-buffer (buffer-list))))))) + `(cl-flet ((buffer-list + (lambda () + (cl-remove-if-not #'buffer-live-p (list ,@(reverse (mapcar #'car buffers))))))) + (let* (persp-mode + ,@buffers) + ,@body + (mapc #'kill-buffer (buffer-list)))))) ;; (def-test! get-buffers - (-with-temp-buffers! (a b c) + (with-temp-buffers!! (a b c) (should (cl-every #'buffer-live-p (buffer-list))) (should (equal (buffer-list) (list a b c))) (dolist (buf (list (cons a doom-emacs-dir) @@ -26,6 +25,7 @@ (cons c "/tmp/"))) (with-current-buffer (car buf) (setq-local default-directory (cdr buf)))) + (projectile-mode +1) (with-current-buffer a ;; should produce all buffers (let ((buffers (doom-buffer-list))) @@ -37,11 +37,12 @@ ;; If no project is available, just get all buffers (with-current-buffer c (let ((buffers (doom-project-buffer-list))) - (should (cl-every (lambda (x) (memq x buffers)) (list a b c))))))) + (should (cl-every (lambda (x) (memq x buffers)) (list a b c))))) + (projectile-mode -1))) (def-test! real-buffers (let (doom-real-buffer-functions) - (-with-temp-buffers! (a b c d) + (with-temp-buffers!! (a b c d) (dolist (buf (list a b)) (with-current-buffer buf (setq-local buffer-file-name "x"))) @@ -62,7 +63,7 @@ ;; `doom-visible-buffers' ;; `doom-buried-buffers' (def-test! visible-buffers-and-windows - (-with-temp-buffers! (a b c d) + (with-temp-buffers!! (a b c d) (switch-to-buffer a) (should (eq (current-buffer) a)) (should (eq (selected-window) (get-buffer-window a))) @@ -77,7 +78,7 @@ ;; `doom-matching-buffers' (def-test! matching-buffers - (-with-temp-buffers! (a b c) + (with-temp-buffers!! (a b c) (let ((buffers (doom-matching-buffers "^[ac]$"))) (should (= 2 (length buffers))) (should (cl-every #'bufferp buffers)) @@ -86,7 +87,7 @@ ;; `doom-buffers-in-mode' (def-test! buffers-in-mode - (-with-temp-buffers! (a b c d e) + (with-temp-buffers!! (a b c d e) (dolist (buf (list a b)) (with-current-buffer buf (emacs-lisp-mode))) @@ -101,7 +102,7 @@ ;; `doom-kill-buffer' (def-test! kill-buffer - (-with-temp-buffers! (a b) + (with-temp-buffers!! (a b) (doom-kill-buffer a) (should-not (buffer-live-p a)) ;; modified buffer @@ -112,7 +113,7 @@ ;; `doom--cycle-real-buffers' (def-test! kill-buffer-then-show-real-buffer - (-with-temp-buffers! (a b c d) + (with-temp-buffers!! (a b c d) (dolist (buf (list a b d)) (with-current-buffer buf (setq-local buffer-file-name "x"))) diff --git a/core/test/autoload-debug.el b/core/test/autoload-debug.el index 32f1090a7..062a16de5 100644 --- a/core/test/autoload-debug.el +++ b/core/test/autoload-debug.el @@ -2,18 +2,16 @@ ;;; core/test/autoload-debug.el (def-test! what-face - (with-temp-buffer - (insert (propertize "Hello " 'face 'font-lock-keyword-face)) - (insert "world") + (insert (propertize "Hello " 'face 'font-lock-keyword-face)) + (insert "world") - (should (equal (doom/what-face (point-min)) '((font-lock-keyword-face) ()))) - (should-not (doom/what-face (point-max))))) + (should (equal (doom/what-face (point-min)) '((font-lock-keyword-face) ()))) + (should-not (doom/what-face (point-max)))) (def-test! what-face-overlays - (with-temp-buffer - (insert "Hello world") - (let ((ov (make-overlay 1 6))) - (overlay-put ov 'face 'font-lock-keyword-face)) + (insert "Hello world") + (let ((ov (make-overlay 1 6))) + (overlay-put ov 'face 'font-lock-keyword-face)) - (should (equal (doom/what-face (point-min)) '(() (font-lock-keyword-face)))) - (should-not (doom/what-face (point-max))))) + (should (equal (doom/what-face (point-min)) '(() (font-lock-keyword-face)))) + (should-not (doom/what-face (point-max)))) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el index ddd6ef85f..5d074b0b7 100644 --- a/core/test/autoload-package.el +++ b/core/test/autoload-package.el @@ -1,31 +1,21 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/autoload-package.el -(defun -new-package (name version &optional reqs) +(defun -pkg (name version &optional reqs) (package-desc-create :name name :version version :reqs reqs)) -(defmacro -with-temp-packages! (&rest forms) - "Run FORMS in the context of a temporary package setup (as in, it won't -affects your Emacs packages)." - `(let* ((doom-local-dir ,(expand-file-name "test/.local/" doom-emacs-dir)) - (doom-packages-dir (concat doom-local-dir "packages/")) - (doom-etc-dir (concat doom-local-dir "etc/")) - (doom-cache-dir (concat doom-local-dir "cache/")) - (package-user-dir (expand-file-name "elpa" doom-packages-dir)) - (quelpa-dir (expand-file-name "quelpa" doom-packages-dir)) - package-alist - package-archive-contents - package-initialize) - (package-initialize) - ,@forms)) - -(defmacro -with-packages! (packages package-descs &rest body) - `(let ((doom-packages ,packages) +(defmacro with-packages!! (packages package-descs &rest body) +`(let* ((doom-packages-dir ,(expand-file-name "packages/" (file-name-directory load-file-name))) + (package-user-dir ,(expand-file-name "elpa" doom-packages-dir)) + (quelpa-dir ,(expand-file-name "quelpa" doom-packages-dir))) + ;; (make-directory doom-packages-dir t) + (let ((doom-packages ,packages) (package-alist ,package-descs) doom-core-packages) - (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _))) - ((symbol-function 'package-installed-p) (lambda (name &rest _) (assq name package-alist)))) - ,@body))) + (cl-letf (((symbol-function 'doom-initialize-packages) (lambda (&rest _)))) + ,@body)) + ;; (delete-directory doom-packages-dir t) + )) ;; @@ -33,18 +23,19 @@ affects your Emacs packages)." ;; (def-test! backend-detection - (let ((package-alist `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234))))) + (let ((package-alist `((doom-dummy ,(-pkg 'doom-dummy '(20160405 1234))))) (quelpa-cache '((doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist"))) (quelpa-initialized-p t)) (should (eq (doom-package-backend 'doom-dummy) 'elpa)) - (should (eq (doom-package-backend 'doom-quelpa-dummy) 'quelpa)))) + (should (eq (doom-package-backend 'doom-quelpa-dummy) 'quelpa)) + (should (eq (doom-package-backend 'org) 'emacs)))) (def-test! elpa-outdated-detection (let* ((doom--last-refresh (current-time)) (package-alist - `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234))))) + `((doom-dummy ,(-pkg 'doom-dummy '(20160405 1234))))) (package-archive-contents - `((doom-dummy ,(-new-package 'doom-dummy '(20170405 1234)))))) + `((doom-dummy ,(-pkg 'doom-dummy '(20170405 1234)))))) (cl-letf (((symbol-function 'package-refresh-contents) (lambda (&rest _)))) (should (equal (doom-package-outdated-p 'doom-dummy) '(doom-dummy (20160405 1234) (20170405 1234))))))) @@ -53,7 +44,7 @@ affects your Emacs packages)." (def-test! get-packages (let ((quelpa-initialized-p t)) - (-with-packages! + (with-packages!! '((doom-dummy)) '((doom-dummy nil) (doom-dummy-unwanted nil) @@ -63,17 +54,17 @@ affects your Emacs packages)." (def-test! orphaned-packages "Test `doom-get-orphaned-packages', which gets a list of packages that are no longer enabled or depended on." - (-with-packages! + (with-packages!! '((doom-dummy)) - `((doom-dummy ,(-new-package 'doom-dummy '(20160405 1234) '((doom-dummy-dep (1 0))))) - (doom-dummy-unwanted ,(-new-package 'doom-dummy-unwanted '(20160601 1234))) - (doom-dummy-dep ,(-new-package 'doom-dummy-dep '(20160301 1234)))) + `((doom-dummy ,(-pkg 'doom-dummy '(20160405 1234) '((doom-dummy-dep (1 0))))) + (doom-dummy-unwanted ,(-pkg 'doom-dummy-unwanted '(20160601 1234))) + (doom-dummy-dep ,(-pkg 'doom-dummy-dep '(20160301 1234)))) (should (equal (doom-get-orphaned-packages) '(doom-dummy-unwanted))))) (def-test! missing-packages "Test `doom-get-missing-packages, which gets a list of enabled packages that aren't installed." - (-with-packages! + (with-packages!! '((doom-dummy) (doom-dummy-installed)) - `((doom-dummy-installed ,(-new-package 'doom-dummy-installed '(20160405 1234)))) + `((doom-dummy-installed ,(-pkg 'doom-dummy-installed '(20160405 1234)))) (should (equal (doom-get-missing-packages) '((doom-dummy)))))) diff --git a/core/test/core-lib.el b/core/test/core-lib.el index fba4c22e5..30e59a690 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -147,10 +147,13 @@ ;; --- Settings --------------------------- -(def-setting! :-test-setting (x) x) - (def-test! set - (should (assq :-test-setting doom-settings)) - (should (set! :-test-setting t)) - (let ((inhibit-message t)) - (should-not (set! :non-existant-setting (error "This shouldn't trigger"))))) + (eval-and-compile + (let (doom-settings) + (def-setting! :-test-setting (x) `(setq result ,x)) + (should (assq :-test-setting doom-settings)) + (let ((inhibit-message t) + result) + (set! :-test-setting t) + (should result) + (set! :non-existant-setting (error "This shouldn't trigger")))))) diff --git a/core/test/core-projects.el b/core/test/core-projects.el index fab6c89b8..3ebf2bc9b 100644 --- a/core/test/core-projects.el +++ b/core/test/core-projects.el @@ -1,15 +1,20 @@ ;; -*- no-byte-compile: t; -*- ;;; ../core/test/core-projects.el -(projectile-mode +1) +(require 'projectile) +;; +;; `doom-project-p' (def-test! project-p + :minor-mode projectile-mode (let ((default-directory doom-emacs-dir)) (should (doom-project-p))) (let ((default-directory (expand-file-name "~"))) (should-not (doom-project-p)))) +;; `doom-project-p' (def-test! project-root + :minor-mode projectile-mode ;; Should resolve to project root (let ((default-directory doom-core-dir)) (should (equal (doom-project-root) doom-emacs-dir))) @@ -17,12 +22,16 @@ (let ((default-directory (expand-file-name "~"))) (should (equal (doom-project-root) default-directory)))) +;; `doom-project-expand' (def-test! project-expand + :minor-mode projectile-mode (let ((default-directory doom-core-dir)) (should (equal (doom-project-expand "init.el") (expand-file-name "init.el" (doom-project-root)))))) +;; `doom-project-has!' (def-test! project-has! + :minor-mode projectile-mode (let ((default-directory doom-core-dir)) ;; Resolve from project root (should (doom-project-has! "init.el")) @@ -32,4 +41,3 @@ (should (doom-project-has! (and "init.el" (or "LICENSE" "does-not-exist")))) ;; Should resolve relative paths from `default-directory' (should (doom-project-has! (and "./core.el" "../init.el"))))) - diff --git a/core/test/core-ui.el b/core/test/core-ui.el index ed4389720..c1c82a01d 100644 --- a/core/test/core-ui.el +++ b/core/test/core-ui.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; ../core/test/core-ui.el -(defmacro -with-temp-windows! (&rest body) +(defmacro with-temp-windows!! (&rest body) (declare (indent defun)) - `(save-window-excursion + `(progn (delete-other-windows) (cl-flet ((split-window (symbol-function #'split-window-horizontally))) (let ((a (get-buffer-create "a")) @@ -17,15 +17,14 @@ (let ((doom-major-mode-names '((text-mode . "abc") (lisp-mode . (lambda () "xyz")) (js-mode . t)))) - (with-temp-buffer - (text-mode) - (should (equal mode-name "abc")) - (lisp-mode) - (should (equal mode-name "xyz")) - (should-error (js-mode))))) + (text-mode) + (should (equal mode-name "abc")) + (lisp-mode) + (should (equal mode-name "xyz")) + (should-error (js-mode)))) (def-test! protect-visible-buffers - (-with-temp-windows! + (with-temp-windows!! (let ((kill-buffer-query-functions '(doom|protect-visible-buffers))) (switch-to-buffer a) (split-window) (switch-to-buffer b) (split-window) @@ -35,7 +34,7 @@ (should (kill-buffer))))) (def-test! *quit-window - (-with-temp-windows! + (with-temp-windows!! (let (kill-buffer-query-functions) (switch-to-buffer a) (split-window) (switch-to-buffer b) diff --git a/modules/completion/company/test/company.el b/modules/completion/company/test/company.el index d8969d398..4f7244c14 100644 --- a/modules/completion/company/test/company.el +++ b/modules/completion/company/test/company.el @@ -4,20 +4,21 @@ (require! :completion company) (require 'company) +;; (def-test! set-company-backend - (let ((default-backends (default-value 'company-backends))) + :minor-mode company-mode + (let ((company-backends '(default))) (set! :company-backend 'emacs-lisp-mode '(backend-1)) (set! :company-backend 'lisp-interaction-mode 'backend-1 'backend-2) (set! :company-backend 'text-mode 'backend-1) (with-temp-buffer (emacs-lisp-mode) - (should (equal (car company-backends) '(backend-1)))) + (should (equal company-backends '((backend-1) default)))) (with-temp-buffer (lisp-interaction-mode) - (should (equal company-backends - (append '(backend-1 backend-2) default-backends)))) + (should (equal company-backends '(backend-1 backend-2 default)))) (with-temp-buffer (text-mode) - (should (eq (car company-backends) 'backend-1))) + (should (equal company-backends '(backend-1 default)))) ;; global backends shouldn't be affected - (should (equal company-backends default-backends)))) + (should (equal company-backends '(default))))) diff --git a/modules/feature/evil/test/autoload-files.el b/modules/feature/evil/test/autoload-files.el index 762e39fbe..b14185cd1 100644 --- a/modules/feature/evil/test/autoload-files.el +++ b/modules/feature/evil/test/autoload-files.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/evil/test/autoload-files.el -(defmacro -with-temp-files! (src dest &rest body) +(defmacro with-temp-files!! (src dest &rest body) "Run FORMS in the context of a temporary package setup (as in, it won't affects your Emacs packages)." (declare (indent 2) (doc-string 3)) @@ -23,7 +23,7 @@ affects your Emacs packages)." ;; (def-test! move-this-file ":mv" - (-with-temp-files! "/tmp/doom-buffer" "/tmp/doom-buffer-new" + (with-temp-files!! "/tmp/doom-buffer" "/tmp/doom-buffer-new" (should-error (+evil:move-this-file it)) (should (+evil:move-this-file other t)) (should (file-exists-p other)) @@ -31,7 +31,7 @@ affects your Emacs packages)." (def-test! copy-this-file ":cp" - (-with-temp-files! "/tmp/doom-buffer-2" "/tmp/doom-buffer-2-new" + (with-temp-files!! "/tmp/doom-buffer-2" "/tmp/doom-buffer-2-new" (should-error (+evil:copy-this-file it)) (should (+evil:copy-this-file other t)) (should (file-exists-p other)) @@ -39,7 +39,7 @@ affects your Emacs packages)." (def-test! delete-this-file ":rm" - (-with-temp-files! "/tmp/doom-buffer-3" nil + (with-temp-files!! "/tmp/doom-buffer-3" nil (should-error (+evil:delete-this-file "this-file-does-not-exist")) (should (+evil:delete-this-file nil t)) (should (not (file-exists-p it))))) diff --git a/modules/feature/evil/test/evil.el b/modules/feature/evil/test/evil.el index 7fd0626a3..ffe6f92a1 100644 --- a/modules/feature/evil/test/evil.el +++ b/modules/feature/evil/test/evil.el @@ -3,6 +3,7 @@ (require! :feature evil) +;; ;; `evil-ex-replace-special-filenames' ;; NOTE The majority of this function is tested in core/test/core-lib.el, this ;; only tests the evil-mode-specific functionality. diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index 3f1637aa2..ff69bfb67 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -3,7 +3,7 @@ (require! :feature workspaces) -(defmacro -with-workspace! (buffer-args &rest body) +(defmacro with-workspace!! (buffer-args &rest body) (declare (indent defun)) (let ((buffers (cl-loop for bsym in buffer-args @@ -27,14 +27,19 @@ ;; (def-test! init - (-with-workspace! () + (with-workspace!! () (should (equal (+workspace-current-name) +workspaces-main)))) -(def-test! advice - (should (advice-member-p #'+workspaces*auto-add-buffer #'switch-to-buffer))) +(def-test! auto-add-buffer-to-persp + (let ((a (generate-new-buffer "a"))) + (doom-set-buffer-real a t) + (with-workspace!! () + (should-not (+workspace-contains-buffer-p a)) + (switch-to-buffer a) + (should (+workspace-contains-buffer-p a))))) (def-test! current - (-with-workspace! () + (with-workspace!! () (should (equal (+workspace-current-name) +workspaces-main)) (should (+workspace-exists-p +workspaces-main)) (let ((workspace (+workspace-get +workspaces-main)) @@ -45,7 +50,7 @@ (should (equal workspace current-workspace))))) (def-test! workspace-list - (-with-workspace! () + (with-workspace!! () (should (equal (+workspace-list-names) (list (+workspace-current-name)))) (should (equal (+workspace-list) @@ -53,7 +58,7 @@ (def-test! workspace-crud "Creating, reading, updating and deleting workspaces." - (-with-workspace! () + (with-workspace!! () (let ((new-workspace-name "*new-test*") (renamed-workspace-name "*old-test*")) (should (+workspace-new new-workspace-name)) @@ -67,14 +72,14 @@ (should (= (length (+workspace-list-names)) 1))))) (def-test! workspace-switch - (-with-workspace! () + (with-workspace!! () (let ((new-workspace-name "*new-test*")) (should-error (+workspace-switch new-workspace-name)) (should (+workspace-switch new-workspace-name t)) (should (equal (+workspace-current-name) new-workspace-name))))) (def-test! buffer-list - (-with-workspace! (a b) + (with-workspace!! (a b) (let ((c (get-buffer-create "c")) (d (get-buffer-create "d"))) (should (+workspace-contains-buffer-p a)) diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el index 2402f9aac..bbcb0cebf 100644 --- a/modules/lang/org/test/autoload-org.el +++ b/modules/lang/org/test/autoload-org.el @@ -1,40 +1,40 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/org/test/autoload-org.el -(defmacro should-org-buffer! (source expected &rest body) +(defmacro should-org-buffer!! (source expected &rest body) `(should-buffer! ,source ,expected (org-mode) ,@body)) - +;; ;; `+org/insert-item' (def-test! insert-item-h1 "Should append/prepend new first-level headers with an extra newline." - (should-org-buffer! ("* {0}Header") ("* Header\n\n* {|}") + (should-org-buffer!! ("* {0}Header") ("* Header\n\n* {|}") (+org/insert-item 'below)) - (should-org-buffer! ("* {0}Header") ("* {|}\n\n* Header") + (should-org-buffer!! ("* {0}Header") ("* {|}\n\n* Header") (+org/insert-item 'above))) (def-test! insert-item-h2 "Should append/prepend new second-level (and higher) headers without an extra newline." - (should-org-buffer! ("** {0}Header") ("** Header\n** {|}") + (should-org-buffer!! ("** {0}Header") ("** Header\n** {|}") (+org/insert-item 'below)) - (should-org-buffer! ("** {0}Header") ("** {|}\n** Header") + (should-org-buffer!! ("** {0}Header") ("** {|}\n** Header") (+org/insert-item 'above))) (def-test! insert-item-plain-list "Should append/prepend new second-level (and higher) headers without an extra newline." - (should-org-buffer! ("+ {0}List item") ("+ List item\n+ {|}") + (should-org-buffer!! ("+ {0}List item") ("+ List item\n+ {|}") (+org/insert-item 'below)) - (should-org-buffer! ("+ {0}List item" + (should-org-buffer!! ("+ {0}List item" " + Sub item") ("+ List item" " + Sub item" "+ {|}") (+org/insert-item 'below)) - (should-org-buffer! ("+ {0}List item" + (should-org-buffer!! ("+ {0}List item" "+ Next item") ("+ List item" "+ {|}" diff --git a/modules/lang/org/test/org.el b/modules/lang/org/test/org.el index e69f7a261..9b77e67db 100644 --- a/modules/lang/org/test/org.el +++ b/modules/lang/org/test/org.el @@ -5,3 +5,5 @@ (require! :lang org) (require 'org (locate-library "org" nil doom--package-load-path)) + +;; diff --git a/modules/tools/password-store/test/autoload-pass.el b/modules/tools/password-store/test/autoload-pass.el index 083c2f0d8..d9d190097 100644 --- a/modules/tools/password-store/test/autoload-pass.el +++ b/modules/tools/password-store/test/autoload-pass.el @@ -3,7 +3,7 @@ (load! ../autoload) -(defmacro -with-passwords! (buffer-args &rest body) +(defmacro with-passwords!! (buffer-args &rest body) (declare (indent defun)) `(cl-letf (((symbol-function '+pass--get-entry) @@ -18,7 +18,7 @@ ;; (def-test! get-field - (-with-passwords! + (with-passwords!! (should (equal (+pass-get-field "fake/source" "login") "HL2532-GANDI")) (should (equal (+pass-get-field "fake/source" "email") @@ -29,14 +29,14 @@ "henrik@lissner.net")))) (def-test! missing-fields-return-nil - (-with-passwords! + (with-passwords!! (should-not (+pass-get-field "fake/source" '("x" "y" "z"))))) (def-test! missing-entries-throw-error - (-with-passwords! + (with-passwords!! (should-error (+pass-get-field "nonexistent/source" "login")))) (def-test! get-login - (-with-passwords! + (with-passwords!! (should (equal (+pass-get-user "fake/source") "HL2532-GANDI")) (should (equal (+pass-get-secret "fake/source") "defuse-account-gad")))) From b0e6ba769ebbe966a44c82af0431809584c58b43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 17:41:25 -0500 Subject: [PATCH 123/145] Add issue/pr templates --- .github/ISSUE_TEMPLATE | 39 +++++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE | 5 +++++ 2 files changed, 44 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE create mode 100644 .github/PULL_REQUEST_TEMPLATE diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE new file mode 100644 index 000000000..ff0b5bb67 --- /dev/null +++ b/.github/ISSUE_TEMPLATE @@ -0,0 +1,39 @@ +Here are some things you should try before filing a bug report: + ++ Run `make install` to ensure all plugins are installed. ++ `void-function` or `void-variable` errors could signal an out-of-date autoloads file. Run `make autoloads` or `M-x doom//reload-autoloads` to update it. ++ Scan for common OS/environment issues with `make doctor`. ++ Never debug byte-compiled code. It will interfere in subtle ways. Clean up \*.elc files with `make clean` or `M-x doom//clean-byte-compiled-files`. ++ Check [the FAQ](https://github.com/hlissner/doom-emacs/wiki/FAQ#troubleshooting) to see if your issue is mentioned. ++ Check the relevant module's README.org, if one exists. There may be extra steps to getting certain features to work. + +If none of those help, remove this section and fill out the four sections in the template below. + +--- + +### Observed behavior + +Describe what happened. Any aids you can include (that you think could be relevant) are a tremendous help; like a screencast gif, video, or link to your customizations for Doom (e.g. a repo or a pastebin). + +### Expected behavior + +Describe what you _expected_ to happen. + +### Steps to reproduce + +1. Select these example steps, +2. Delete them, +3. And replace them with precise steps to reproduce your issue. + +### System information + +
+Click to expand + +``` +Replace this line with the output of *one* of these commands: + ++ `M-x doom/info` (from inside Emacs) ++ `DEBUG=1 make doctor` (command line) +``` +
diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE new file mode 100644 index 000000000..c7cab1bfb --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE @@ -0,0 +1,5 @@ +Thank you for contributing to Doom! + +Before you submit this PR, please make sure your PR is targeted at develop, not +master (unless this is a fix for a critical error). Then replace this message +with a description of your changes. From c5508515007c9a03ddd81ed9a55136af6d0cff02 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 17:49:15 -0500 Subject: [PATCH 124/145] doom-doctor: minor refactor --- bin/doom-doctor | 62 +++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 15ffe646e..eb8b55108 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -8,6 +8,7 @@ ;; In case it isn't defined (in really old versions of Emacs, like the one that ;; ships with MacOS). (defvar user-emacs-directory (expand-file-name "~/.emacs.d/")) +(defvar doom-debug-mode (getenv "DEBUG")) (unless (equal (expand-file-name user-emacs-directory) (expand-file-name "~/.emacs.d/")) @@ -70,11 +71,11 @@ (format "\e[%dm%s\e[%dm" code (apply #'format msg args) 0)) (defalias 'msg! #'message) -(defmacro error! (&rest args) `(message (color 1 (color 31 ,@args)))) -(defmacro warn! (&rest args) `(message (color 1 (color 33 ,@args)))) -(defmacro success! (&rest args) `(message (color 1 (color 32 ,@args)))) -(defmacro section! (&rest args) `(message (color 34 ,@args))) -(defmacro explain! (&rest args) `(message (indented 2 (autofill ,@args)))) +(defmacro error! (&rest args) `(msg! (color 1 (color 31 ,@args)))) +(defmacro warn! (&rest args) `(msg! (color 1 (color 33 ,@args)))) +(defmacro success! (&rest args) `(msg! (color 1 (color 32 ,@args)))) +(defmacro section! (&rest args) `(msg! (color 34 ,@args))) +(defmacro explain! (&rest args) `(msg! (indented 2 (autofill ,@args)))) ;;; Polyfills ;; early versions of emacs won't have this @@ -233,7 +234,7 @@ (`timeout (error! "Timed out trying to contact %s" ex)) (_ (error! "Failed to validate %s" url) - (when (getenv "DEBUG") + (when doom-debug-mode (explain! (pp-to-string it))))))) (dolist (url '("https://self-signed.badssl.com" "https://wrong.host.badssl.com/")) @@ -275,50 +276,51 @@ ;; --- report! ------------------------------------------------ -(when (getenv "DEBUG") +(when doom-debug-mode (msg! "\n====\nHave some debug information:\n") (when (bound-and-true-p doom-modules) (msg! " + enabled modules:\n%s" - (indented 4 - (columns 3 23 - (mapcar (lambda (x) (format "+%s" x)) - (mapcar #'cdr (doom-module-pairs))))))) + (indented 4 + (columns 3 23 + (mapcar (lambda (x) (format "+%s" x)) + (mapcar #'cdr (doom-module-pairs))))))) (when (and (bound-and-true-p doom-packages) (require 'package nil t)) (msg! " + enabled packages:\n%s" - (indented 4 - (columns 2 35 - (mapcar (lambda (pkg) - (let ((desc (cadr (assq pkg package-alist)))) - (when desc - (package-desc-full-name desc)))) - (sort (mapcar #'car doom-packages) #'string-lessp)))))) + (indented 4 + (columns 2 35 + (delq nil + (mapcar (lambda (pkg) + (let ((desc (cadr (assq pkg package-alist)))) + (when desc + (package-desc-full-name desc)))) + (sort (mapcar #'car doom-packages) #'string-lessp))))))) (msg! " + byte-compiled files:\n%s" - (indented 4 - (columns 2 39 - (let ((files (append (directory-files-recursively doom-core-dir ".elc$") - (directory-files-recursively doom-modules-dir ".elc$")))) - (or (and files (mapcar (lambda (file) (file-relative-name file doom-emacs-dir)) - (nreverse files))) - (list "n/a")))))) + (indented 4 + (columns 2 39 + (let ((files (append (directory-files-recursively doom-core-dir ".elc$") + (directory-files-recursively doom-modules-dir ".elc$")))) + (or (and files (mapcar (lambda (file) (file-relative-name file doom-emacs-dir)) + (nreverse files))) + (list "n/a")))))) (msg! " + exec-path:\n%s" - (indented 4 - (columns 1 79 exec-path))) + (indented 4 + (columns 1 79 exec-path))) (msg! " + PATH:\n%s" - (indented 4 - (columns 1 79 (split-string (getenv "PATH") ":"))))) + (indented 4 + (columns 1 79 (split-string (getenv "PATH") ":"))))) ;; (if (= doom-errors 0) (success! "Everything seems fine, happy Emacs'ing!") (message "\n----") (warn! "There were issues!") - (unless (getenv "DEBUG") + (unless doom-debug-mode (msg! "\nHopefully these can help you find problems. If not, run this doctor again with DEBUG=1:") (msg! "\n DEBUG=1 make doctor\n") (msg! "And file a bug report with its output at https://github.com/hlissner/.emacs.d/issues"))) From 5048b72c12b2084fc861d127780f31c574a835a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 17:49:27 -0500 Subject: [PATCH 125/145] Add doom/info command This copies debug information about the current session of Doom Emacs in the clipboard, which folks can use to include system information with their bug reports! --- core/autoload/debug.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 0bffa5da3..e5d907837 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -86,3 +86,15 @@ selection of all minor-modes, active or not." (profiler-report) (profiler-stop)) (setq doom--profiler (not doom--profiler))) + +;;;###autoload +(defun doom/info () + "Collects information about this session of Doom Emacs and copies it to the +clipboard. Helpful when filing bug reports!" + (interactive) + (message "Producing information about your system...") + (with-temp-buffer + (call-process (expand-file-name "bin/doom-doctor" doom-emacs-dir) nil t) + (ansi-color-apply-on-region (point-min) (point-max)) + (kill-new (buffer-string))) + (message "Copied to clipboard!")) From 9628b21d2242647b604cd7771322a672e8ff685b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 18:28:26 -0500 Subject: [PATCH 126/145] Fix async package functions not running from right cwd --- core/core-packages.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 1ab82a798..8c4451995 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -493,8 +493,9 @@ loads MODULE SUBMODULE's packages.el file." t))) (defun doom-packages--async-run (fn) - (let ((compilation-filter-hook - (list (lambda () (ansi-color-apply-on-region compilation-filter-start (point)))))) + (let* ((default-directory doom-emacs-dir) + (compilation-filter-hook + (list (lambda () (ansi-color-apply-on-region compilation-filter-start (point)))))) (compile (format "%s --quick --batch -l core/core.el -f %s" (executable-find "emacs") (symbol-name fn))) From 79ca2b2911417cd7e6bc37066fb35815aa3e8bf4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 18:28:42 -0500 Subject: [PATCH 127/145] Fix interactive usage of doom//byte-compile-core --- core/core-packages.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8c4451995..1830d6eb2 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -680,7 +680,11 @@ likely change core files directly). If RECOMPILE-P is non-nil, only recompile out-of-date core files." (interactive "P") - (doom//byte-compile (list "core") recompile-p)) + (if (not noninteractive) + ;; This is done in another instance to protect the current session's + ;; state. `doom-initialize-packages' will have side effects otherwise. + (doom-packages--async-run 'doom//byte-compile-core) + (doom//byte-compile (list "core") recompile-p))) (defun doom//byte-recompile-plugins () "Recompile all installed plugins. If you're getting odd errors after upgrading From 189e401197953b8a520ccd13c3be26ee6a649d4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 18:32:34 -0500 Subject: [PATCH 128/145] Refactor doom/info --- core/autoload/debug.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index e5d907837..9cd01271f 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -92,9 +92,9 @@ selection of all minor-modes, active or not." "Collects information about this session of Doom Emacs and copies it to the clipboard. Helpful when filing bug reports!" (interactive) - (message "Producing information about your system...") (with-temp-buffer + (message "Producing information about your system...") (call-process (expand-file-name "bin/doom-doctor" doom-emacs-dir) nil t) (ansi-color-apply-on-region (point-min) (point-max)) - (kill-new (buffer-string))) - (message "Copied to clipboard!")) + (kill-new (buffer-string)) + (message "Done. Copied to clipboard!"))) From 560548db3336fe7df711a4e856e9ccc69612deb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 18:32:56 -0500 Subject: [PATCH 129/145] core-projects: refactor projectile var init --- core/core-projects.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 42c0a222a..24db2ee04 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -18,12 +18,16 @@ ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) - (nconc projectile-globally-ignored-directories (list (abbreviate-file-name doom-local-dir) ".sync")) - (nconc projectile-other-file-alist '(("css" . ("scss" "sass" "less" "style")) - ("scss" . ("css")) - ("sass" . ("css")) - ("less" . ("css")) - ("styl" . ("css")))) + (setq projectile-globally-ignored-directories + (append projectile-globally-ignored-directories + (list (abbreviate-file-name doom-local-dir) ".sync")) + projectile-other-file-alist + (append projectile-other-file-alist + '(("css" . ("scss" "sass" "less" "styl")) + ("scss" . ("css")) + ("sass" . ("css")) + ("less" . ("css")) + ("styl" . ("css"))))) ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. From 2c2030b583f6c9285080e8733a327d2b8a9b004d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 21:34:54 -0500 Subject: [PATCH 130/145] +jump/documentation: always prompt for provider with online fallback --- modules/feature/jump/autoload/jump.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/jump/autoload/jump.el b/modules/feature/jump/autoload/jump.el index 21d951f3b..36ad3c49c 100644 --- a/modules/feature/jump/autoload/jump.el +++ b/modules/feature/jump/autoload/jump.el @@ -97,7 +97,9 @@ Tries `xref-find-references' and falls back to rg/ag." (cond ((plist-member +jump-current-functions :documentation) (+jump-to :documentation identifier)) (t - (+jump/online (caar +jump-search-provider-alist) identifier)))) + (+jump/online + identifier + (+jump--online-get-provider (not current-prefix-arg)))))) (defun +jump--online-get-provider (&optional force-p) (or (and (not force-p) From eef6ed3d11f8f721eb55593ae954fb4476b7cb8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 23:18:07 -0500 Subject: [PATCH 131/145] Minor, general refactor & comment updates --- core/core-editor.el | 2 +- core/core-packages.el | 2 +- modules/feature/evil/config.el | 4 ++-- modules/feature/jump/config.el | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b89a68f3d..929e02cba 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -168,8 +168,8 @@ extension, try to guess one." ;; Auto-close delimiters and blocks as you type (def-package! smartparens + :hook (doom-init . smartparens-global-mode) :config - (add-hook 'doom-init-hook #'smartparens-global-mode) (require 'smartparens-config) (setq sp-autowrap-region nil ; let evil-surround handle this diff --git a/core/core-packages.el b/core/core-packages.el index 1830d6eb2..c40ef27b5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -704,7 +704,7 @@ compiled packages.'" if (file-exists-p path) collect path and do (delete-file path) - and do (message "Deleted %s" (file-relative-name path))) + and do (message "✓ Deleted %s" (file-relative-name path))) (message "Everything is clean")))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 4d24b856e..bf0efc808 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -388,8 +388,8 @@ the new algorithm is confusing, like in python or ruby." ;; ;; mc doesn't play well with evil, this attempts to assuage some of its problems -;; so that certain plugins (which I have no control over) can still use it in -;; relative safety. +;; so that any plugins that depend on multiple-cursors (which I have no control +;; over) can still use it in relative safety. (after! multiple-cursors-core (map! :map mc/keymap :ne "" #'mc/keyboard-quit) diff --git a/modules/feature/jump/config.el b/modules/feature/jump/config.el index 1c2cc0e56..f4e005446 100644 --- a/modules/feature/jump/config.el +++ b/modules/feature/jump/config.el @@ -29,7 +29,7 @@ "An alist that maps online resources to their search url or a function that produces an url. Used by `+jump/online'.") -(defconst +jump-search-browser-fn #'browse-url +(defvar +jump-search-browser-fn #'browse-url "Function to use to open search urls.") (defvar +jump-function-alist nil From e87b7880789b228dc9fadacbcef9dbce315631d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Dec 2017 23:07:28 -0500 Subject: [PATCH 132/145] Update & reformat module readmes for v2.0.9 + completion/ivy + completion/company + feature/evil + feature/eval + feature/snippets + feature/workspaces + tools/neotree --- modules/completion/company/README.org | 19 +++++---- modules/completion/ivy/README.org | 60 +++++++++++++++++++-------- modules/feature/eval/README.org | 56 +++++++++++++++---------- modules/feature/evil/README.org | 27 ++++++++---- modules/feature/snippets/README.org | 19 +-------- modules/feature/workspaces/README.org | 32 ++++++++++---- modules/tools/neotree/README.org | 6 ++- 7 files changed, 138 insertions(+), 81 deletions(-) diff --git a/modules/completion/company/README.org b/modules/completion/company/README.org index 76e9ad4ac..f2a1bc6fc 100644 --- a/modules/completion/company/README.org +++ b/modules/completion/company/README.org @@ -14,20 +14,23 @@ This module adds code-completion support, powered by [[https://github.com/compan - [[#troubleshooting][Troubleshooting]] * Install -Certain languages may require additional setup, and some languages may have no completion support at all. +Some languages require additional setup, and some languages may have no +completion support at all. Check the README.org in that language's module for details. * Configure ** Auto-completion -By default, I've disabled auto-completion. This is my preference. I prefer to invoke company when I need it by calling ~company-complete~ manually (typically, bound to =C-SPC= in insert mode). However, some may not share my preference. +By default, I've disabled auto-completion. This is my preference. I prefer to +invoke company when I need it by calling ~company-complete~ manually (typically, +bound to =C-SPC= in insert mode). However, some may not share my preference. To enable auto-completion you must: 1. Load ~company~, 2. and change ~company-idle-delay~ to a non-nil float (the default is 0.5) -For example, add the following to your ~modules/private//config.el~ module: +For example: #+BEGIN_SRC emacs-lisp (require 'company) @@ -36,8 +39,10 @@ For example, add the following to your ~modules/private//config.el~ mo #+END_SRC * Troubleshooting -If completion isn't working for you, please consider the following before posting a bug report: +If completion isn't working for you, please consider the following before +posting a bug report: -+ If what you are expecting is popup-as-you-type completion (which is disabled by default), see the "Customize" section above; it includes instructions on how to enable this. -+ Certain languages may have extra dependencies in order for auto-completion to work. Please look for that module's README.org for details. -+ Some languages don't have any auto-completion support. ++ If what you are expecting is popup-as-you-type completion (which is disabled + by default), see the "Configure > Auto-completion" section above, which will + instruct you on how to enable this. ++ Some languages don't have any auto-completion support at all. diff --git a/modules/completion/ivy/README.org b/modules/completion/ivy/README.org index b0732f935..18f399739 100644 --- a/modules/completion/ivy/README.org +++ b/modules/completion/ivy/README.org @@ -3,11 +3,13 @@ This module adds Ivy, a completion backend. #+begin_quote -I prefer ivy over ido for its flexibility. I prefer ivy over helm because it's lighter. +I prefer ivy over ido for its flexibility. I prefer ivy over helm because it's +lighter. #+end_quote + Project-wide search & replace powered by ~rg~ or ~ag~ -+ Project jump-to navigation ala Command-T, Sublime Text's Jump-to-anywhere or Vim's CtrlP plugin. ++ Project jump-to navigation ala Command-T, Sublime Text's Jump-to-anywhere or + Vim's CtrlP plugin. + Ivy integration for ~M-x~, ~imenu~, ~recentf~ and others. + A powerful, interactive in-buffer search using ~swiper~. + Ivy-powered TODO/FIXME navigation @@ -28,7 +30,9 @@ I prefer ivy over ido for its flexibility. I prefer ivy over helm because it's l * Install This module optionally depends on [[https://github.com/BurntSushi/ripgrep][ripgrep]] and [[https://github.com/ggreer/the_silver_searcher][the_silver_searcher]]. -~rg~ is faster, but its results aren't deterministic, neither does it support multiline search or full PCRE, that's where ~ag~ is useful. +~rg~ is faster, but its results aren't deterministic, neither does it support +multiline search or full PCRE (at the time of writing), that's where ~ag~ is +useful. ** MacOS #+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") @@ -41,37 +45,58 @@ sudo pacman --needed --noconfirm -S ripgrep the_silver_searcher #+END_SRC * Usage -Here is some insight into how I use this module. Keep in mind that the referenced commands and keybindings are defined [[/modules/private/hlissner][in my private module]]. +Here is some insight into how I use this module. ** Project search & replace -Ex interfaces to Ag (the silver searcher) and Rg (ripgrep) are available: ~:ag[!]~ and ~:rg[!]~, or their current-directory counterparts ~:agcwd[!]~ and ~:rgcwd[!]~. +There are four Ex interfaces for the silver searcher and ripgrep. They are: + ++ ~:ag[!]~ ++ ~:agcwd[!]~ ++ ~:rg[!]~ ++ ~:rgcwd[!]~ + +The optional BANG tells ag/rg to include ignored files in the search. And the +\*cwd variant of each command will only search in the current directory +(non-recursively). [[/../screenshots/modules/completion/ivy/ivy-search.gif]] -From this session, you can press =S+Tab= to create a writeable occur-buffer in wgrep mode. +Now, how do we do text replacements? With the ivy popup open you can press +=S+Tab= to create an wgrep buffer out of the results. [[/../screenshots/modules/completion/ivy/ivy-search-replace.gif]] -Make your modifications and press =C-c C-c= to commit them, or =C-c C-k= to abort. +Make your modifications and press =C-c C-c= to commit them, or =C-c C-k= to +abort. ** Jump-to-file project navigation -Inspired by Sublime Text's jump-to-anywhere, Vim's CtrlP or Unite plugins, and Textmate's Command-T, a marriage of ~projectile~ and ~ivy~ makes this available to you in Emacs. Invoke it with =SPC f /=, =SPC SPC= or ~counsel-projectile-find-file~. +Inspired by Sublime Text's jump-to-anywhere, Vim's CtrlP/Unite plugins, and +Textmate's Command-T, a marriage of ~projectile~ and ~ivy~ makes this available +in Emacs. + +Invoke it with =SPC f /=, =SPC SPC= or ~M-x counsel-projectile-find-file~. [[/../screenshots/modules/completion/ivy/ivy-projectile.gif]] ** In-buffer searching -I use ~evil-search~ (invoked by pressing =/= in normal mode) when jumping small/moderate (or predictable) distances. However, there are occasions where I need more feedback, so I turn to ~swiper~ (available directly with =M-x swiper RET=, or via ~:sw[iper]~). +I use ~evil-search~ (invoked by pressing =/= in normal mode) when jumping +small/moderate (or predictable) distances. However, there are occasions where I +need more feedback, so I turn to ~swiper~ (available directly with =M-x swiper +RET=, or via ~:sw[iper]~). [[/../screenshots/modules/completion/ivy/ivy-swiper.gif]] ** Task lookup -I sprinkle my projects with TODO's & FIXME's. You can navigate to and peruse them via ~M-x +ivy/tasks~ or ~:todo[!]~ (ex command). +I sprinkle my projects with TODO's & FIXME's. You can navigate to and peruse +them via ~M-x +ivy/tasks~ or ~:todo[!]~ (ex command). [[/../screenshots/modules/completion/ivy/ivy-todo.gif]] * Appendix ** Commands -Here is a list of my commonly used commands, their default keybinds (defined in [[../../private/hlissner/+bindings.el][private/hlissner/+bindings.el]]), and their corresponding ex command (defined in [[../../private/hlissner/+commands.el][private/hlissner/+commands.el]]). +Here is a list of my commonly used commands, their default keybinds (defined in +[[../../private/default/+bindings.el][private/default/+bindings.el]]), and their corresponding ex command (defined in +[[../../private/default/+evil-commands.el][private/default/+evil-commands.el]]). | command | key / ex command | description | |-------------------------------------+------------------------+------------------------------------------------------------------| @@ -90,7 +115,8 @@ Here is a list of my commonly used commands, their default keybinds (defined in | ~+ivy:swiper~ | ~:sw[iper] [QUERY]~ | Search current buffer | | ~+ivy:todo~ | ~:todo[!]~ | List all TODO/FIXMEs in project (or current file if BANG) | -While in a search (e.g. invoked from ~+ivy:ag~ or ~+ivy:rg~), these new keybindings are available to you: +While in a search (e.g. invoked from ~+ivy:ag~ or ~+ivy:rg~), these new +keybindings are available to you: | key | description | |-------------+--------------------------------------------------------------------------------| @@ -99,10 +125,10 @@ While in a search (e.g. invoked from ~+ivy:ag~ or ~+ivy:rg~), these new keybindi | =M-RET= | Open the selected candidate in other-window | ** Hacks -+ Functions with ivy/counsel equivalents have been globally remapped (like ~find-file~ => ~counsel-find-file~). So a keybinding to ~find-file~ will invoke ~counsel-find-file~ instead. -+ ~counsel-[arp]g~'s 3-character limit was reduced to 1 (mainly for the ex command) -+ ~counsel-[arp]g~'s parentheses quoting behavior was reversed. Now, if you - want literal parentheses, you must escape them: e.g. ~\(match\)~ is literal, - ~(match)~ is a regexp group. ++ Functions with ivy/counsel equivalents have been globally remapped (like + ~find-file~ => ~counsel-find-file~). So a keybinding to ~find-file~ will + invoke ~counsel-find-file~ instead. ++ ~counsel-[arp]g~'s 3-character limit was reduced to 1 (mainly for the ex + command) diff --git a/modules/feature/eval/README.org b/modules/feature/eval/README.org index eb9cf3084..851ea6a48 100644 --- a/modules/feature/eval/README.org +++ b/modules/feature/eval/README.org @@ -1,43 +1,52 @@ #+TITLE: :feature eval -This modules adds support for evaluating code from inside Emacs. This includes REPLs and direct access to the interpreters and compilers of many languages. +This modules adds support for evaluating code from inside Emacs, including +REPLs. * Table of Contents :TOC: - [[#install][Install]] - [[#usage][Usage]] -- [[#configuration][Configuration]] - [[#repls][REPLs]] - - [[#code-evaluation][Code Evaluation]] + - [[#code-evaluation][*Code Evaluation*]] +- [[#configuration][Configuration]] + - [[#repls-1][REPLs]] + - [[#code-evaluation-1][Code Evaluation]] * Install -This module has no external dependencies. However, specific languages may require additional setup. +This module has no external dependencies. However, specific languages may +require additional setup. Check the README.org in that language's module for details. * Usage -+ *REPLs* - Invoked via: - + ~:repl~ (evil ex-command) - + = o r= in normal mode (or visual mode, which sends the selection to the open REPL) - + ~M-x +eval/open-repl~ - + ~M-x +eval/send-region-to-repl~ while a selection (and REPL) is active +** REPLs +Invoked via: ++ ~:repl~ (evil ex-command) ++ = o r= in normal mode (or visual mode, which sends the selection to + the open REPL) ++ ~M-x +eval/open-repl~ ++ ~M-x +eval/send-region-to-repl~ while a selection (and REPL) is active -+ *Code Evaluation* - Quickrun can be invoked via: - + ~M-x +eval/buffer~ (or ~gR~, or ~M-r~) - + ~M-x +eval/region~ - + ~M-x +eval/region-and-replace~ - + Evil users can use the ~gr~ operator to select and run a region. +** *Code Evaluation* +Quickrun can be invoked via: ++ ~M-x +eval/buffer~ (or ~gR~, or ~M-r~) ++ ~M-x +eval/region~ ++ ~M-x +eval/region-and-replace~ ++ Evil users can use the ~gr~ operator to select and run a region. * Configuration ** REPLs -REPLs are defined for most of the languages Doom supports (check its README.org to see if it does). +REPLs are defined for most of the languages Doom supports (check its README.org +to see if it does). -Otherwise, you can define your own for a specified major-mode with the =:repl= setting. +Otherwise, you can define your own for a specified major-mode with the =:repl= +setting. ~(set! :repl MAJOR-MODE FUNCTION)~ -FUNCTION must return the repl buffer. Any window changes are ignored, then handed off to shackle (assuming shackle-mode is on) to display in a popup window. +FUNCTION must return the repl buffer. Any window changes are ignored, then +handed off to shackle (assuming shackle-mode is on) to display in a popup +window. #+BEGIN_SRC emacs-lisp (defun +emacs-lisp/repl () @@ -53,9 +62,14 @@ FUNCTION must return the repl buffer. Any window changes are ignored, then hande #+END_SRC ** Code Evaluation -Run regions or entire buffers with [[https://github.com/syohex/emacs-quickrun][Quickrun]]. Output will be sent to a popup window. +Run regions or entire buffers with [[https://github.com/syohex/emacs-quickrun][Quickrun]]. Output is show in a popup window. -Quickrun includes support for many languages, but occasionally, you'll find a language without support, such as [[https://crystal-lang.org/][Crystal]]. A "runner" can be defined like so: +Quickrun includes support for many languages, usually by sending text directly +to interpreters or compilers. However, occasionally, you'll find a language +without support (like [[https://crystal-lang.org/][Crystal]]), or a language with better Emacs integration +(like elisp). + +Here's how you define a "runner": #+BEGIN_SRC emacs-lisp (set! :eval 'crystal-mode diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index 1ba70d4cb..4093c770a 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -11,12 +11,14 @@ This holy module brings the vim experience to Emacs. - [[#differences-from-vim][Differences from vim]] * Removing evil-mode -To get back a more vanilla Emacs experience, remove =:feature evil= from init.el. Evil-specific configuration and keybindings (defined with ~map!~) will be ignored without evil present (and removed when byte-compiling). +See the [[https://github.com/hlissner/doom-emacs/wiki/FAQ#remove-vimevil-for-a-more-vanilla-emacs-experience][corresponding question in the FAQ]]. * Features + A better ~:g[lobal]~ command with incremental highlighting. -+ Adds the ~:al[ign]~ ex command: offers an ex interface to ~align-regexp~ with incremental highlighting. -+ Support for more of vim's filename modifiers in ex commands (like ~:p~, ~:p:h~ or ~:t~) than vanilla evil-mode offers. ++ Adds the ~:al[ign]~ ex command: offers an ex interface to ~align-regexp~ with + incremental highlighting. ++ Support for more of vim's filename modifiers in ex commands (like ~:p~, ~:p:h~ + or ~:t~) than vanilla evil-mode offers. + A list of new text objects: + Blocks: ~B~ (from ~evil-textobj-anyblock~) + Args: ~a~ (from ~evil-args~) @@ -31,20 +33,29 @@ To get back a more vanilla Emacs experience, remove =:feature evil= from init.el + =NERDTree= equivalent is available in =:tools neotree= ** Multiple-cursors -Two multiple-cursor implementations exist in this module: ~evil-mc~ and ~evil-multiedit~. Together, these provide the functionality of ~vim-multiple-cursors~. +Two multiple-cursor implementations exist in this module: ~evil-mc~ and +~evil-multiedit~. Together, these provide the functionality of +~vim-multiple-cursors~. -The former lets you place "clone" cursors. The latter lets you interactively edit many regions from one place (like an interactive version of ~:%s~). +The former lets you place "clone" cursors. The latter lets you interactively +edit many regions at once (like an interactive version of ~:%s~). ** A hybrid code-folding system -This module combines ~evil-vimish-fold~ and ~hideshow~. The former allows arbitrary folds and the latter allows folds on markers and indentation. Together, they create a more consistent (and feature-complete) code-folding system. +This module combines ~evil-vimish-fold~ and ~hideshow~. The former allows +arbitrary folds and the latter allows folds on markers and indentation. +Together, they create a more consistent (and feature-complete) code-folding +system. Most vim folding keys should work, e.g. =zr=, =zm=, =za=, =zo=, etc. ** Hacks + Automatically moves to new window when splitting -+ If in visual mode, =*= and =#= will search for the current selection instead of the word-at-point. ++ From visual mode, =*= and =#= will search for the current selection instead of + the word-at-point. ** Differences from vim -+ Column-wise ranges in ex commands are enabled by default. i.e. the range in =:'<,'>s/a/b= will only affects the visual selection, not full lines (see ~evil-ex-visual-char-range~). ++ Column-wise ranges in ex commands are enabled by default. i.e. the range in + =:'<,'>s/a/b= will only affects the visual selection, not full lines (see + ~evil-ex-visual-char-range~). + =:g= will incrementally highlight buffer matches. diff --git a/modules/feature/snippets/README.org b/modules/feature/snippets/README.org index 3a81372b6..d22278f1b 100644 --- a/modules/feature/snippets/README.org +++ b/modules/feature/snippets/README.org @@ -8,20 +8,5 @@ This module adds snippets to Emacs, powered by yasnippet. * Install There are no extra dependencies for this module. -By default, this module uses the snippet library included with yasnippet. - -For the best experience, I'd suggest installing mine from https://github.com/hlissner/emacs-snippets -- they have been tailored specifically for Doom. - -1. Clone the repo to your private module: - #+BEGIN_SRC bash - git clone https://github.com/hlissner/emacs-snippets ~/.emacs.d/modules/private/$(whoami)/snippets - #+END_SRC -2. Tell yasnippet where to look for them: - #+BEGIN_SRC emacs-lisp - ;; modules/private/{USERNAME}/config.el - (after! yasnippet - (setq yas-snippet-dirs - (append (list (expand-file-name "snippets/" (file-name-directory load-file-name))) - (delq 'yas-installed-snippets-dir yas-snippet-dirs)))) - #+END_SRC - +By default, =private/default= installs a snippet library tailored exclusively +for Doom Emacs. diff --git a/modules/feature/workspaces/README.org b/modules/feature/workspaces/README.org index c2e3f2c71..29f8dec1a 100644 --- a/modules/feature/workspaces/README.org +++ b/modules/feature/workspaces/README.org @@ -1,9 +1,15 @@ #+TITLE: :feature workspaces -This module adds support for workspaces, powered by persp_mode, as well as a unified API for manipulating them. +This module adds support for workspaces, powered by persp_mode, as well as a API +for manipulating them. #+begin_quote -There are many ways to use workspaces. Some use them to group buffers/windows by project or categories (views, models, logic, etc). I use them differently: on a per-task basis, which may traverse multiple projects or aspects, but are tied to an objective. For example: implement a specific feature or fix a certain bug; sometimes unrelated to the project at hand. +There are many ways to use workspaces. I spawn a workspace per task. Say I'm +working in the main workspace, when I realize there is a bug in another part of +my project. I open a new workspace and deal with it in there. In the meantime, I +need to check my email, so mu4e gets its own workspace. + +Once I've completed the task, I close the workspace and return to main. #+end_quote * Table of Contents :TOC: @@ -22,25 +28,33 @@ This module has no additional dependencies. * Features ** Isolated buffer-list -When persp-mode is active, ~doom-buffer-list~ becomes workspace-restricted. You can overcome this by using ~buffer-list~. +When persp-mode is active, ~doom-buffer-list~ becomes workspace-restricted. You +can overcome this by using ~buffer-list~. ** Automatic workspaces A workspace is automatically created (and switched to) when you: -+ Create a new frame (with =make-frame=; bound to =M-N= by default) -+ Switch to a project using ~projectile-switch-project~ (or its ivy/helm equivalents) ++ Create a new frame (with =make-frame=; bound to =M-N= by default). ++ Switch to a project using ~projectile-switch-project~. ** Session persistence -By default, your session is autosaved when you quit Emacs (or disable ~persp-mode~). You can load a previous session with ~M-x +workspace/load-session~ or ~:sl[oad]~ (ex command). +By default, your session is autosaved when you quit Emacs (or disable +~persp-mode~). You can load a previous session with ~M-x ++workspace/load-session~ or ~:sl[oad]~ (ex command). -You can supply either a name to load a specific session to replace your current one. +You can supply either a name to load a specific session to replace your current +one. ** Workspace persistence -If you'd like to save a specific workspace, use ~M-x +workspace/save~, which can be loaded into the current session (as another workspace) with ~M-x +workspace/load~. +If you'd like to save a specific workspace, use ~M-x +workspace/save~, which can +be loaded into the current session (as another workspace) with ~M-x ++workspace/load~. * Appendix ** Commands & Keybindings -Here is a list of available commands, their default keybindings (defined in private/hlissner/+bindings.el), and corresponding ex commands (if any -- defined in private/hlissner/+commands.el). +Here is a list of available commands, their default keybindings (defined in +[[../../private/default/+bindings.el][private/default/+bindings.el]]), and corresponding ex commands (if any -- defined +in [[../../private/default/+evil-commands.el][private/default/+evil-commands.el]]). | command | key / ex command | description | |---------------------------+----------------------------+------------------------------------------------------------| diff --git a/modules/tools/neotree/README.org b/modules/tools/neotree/README.org index 280a97c3d..efbf410c1 100644 --- a/modules/tools/neotree/README.org +++ b/modules/tools/neotree/README.org @@ -1,7 +1,9 @@ #+TITLE: :evil neotree -This module brings a side panel for browsing project files, inspired by vim's NERDTree. +This module brings a side panel for browsing project files, inspired by vim's +NERDTree. #+begin_quote -Sure, there's dired and projectile, but sometimes I'd like a bird's eye view of a project. +Sure, there's dired and projectile, but sometimes I'd like a bird's eye view of +a project. #+end_quote From 1ebc4c9594a39c3ca8a99e9e64aecb52feaf625c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 13:23:08 -0500 Subject: [PATCH 133/145] lang/cc: fix irony-mode complaining in non-C modes, like php-mode --- modules/lang/cc/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 369b874cc..f5b61e172 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -110,7 +110,11 @@ compilation database is present in the project.") :after cc-mode :commands irony-install-server :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) - :hook ((c-mode c++-mode objc-mode) . irony-mode) + :init + (defun +cc|init-irony-mode () + (when (memq major-mode '(c-mode c++-mode objc-mode)) + (irony-mode +1))) + (add-hook! (c-mode c++-mode objc-mode) #'+cc|init-irony-mode) :config (unless (file-directory-p irony-server-install-prefix) (warn "irony-mode: server isn't installed; run M-x irony-install-server")) From 14f310e199b7675bb506dd9fe52699fbeefb0260 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:11:00 -0500 Subject: [PATCH 134/145] Fix some file-templates not being inserted Because yas--lookup-snippet-1 uses the template's description, rather than its trigger key as its lookup key. Doom expects it the other way around, which is the case when a file template doesn't define a name: in the snippet. --- modules/feature/file-templates/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 72c4dcc40..857a4f9d6 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -29,7 +29,10 @@ (unless yas-minor-mode (yas-minor-mode-on)) (when (and yas-minor-mode - (yas-expand-snippet (yas-lookup-snippet key mode t)) + (yas-expand-snippet + (yas--template-content + (cl-find key (yas--all-templates (yas--get-snippet-tables mode)) + :key #'yas--template-key :test #'equal))) (and (featurep 'evil) evil-mode) (and yas--active-field-overlay (overlay-buffer yas--active-field-overlay) From ff13fb854a8ccdaf6a7e8b1a3007dd63fd918ea7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:14:06 -0500 Subject: [PATCH 135/145] Fix file template for Doom module readmes --- modules/feature/file-templates/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 857a4f9d6..db8feaafe 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -68,7 +68,6 @@ ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+\\.el$" "__doom-module" emacs-lisp-mode) ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/packages\\.el$" "__doom-packages" emacs-lisp-mode) ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/test/.+\\.el$" "__doom-test" emacs-lisp-mode) - ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/README\\.org$" "__doom-readme" org-mode) (snippet-mode "__" snippet-mode) ;; Go ("\\.go$" "__.go" go-mode) @@ -91,7 +90,8 @@ ;; Markdown ("\\.md$" "__" markdown-mode) ;; Org - ("\\.org$" "__" org-mode) + ("\\.org$" "__" org-mode) + ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/README\\.org$" "__doom-readme" org-mode) ;; PHP ("\\.php$" "__" php-mode) ("\\.class\\.php$" "__.class.php" php-mode) From dcfa05da116d201bb7e4bdaabdd307c8014da867 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:17:02 -0500 Subject: [PATCH 136/145] lang/org: wrap smartparens config in after! --- modules/lang/org/config.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c249d3063..1f0096f43 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -90,12 +90,13 @@ unfold to point on startup." (sp--looking-at-p "\\s-*]"))) ;; make delimiter auto-closing a little more conservative - (sp-with-modes 'org-mode - (sp-local-pair "*" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-at-bol-p)) - (sp-local-pair "_" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) - (sp-local-pair "/" nil :unless '(sp-point-after-word-p sp-point-before-word-p +org-sp-point-in-checkbox-p)) - (sp-local-pair "~" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) - (sp-local-pair "=" nil :unless '(sp-point-after-word-p sp-point-before-word-p)))) + (after! smartparens + (sp-with-modes 'org-mode + (sp-local-pair "*" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-at-bol-p)) + (sp-local-pair "_" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) + (sp-local-pair "/" nil :unless '(sp-point-after-word-p sp-point-before-word-p +org-sp-point-in-checkbox-p)) + (sp-local-pair "~" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) + (sp-local-pair "=" nil :unless '(sp-point-after-word-p sp-point-before-word-p))))) (defun +org|enable-auto-reformat-tables () "Realign tables exiting insert mode (`evil-mode')." From 3708d76f51d581f09744886913ffa4e6d1499c85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:17:22 -0500 Subject: [PATCH 137/145] feature/snippets: use default yas-snippet-dirs (harmless) This is often overwritten by other modules anyway. --- modules/feature/snippets/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 89726f926..68c1a9a97 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -11,8 +11,6 @@ (defvar yas-minor-mode-map (make-sparse-keymap)) :init - (setq yas-snippet-dirs '(yas-installed-snippets-dir)) - ;; Ensure `yas-reload-all' is called as late as possible. Other modules could ;; have additional configuration for yasnippet. For example, file-templates. (add-transient-hook! 'yas-minor-mode-hook (yas-reload-all)) From fd11f958f949638a9aca36bc5d21ffe1ad06cbd5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:30:22 -0500 Subject: [PATCH 138/145] Move doom*quit-window to core-editor --- core/core-editor.el | 6 ++++++ core/core-ui.el | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 929e02cba..96de4e8ab 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -58,6 +58,12 @@ modes are active and the buffer is read-only.") (ignore (bury-buffer)))) (add-hook 'kill-buffer-query-functions #'doom|dont-kill-scratch-buffer) +;; temporary windows often have q bound to `quit-window', which only buries the +;; contained buffer. I rarely don't want that buffer killed, so... +(defun doom*quit-window (orig-fn &optional kill window) + (funcall orig-fn (not kill) window)) +(advice-add #'quit-window :around #'doom*quit-window) + (defun doom|check-large-file () "Check if the buffer's file is large (see `doom-large-file-size'). If so, ask for confirmation to open it literally (read-only, disabled undo and in diff --git a/core/core-ui.el b/core/core-ui.el index e4728f3c4..4ddd15dbd 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -236,12 +236,6 @@ instead)." (add-hook! doom-post-init (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers)) -;; temporary windows often have q bound to `quit-window', which only buries the -;; contained buffer. I rarely don't want that buffer killed, so... -(defun doom*quit-window (orig-fn &optional kill window) - (funcall orig-fn (not kill) window)) -(advice-add #'quit-window :around #'doom*quit-window) - ;; ;; Plugins From c9a878a62ff2ec22b11d439acbd3eef194f012e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:59:30 -0500 Subject: [PATCH 139/145] Conform unit test macros to naming scheme --- core/autoload/test.el | 22 +++++++++++----------- modules/lang/org/test/autoload-org.el | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 20c092798..e41cd424c 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -82,7 +82,7 @@ If neither is available, run all tests in all enabled modules." (setq body `((ert-skip nil) ,@body))) (when-let* ((modes (doom-enlist (plist-get plist :minor-mode)))) (dolist (mode modes) - (setq body `((with-minor-mode! ,mode ,@body))))) + (setq body `((with-minor-mode!! ,mode ,@body))))) (when-let* ((before (plist-get plist :before))) (setq body `(,@before ,@body))) (when-let* ((after (plist-get plist :after))) @@ -99,7 +99,7 @@ If neither is available, run all tests in all enabled modules." (save-window-excursion ,@body)))))) -(defmacro should-buffer! (initial expected &rest body) +(defmacro should-buffer!! (initial expected &rest body) "Test that a buffer with INITIAL text, run BODY, then test it against EXPECTED. INITIAL will recognize cursor markers in the form {[0-9]}. A {0} marker marks @@ -127,7 +127,7 @@ against." (lambda (m1 m2) (< (marker-position m1) (marker-position m2)))) (when (equal (caar marker-list) "0") - (goto-char! 0))) + (goto-char!! 0))) ,@body (let ((result-text (buffer-substring-no-properties (point-min) (point-max))) (point (point)) @@ -145,20 +145,20 @@ against." (should (equal expected-text result-text)) (should same-point))))))) -(defmacro goto-char! (index) - "Meant to be used with `should-buffer!'. Will move the cursor to one of the -cursor markers. e.g. Go to marker {2} with (goto-char! 2)." - `(goto-char (point! ,index))) +(defmacro goto-char!! (index) + "Meant to be used with `should-buffer!!'. Will move the cursor to one of the +cursor markers. e.g. Go to marker {2} with (goto-char!! 2)." + `(goto-char (point!! ,index))) -(defmacro point! (index) - "Meant to be used with `should-buffer!'. Returns the position of a cursor -marker. e.g. {2} can be retrieved with (point! 2)." +(defmacro point!! (index) + "Meant to be used with `should-buffer!!'. Returns the position of a cursor +marker. e.g. {2} can be retrieved with (point!! 2)." `(cdr (assoc ,(cond ((numberp index) (number-to-string index)) ((symbolp index) (symbol-name index)) ((stringp index) index)) marker-list))) -(defmacro with-minor-mode! (mode &rest body) +(defmacro with-minor-mode!! (mode &rest body) "TODO" (declare (indent defun)) `(progn (,mode +1) diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el index bbcb0cebf..567f1abcf 100644 --- a/modules/lang/org/test/autoload-org.el +++ b/modules/lang/org/test/autoload-org.el @@ -2,7 +2,7 @@ ;;; lang/org/test/autoload-org.el (defmacro should-org-buffer!! (source expected &rest body) - `(should-buffer! ,source ,expected + `(should-buffer!! ,source ,expected (org-mode) ,@body)) From 2b56fe081cbafe390b405bd9e0594e0a561f25fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:59:42 -0500 Subject: [PATCH 140/145] Improve docstring for doom-real-buffer-functions --- core/autoload/buffers.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 67016cb2d..83369cd4c 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -4,7 +4,10 @@ ;;;###autoload (defvar doom-real-buffer-functions '() - "A list of functions that are run to determine if a buffer is real.") + "A list of predicate functions run to determine if a buffer is real. These +functions are iterated over with one argument, the buffer in question. If any +function returns non-nil, the procession stops and the buffer is qualified as +real.") ;;;###autoload (defvar-local doom-real-buffer-p nil From 8134c49ec36ea29c5db4bbe180b174bb958e38cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 16:59:59 -0500 Subject: [PATCH 141/145] ibuffer-use-other-window = t (hand off to popup system) Addresses #309 --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 4ddd15dbd..ecf053cae 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -50,6 +50,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") max-mini-window-height 0.3 mode-line-default-help-echo nil ; disable mode-line mouseovers mouse-yank-at-point t ; middle-click paste at point, not at click + ibuffer-use-other-window t resize-mini-windows 'grow-only ; Minibuffer resizing show-help-function nil ; hide :help-echo text split-width-threshold 160 ; favor horizontal splits From f1ebda6c6fde05dfe03a15c745905ebbd8884d65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 17:01:35 -0500 Subject: [PATCH 142/145] Update changelog --- CHANGELOG.org | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.org b/CHANGELOG.org index cd25ff97b..ce6b4c018 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -41,16 +41,27 @@ causing load order errors. This is because the ~hash-table-values~ function in Emacs 25 and under uses ~maphash~, which reverses the hash-table, while newer versions use ~cl-loop~, which doesn't. + + =core-packages= Fix ~doom//*~ not running from the correct + default-directory, causing errors. + =core-ui= Fix cryptic missing-font errors (also, they are warnings now). + =core-ui= Account for Emacs 26 line numbers when calculating ~visual-fill-column-width~. + + =core-editor= the =KILL= argument for ~quit-window &optional KILL WINDOW~ + has been flipped and now kills the window's buffer by default. + =core-projects= Add ~doom-project-find-file~ and ~doom-project-browse~ for interactively fuzzy-finding and opening files in a directory/project. + + Add ~doom/info~ command for collecting information about your system and + session and puts it in the clipboard. This is to make it easier for those + reporting bugs to easily include it. + + Fix ibuffer windows not being handed off to popup system (see [[https://github.com/hlissner/doom-emacs/issues/309][#309]]). + =feature= - + =file-templates= Add a file template for fish shell scripts (thanks to - [[https://github.com/amosbird][amosbird]]). + + =file-templates= + + Add a file template for fish shell scripts (thanks to [[https://github.com/amosbird][amosbird]]). + + Fix some file templates not being inserted, like module README.org files. + =version-control= When evil-mode is available, start git commit message buffers in insert mode (see [[https://github.com/hlissner/doom-emacs/issues/300][#300]]). + + =jump= Always prompt for provider when no major-mode specific online jumper + is defined (for ~+jump/online~ and ~+jump/documentation~). + =ui= + =doom-dashboard= + Fix ~whitespace-mode~ and ~show-trailing-whitespace~ turning the dashboard @@ -74,6 +85,7 @@ + The ~+cc-include-paths~ and ~+cc-compiler-options~ options have been renamed to ~+cc-default-include-paths~ and ~+cc-default-compiler-options~ for clarity. + + Fix irony-mode complaining when it is enabled in non-C major-modes. + =org= + Change repo source for org-plus-contrib to emacsmirror. + Fix ~+org-dir~ being resolved too soon, robbing the user of the From f646c969e7dd77d603b43b0667953751acfec8ed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 21:16:36 -0500 Subject: [PATCH 143/145] Fix doom module file templates when emacs.d is a symlink --- .../file-templates/templates/emacs-lisp-mode/__doom-module | 2 +- .../file-templates/templates/emacs-lisp-mode/__doom-packages | 2 +- .../file-templates/templates/emacs-lisp-mode/__doom-test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-module b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-module index d2e44ba28..4f5468293 100644 --- a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-module +++ b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-module @@ -1,3 +1,3 @@ -;;; `(file-relative-name buffer-file-name doom-modules-dir)` -*- lexical-binding: t; -*- +;;; `(file-relative-name buffer-file-truename doom-modules-dir)` -*- lexical-binding: t; -*- $0 diff --git a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-packages b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-packages index 789b9b983..a87f1eae8 100644 --- a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-packages +++ b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-packages @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; `(file-relative-name buffer-file-name doom-modules-dir)` +;;; `(file-relative-name buffer-file-truename doom-modules-dir)` $0 diff --git a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-test b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-test index 9cd77f6ac..af428094a 100644 --- a/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-test +++ b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-test @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; `(file-relative-name buffer-file-name doom-modules-dir)` +;;; `(file-relative-name buffer-file-truename doom-modules-dir)` $0 \ No newline at end of file From 41388f78afa030ca8960e06148785d716c6ac894 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 21:19:49 -0500 Subject: [PATCH 144/145] tools/neotree: refresh pane when jumping to it --- modules/tools/neotree/autoload.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/tools/neotree/autoload.el b/modules/tools/neotree/autoload.el index 3a3c87ee9..c24ebe1ff 100644 --- a/modules/tools/neotree/autoload.el +++ b/modules/tools/neotree/autoload.el @@ -9,13 +9,15 @@ (require 'neotree) (cond ((and (neo-global--window-exists-p) (get-buffer-window neo-buffer-name t)) - (neotree-find path project-root)) + (neotree-find path project-root) + (neotree-refresh)) ((not (and (neo-global--window-exists-p) (equal (file-truename (neo-global--with-buffer neo-buffer--start-node)) (file-truename project-root)))) (neotree-dir project-root) (neotree-find path project-root)) - (t (neotree-find path project-root))))) + (t + (neotree-find path project-root))))) ;;;###autoload (defun +neotree/collapse-or-up () From 2c7c9c6d94529f23aad4602e27d279e299c81425 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 21:20:49 -0500 Subject: [PATCH 145/145] v2.0.9 bump --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 525da5787..fbcc2348d 100644 --- a/core/core.el +++ b/core/core.el @@ -18,7 +18,7 @@ ;; Autoloaded functions are in core/autoload/*.el and modules/*/*/autoload.el or ;; modules/*/*/autoload/*.el. -(defvar doom-version "2.0.8" +(defvar doom-version "2.0.9" "Current version of DOOM emacs.") (defvar doom-debug-mode (or (getenv "DEBUG") init-file-debug)